contextfree-3.0.5+dfsg1.orig/0000755000175000017500000000000012245646004014433 5ustar brambramcontextfree-3.0.5+dfsg1.orig/README.ffmpeg0000644000175000017500000000464212076364074016572 0ustar brambram*** Context Free *** version 3.0 by Chris Coyne, John Horigan and Mark Lentczner Context Free Copyright 2012 John Horigan ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ DISTRIBUTION & LICENSE Context Free is released under the GNU license. Context Free is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ The Windows and Linux builds of Context Free/cfdg use FFmpeg 1.0 to generate Quicktime animation output. Ealier or later versions of ffmpeg may not work as the FFmpeg API is a moving target. Building the libraries: 1) Get a cross-compiling build toolchain: FFmpeg can only be built using gcc. You must have a cross-compiling toolchain installed to make Windows libaries. There is an excellent script at http://ffmpeg.zeranoe.com/forum/viewforum.php?f=2 that can create from scratch win32 and win64 toolchains in Linux or Cygwin. 2) Install the FFmpeg source at ~/ffmpeg. 3) Create a build directory, cd into it, and execute the build script make_ffmpeg_win32, or make_ffmpeg_win64, or make_ffmpeg_linux. The libraries and include files will be installed at ~/software/packages/win32 or ~/software/packages/win64 or ~/software/packages/linux. 4) Copy the include files to src-ffmpeg/include and the libraries to src-ffmpeg/lib or src-ffmpeg/lib32 or src-ffmpeg/lib64 in the Context Free source tree. Not building the libraries: cfdg has the option of dropping support for the Quicktime movie format and only supporting individual PNG files for animation frames. This removes the need to build the FFmpeg libraries. Some changes to the Makefile are required: 1) Comment out COMMON_SRCS += ffCanvas.cpp 2) Uncomment out COMMON_SRCS += ffCanvasDummy.cpp 3) Comment out LIBS += avformat avcodec avutil 4) make clean && make contextfree-3.0.5+dfsg1.orig/LICENSE.txt0000644000175000017500000004313312076364074016270 0ustar brambram GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. contextfree-3.0.5+dfsg1.orig/.hgcheck/0000755000175000017500000000000012245646004016105 5ustar brambramcontextfree-3.0.5+dfsg1.orig/.hgcheck/hg-checklink-wIDpL90000777000175000017500000000000012076364074021510 2.ustar brambramcontextfree-3.0.5+dfsg1.orig/.hgignore0000644000175000017500000000207012076364074016243 0ustar brambramsyntax: regexp # Boring file regexps: \.hi$ \.o$ (^|/)CVS($|/) (^|/)RCS($|/) ~$ #(^|/)\.[^/] (^|/)_darcs($|/) \.bak$ \.BAK$ \.orig$ (^|/)vssver\.scc$ \.swp$ (^|/)MT($|/) (^|/)\{arch\}($|/) (^|/).arch-ids($|/) (^|/), \.class$ \.prof$ (^|/)\.DS_Store$ (^|/)BitKeeper($|/) (^|/)ChangeSet($|/) (^|/)\.svn($|/) \.py[co]$ \# \.cvsignore$ \.gdb_history$ ### Mark's additions ### # Xcode build ^build$ ^build/ # Xcode user files \.mode1$ \.pbxuser$ \.mode1v3$ \.mode2v3$ # Silly thing ^cfdg-orig/help_src/gen$ # Editor backups ~$ ~\. # Finder caches \.DS_Store$ ### John's Additions ### ^cfdg$ ^output$ ^output/ \.mch$ \.exe$ \.dll$ \.ncb$ \.sdf$ \.opensdf$ \.opt$ \.old$ \.plg$ \.aps$ \.manifest$ \.ipch$ #VC++ Build Directories ^ContextFree_Data$ ^ContextFree_Data/ (^|/)Debug($|/) (^|/)Debug64($|/) (^|/)debug($|/) (^|/)Release($|/) (^|/)Release64($|/) (^|/)release($|/) (^|/)obj($|/) (^|/)bin($|/) ^ContextFree___Win32_ReleaseANSI$ ^ContextFree___Win32_ReleaseANSI/ ^ContextFree___Win32_DebugANSI$ ^ContextFree___Win32_DebugANSI/ /Thumbs.db$ ^objs$ ^objs/ \.suo$ \.user$ xcuserdatad/ contextfree-3.0.5+dfsg1.orig/Makefile0000644000175000017500000000576012076364074016111 0ustar brambram all: cfdg # # Dirs # OBJ_DIR = objs COMMON_DIR = src-common UNIX_DIR = src-unix DERIVED_DIR = $(OBJ_DIR) AGG_DIR = src-agg FFMPEG_DIR = src-ffmpeg SRC_DIRS = $(COMMON_DIR) $(UNIX_DIR) $(DERIVED_DIR) $(AGG_DIR)/src vpath %.cpp $(SRC_DIRS) INC_DIRS = $(COMMON_DIR) $(UNIX_DIR) $(DERIVED_DIR) $(AGG_DIR)/include $(COMMON_DIR)/agg-extras $(FFMPEG_DIR)/include # # Library directories for FFmpeg and libpng # LIB_DIRS = $(FFMPEG_DIR)/lib /usr/local/lib # # Sources and Objects # COMMON_SRCS = cfdg.cpp Rand64.cpp makeCFfilename.cpp \ cfdgimpl.cpp renderimpl.cpp builder.cpp shape.cpp \ variation.cpp countable.cpp tempfile.cpp \ aggCanvas.cpp HSBColor.cpp SVGCanvas.cpp \ primShape.cpp bounds.cpp shape.cpp shapeSTL.cpp tiledCanvas.cpp \ astexpression.cpp astreplacement.cpp pathIterator.cpp \ stacktype.cpp CmdInfo.cpp abstractPngCanvas.cpp ast.cpp UNIX_SRCS = pngCanvas.cpp posixSystem.cpp main.cpp posixTimer.cpp \ posixVersion.cpp DERIVED_SRCS = lex.yy.cpp cfdg.tab.cpp AGG_SRCS = agg_trans_affine.cpp agg_curves.cpp agg_vcgen_contour.cpp \ agg_vcgen_stroke.cpp agg_bezier_arc.cpp agg_color_rgba.cpp LIBS = stdc++ png z m # # FFmpeg support # # Comment out these lines to disable FFmpeg support # COMMON_SRCS += ffCanvas.cpp LIBS += avformat avcodec avutil # # Uncomment out this line to disable FFmpeg support # # COMMON_SRCS += ffCanvasDummy.cpp SRCS = $(COMMON_SRCS) $(UNIX_SRCS) $(DERIVED_SRCS) $(AGG_SRCS) OBJS = $(patsubst %.cpp,$(OBJ_DIR)/%.o,$(SRCS)) DEPS = $(patsubst %.o,%.d,$(OBJS)) LINKFLAGS += $(patsubst %,-L%,$(LIB_DIRS)) LINKFLAGS += $(patsubst %,-l%,$(LIBS)) LINKFLAGS += -fexceptions deps: $(OBJ_DIR) $(DEPS) include $(DEPS) $(OBJS): $(OBJ_DIR)/Sentry # # Executable # # Under Mac OS X replace $(LINK.o) with g++. # Under Cygwin replace strip $@ with strip $@.exe cfdg: $(OBJS) $(LINK.o) $^ $(LINKFLAGS) -o $@ strip $@ # # Derived # $(DERIVED_DIR)/lex.yy.cpp: $(COMMON_DIR)/cfdg.l flex -o $@ $^ $(DERIVED_DIR)/cfdg.tab.hpp: $(DERIVED_DIR)/cfdg.tab.cpp $(DERIVED_DIR)/cfdg.tab.cpp: $(COMMON_DIR)/cfdg.ypp bison -o $(DERIVED_DIR)/cfdg.tab.cpp $(COMMON_DIR)/cfdg.ypp $(OBJ_DIR)/lex.yy.o: $(DERIVED_DIR)/cfdg.tab.hpp # # Utility # clean : rm -f $(OBJ_DIR)/* rm -f cfdg distclean: clean rmdir $(OBJ_DIR) $(OBJ_DIR)/Sentry : mkdir -p $(OBJ_DIR) 2> /dev/null || true touch $@ # # Tests # RTEST_CFDG = input/rendering-tests.cfdg OUTPUT_DIR = output rtests: $(OUTPUT_DIR)/rtest-700.png $(OUTPUT_DIR)/rtest-2k.png $(OUTPUT_DIR)/rtest-700.png: cfdg $(RTEST_CFDG) ./cfdg -s 700 $(RTEST_CFDG) $@ $(OUTPUT_DIR)/rtest-2k.png: cfdg $(RTEST_CFDG) ./cfdg -s 2000 $(RTEST_CFDG) $@ # # Rules # CPPFLAGS += $(patsubst %,-I%,$(INC_DIRS)) CPPFLAGS += -O3 -Wall -march=native -Wno-parentheses #CPPFLAGS += -ggdb $(OBJ_DIR)/%.o : %.cpp $(COMPILE.cpp) $(OUTPUT_OPTION) $< $(OBJ_DIR)/%.d : %.cpp mkdir -p $(OBJ_DIR) 2> /dev/null || true set -e; $(COMPILE.cpp) -MM $< \ | sed 's,\(.*\.o\)\( *:\),$(OBJ_DIR)/\1 $@\2,g' > $@; \ [ -s $@ ] || rm -f $@ $(OBJ_DIR)/cfdg.tab.d: $(OBJ_DIR)/lex.yy.d: contextfree-3.0.5+dfsg1.orig/Context Free.xcodeproj/0000755000175000017500000000000012245646004020715 5ustar brambramcontextfree-3.0.5+dfsg1.orig/Context Free.xcodeproj/xcshareddata/0000755000175000017500000000000012245646004023350 5ustar brambramcontextfree-3.0.5+dfsg1.orig/Context Free.xcodeproj/xcshareddata/xcschemes/0000755000175000017500000000000012245646004025332 5ustar brambramcontextfree-3.0.5+dfsg1.orig/Context Free.xcodeproj/xcshareddata/xcschemes/cfdg.xcscheme0000644000175000017500000001054612076364074027772 0ustar brambram contextfree-3.0.5+dfsg1.orig/Context Free.xcodeproj/xcshareddata/xcschemes/Context Free.xcscheme0000644000175000017500000000714712076364074031360 0ustar brambram contextfree-3.0.5+dfsg1.orig/Context Free.xcodeproj/project.pbxproj0000644000175000017500000025162712076364074024014 0ustar brambram// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 46; objects = { /* Begin PBXBuildFile section */ 520EC5F60A0C61DC00853FF3 /* i_polygons.cfdg in CopyFiles */ = {isa = PBXBuildFile; fileRef = 520EC5C00A0C3BA800853FF3 /* i_polygons.cfdg */; }; 52100A7F0D3A9F1800F7070D /* Rand64.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 52100A7E0D3A9F1800F7070D /* Rand64.cpp */; }; 521F8125105607F10096D22C /* agg_color_rgba.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 521F8124105607F10096D22C /* agg_color_rgba.cpp */; }; 5226EFAE1071BB7600A30CC3 /* BitmapImageHolder.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5226EFAD1071BB7600A30CC3 /* BitmapImageHolder.mm */; }; 523311110CF7F6260087307A /* agg_curves.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5233110E0CF7F6260087307A /* agg_curves.cpp */; }; 523311120CF7F6260087307A /* agg_vcgen_contour.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5233110F0CF7F6260087307A /* agg_vcgen_contour.cpp */; }; 523311130CF7F6260087307A /* agg_vcgen_stroke.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 523311100CF7F6260087307A /* agg_vcgen_stroke.cpp */; }; 524464E709BAAD5C007E722B /* primShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 524464E509BAAD5C007E722B /* primShape.cpp */; }; 524D22B513BA0123002732C2 /* aggCanvas.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FD2D472308411CB600697CE7 /* aggCanvas.cpp */; }; 524D22B613BA0123002732C2 /* astexpression.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 526BCBBC10F5C12D003357E9 /* astexpression.cpp */; }; 524D22B713BA0123002732C2 /* astreplacement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 526BCBD810F5C425003357E9 /* astreplacement.cpp */; }; 524D22B813BA0123002732C2 /* bounds.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FD82AA2709CC8CC000529D7B /* bounds.cpp */; }; 524D22B913BA0123002732C2 /* builder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FD3A51AE09A7DAE300BBCD6E /* builder.cpp */; }; 524D22BA13BA0123002732C2 /* cfdg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FD1EF08B0811ADE500FD38C6 /* cfdg.cpp */; }; 524D22BB13BA0123002732C2 /* cfdg.l in Sources */ = {isa = PBXBuildFile; fileRef = FD1EF08D0811ADE500FD38C6 /* cfdg.l */; }; 524D22BC13BA0123002732C2 /* cfdg.ypp in Sources */ = {isa = PBXBuildFile; fileRef = 529049A10F3E4CC900484FED /* cfdg.ypp */; }; 524D22BD13BA0123002732C2 /* cfdgimpl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FD3A51C309A7DEF500BBCD6E /* cfdgimpl.cpp */; }; 524D22BE13BA0123002732C2 /* CmdInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5276AA9813776AE1000FA1AB /* CmdInfo.cpp */; }; 524D22BF13BA0123002732C2 /* countable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FD82F7A409A4C34700D5C038 /* countable.cpp */; }; 524D22C013BA0123002732C2 /* HSBColor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FD32F9B70892E2CA00DB40F4 /* HSBColor.cpp */; }; 524D22C113BA0123002732C2 /* pathIterator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 527FE237135ABF2400F9B15F /* pathIterator.cpp */; }; 524D22C213BA0123002732C2 /* primShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 524464E509BAAD5C007E722B /* primShape.cpp */; }; 524D22C313BA0123002732C2 /* Rand64.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 52100A7E0D3A9F1800F7070D /* Rand64.cpp */; }; 524D22C413BA0123002732C2 /* renderimpl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FD3A51CD09A7FC3000BBCD6E /* renderimpl.cpp */; }; 524D22C513BA0123002732C2 /* shape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FD3A51B809A7DD2F00BBCD6E /* shape.cpp */; }; 524D22C613BA0123002732C2 /* shapeSTL.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FD82A9D909CB901B00529D7B /* shapeSTL.cpp */; }; 524D22C713BA0123002732C2 /* stacktype.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5276ACE8137A513B000FA1AB /* stacktype.cpp */; }; 524D22C813BA0123002732C2 /* SVGCanvas.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FDA77E6B099C669E00EBA6BD /* SVGCanvas.cpp */; }; 524D22C913BA0123002732C2 /* tempfile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FD82F7B209A4C49400D5C038 /* tempfile.cpp */; }; 524D22CA13BA0123002732C2 /* tiledCanvas.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 52FB6B9309ECB8A20008CE6E /* tiledCanvas.cpp */; }; 524D22CB13BA0123002732C2 /* upload.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FD879EE60B64191700FF6959 /* upload.cpp */; }; 524D22CC13BA0123002732C2 /* variation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FDA4E5B10831DF3D00460DCE /* variation.cpp */; }; 524D22CD13BA0145002732C2 /* agg_bezier_arc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 528D3E8E0CEAC3D20022E4F1 /* agg_bezier_arc.cpp */; }; 524D22CE13BA0145002732C2 /* agg_color_rgba.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 521F8124105607F10096D22C /* agg_color_rgba.cpp */; }; 524D22CF13BA0145002732C2 /* agg_curves.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5233110E0CF7F6260087307A /* agg_curves.cpp */; }; 524D22D013BA0145002732C2 /* agg_trans_affine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FD2D477A08411FB600697CE7 /* agg_trans_affine.cpp */; }; 524D22D113BA0145002732C2 /* agg_vcgen_contour.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5233110F0CF7F6260087307A /* agg_vcgen_contour.cpp */; }; 524D22D213BA0145002732C2 /* agg_vcgen_stroke.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 523311100CF7F6260087307A /* agg_vcgen_stroke.cpp */; }; 524D22E313BA0200002732C2 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 524D22DC13BA0200002732C2 /* main.cpp */; }; 524D22E413BA0200002732C2 /* pngCanvas.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 524D22DD13BA0200002732C2 /* pngCanvas.cpp */; }; 524D22E513BA0200002732C2 /* posixSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 524D22DF13BA0200002732C2 /* posixSystem.cpp */; }; 524D22E613BA0200002732C2 /* posixTimer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 524D22E113BA0200002732C2 /* posixTimer.cpp */; }; 524D22E713BA0200002732C2 /* posixVersion.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 524D22E213BA0200002732C2 /* posixVersion.cpp */; }; 524D22FE13BA0661002732C2 /* makeCFfilename.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 524D22FC13BA0661002732C2 /* makeCFfilename.cpp */; }; 526347621135AEC4005A96CF /* KFSplitView.m in Sources */ = {isa = PBXBuildFile; fileRef = 526347611135AEC4005A96CF /* KFSplitView.m */; }; 526BCBBD10F5C12D003357E9 /* astexpression.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 526BCBBC10F5C12D003357E9 /* astexpression.cpp */; }; 526BCBD910F5C425003357E9 /* astreplacement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 526BCBD810F5C425003357E9 /* astreplacement.cpp */; }; 527631520D7B490B00F0F7C8 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 527631510D7B490B00F0F7C8 /* WebKit.framework */; }; 527631940D7B5D2D00F0F7C8 /* widgetform.html in Resources */ = {isa = PBXBuildFile; fileRef = 527631930D7B5D2D00F0F7C8 /* widgetform.html */; }; 527631990D7B63A000F0F7C8 /* widget-style.css in Resources */ = {isa = PBXBuildFile; fileRef = 527631980D7B63A000F0F7C8 /* widget-style.css */; }; 5276AA9913776AE1000FA1AB /* CmdInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5276AA9813776AE1000FA1AB /* CmdInfo.cpp */; }; 5276ACE9137A513B000FA1AB /* stacktype.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5276ACE8137A513B000FA1AB /* stacktype.cpp */; }; 527FE238135ABF2400F9B15F /* pathIterator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 527FE237135ABF2400F9B15F /* pathIterator.cpp */; }; 528D3E8F0CEAC3D20022E4F1 /* agg_bezier_arc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 528D3E8E0CEAC3D20022E4F1 /* agg_bezier_arc.cpp */; }; 529049A30F3E4CC900484FED /* cfdg.ypp in Sources */ = {isa = PBXBuildFile; fileRef = 529049A10F3E4CC900484FED /* cfdg.ypp */; }; 529CC95715A393820079C2B5 /* ffCanvasDummy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 529CC95615A393820079C2B5 /* ffCanvasDummy.cpp */; }; 52BA888B155F30490026AF04 /* ast.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 52BA888A155F30490026AF04 /* ast.cpp */; }; 52BA888C155F30490026AF04 /* ast.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 52BA888A155F30490026AF04 /* ast.cpp */; }; 52C267B8154F26BD00230EB9 /* abstractPngCanvas.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 52C267B7154F26BD00230EB9 /* abstractPngCanvas.cpp */; }; 52E94E9913650A2E00BB2D96 /* QTKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 52E94E9813650A2E00BB2D96 /* QTKit.framework */; }; 52E94EAE13650C5C00BB2D96 /* qtCanvas.mm in Sources */ = {isa = PBXBuildFile; fileRef = 52E94EAD13650C5C00BB2D96 /* qtCanvas.mm */; }; 52E950A41367D3B600BB2D96 /* QuickTime.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 52E950A31367D3B600BB2D96 /* QuickTime.framework */; }; 52FB6B9409ECB8A20008CE6E /* tiledCanvas.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 52FB6B9309ECB8A20008CE6E /* tiledCanvas.cpp */; }; 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; FD1EF0910811ADE500FD38C6 /* cfdg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FD1EF08B0811ADE500FD38C6 /* cfdg.cpp */; }; FD1EF0930811ADE500FD38C6 /* cfdg.l in Sources */ = {isa = PBXBuildFile; fileRef = FD1EF08D0811ADE500FD38C6 /* cfdg.l */; }; FD1EF0A50811AE1900FD38C6 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = FD1EF0990811AE1900FD38C6 /* InfoPlist.strings */; }; FD1EF0A60811AE1900FD38C6 /* MainMenu.nib in Resources */ = {isa = PBXBuildFile; fileRef = FD1EF09B0811AE1900FD38C6 /* MainMenu.nib */; }; FD1EF0A90811AE1900FD38C6 /* GView.mm in Sources */ = {isa = PBXBuildFile; fileRef = FD1EF0A00811AE1900FD38C6 /* GView.mm */; }; FD1EF0AB0811AE1900FD38C6 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = FD1EF0A20811AE1900FD38C6 /* main.m */; }; FD1EF0AC0811AE1900FD38C6 /* version.plist in Resources */ = {isa = PBXBuildFile; fileRef = FD1EF0A30811AE1900FD38C6 /* version.plist */; }; FD29F41E082732FA005B4B87 /* TopBar.mm in Sources */ = {isa = PBXBuildFile; fileRef = FD29F41C082732FA005B4B87 /* TopBar.mm */; }; FD2D472508411CB600697CE7 /* aggCanvas.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FD2D472308411CB600697CE7 /* aggCanvas.cpp */; }; FD2D477C08411FB600697CE7 /* agg_trans_affine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FD2D477A08411FB600697CE7 /* agg_trans_affine.cpp */; }; FD32F9B90892E2CA00DB40F4 /* HSBColor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FD32F9B70892E2CA00DB40F4 /* HSBColor.cpp */; }; FD32F9D30892EFE100DB40F4 /* ColorCalc.mm in Sources */ = {isa = PBXBuildFile; fileRef = FD32F9D10892EFE100DB40F4 /* ColorCalc.mm */; }; FD32FA2D08934E0900DB40F4 /* GrammarTextView.mm in Sources */ = {isa = PBXBuildFile; fileRef = FD32FA2B08934E0900DB40F4 /* GrammarTextView.mm */; }; FD32FA480894A0CC00DB40F4 /* rose.cfdg in CopyFiles */ = {isa = PBXBuildFile; fileRef = FD32FA470894A0CC00DB40F4 /* rose.cfdg */; }; FD3A51B009A7DAE300BBCD6E /* builder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FD3A51AE09A7DAE300BBCD6E /* builder.cpp */; }; FD3A51BA09A7DD2F00BBCD6E /* shape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FD3A51B809A7DD2F00BBCD6E /* shape.cpp */; }; FD3A51C509A7DEF500BBCD6E /* cfdgimpl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FD3A51C309A7DEF500BBCD6E /* cfdgimpl.cpp */; }; FD3A51CF09A7FC3000BBCD6E /* renderimpl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FD3A51CD09A7FC3000BBCD6E /* renderimpl.cpp */; }; FD3A534309AD3A5F00BBCD6E /* ImageCanvas.mm in Sources */ = {isa = PBXBuildFile; fileRef = FD3A534109AD3A5F00BBCD6E /* ImageCanvas.mm */; }; FD3C074408202C3C00693028 /* CFDGController.mm in Sources */ = {isa = PBXBuildFile; fileRef = FD3C074208202C3C00693028 /* CFDGController.mm */; }; FD3C084008234F8300693028 /* demo1.cfdg in CopyFiles */ = {isa = PBXBuildFile; fileRef = FD3C082D08234F8300693028 /* demo1.cfdg */; }; FD3C084108234F8300693028 /* demo2.cfdg in CopyFiles */ = {isa = PBXBuildFile; fileRef = FD3C082E08234F8300693028 /* demo2.cfdg */; }; FD3C084408234F8300693028 /* funky_flower.cfdg in CopyFiles */ = {isa = PBXBuildFile; fileRef = FD3C083108234F8300693028 /* funky_flower.cfdg */; }; FD3C084908234F8300693028 /* mtree.cfdg in CopyFiles */ = {isa = PBXBuildFile; fileRef = FD3C083608234F8300693028 /* mtree.cfdg */; }; FD3C084B08234F8300693028 /* quadcity.cfdg in CopyFiles */ = {isa = PBXBuildFile; fileRef = FD3C083808234F8300693028 /* quadcity.cfdg */; }; FD3C084D08234F8300693028 /* underground.cfdg in CopyFiles */ = {isa = PBXBuildFile; fileRef = FD3C083A08234F8300693028 /* underground.cfdg */; }; FD3C084F08234F8300693028 /* weighting_demo.cfdg in CopyFiles */ = {isa = PBXBuildFile; fileRef = FD3C083C08234F8300693028 /* weighting_demo.cfdg */; }; FD3C085008234F8300693028 /* welcome.cfdg in CopyFiles */ = {isa = PBXBuildFile; fileRef = FD3C083D08234F8300693028 /* welcome.cfdg */; }; FD570D2A08281415003F064D /* lesson.cfdg in CopyFiles */ = {isa = PBXBuildFile; fileRef = FD570D2908281415003F064D /* lesson.cfdg */; }; FD570D31082821B3003F064D /* i_curves.cfdg in CopyFiles */ = {isa = PBXBuildFile; fileRef = FD570D2F082821B3003F064D /* i_curves.cfdg */; }; FD570D32082821B3003F064D /* i_pix.cfdg in CopyFiles */ = {isa = PBXBuildFile; fileRef = FD570D30082821B3003F064D /* i_pix.cfdg */; }; FD782A8A082869F100910D5E /* HelpMenu.plist in Resources */ = {isa = PBXBuildFile; fileRef = FD782A89082869F100910D5E /* HelpMenu.plist */; }; FD782C43082A03ED00910D5E /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FD782C42082A03ED00910D5E /* SystemConfiguration.framework */; }; FD81610208146BF0009AB595 /* CFDGDocument.nib in Resources */ = {isa = PBXBuildFile; fileRef = FD81610008146BF0009AB595 /* CFDGDocument.nib */; }; FD81610808146C33009AB595 /* CFDGDocument.mm in Sources */ = {isa = PBXBuildFile; fileRef = FD81610608146C33009AB595 /* CFDGDocument.mm */; }; FD82A9DB09CB901B00529D7B /* shapeSTL.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FD82A9D909CB901B00529D7B /* shapeSTL.cpp */; }; FD82AA2909CC8CC000529D7B /* bounds.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FD82AA2709CC8CC000529D7B /* bounds.cpp */; }; FD82F7A609A4C34700D5C038 /* countable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FD82F7A409A4C34700D5C038 /* countable.cpp */; }; FD82F7B409A4C49400D5C038 /* tempfile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FD82F7B209A4C49400D5C038 /* tempfile.cpp */; }; FD879EE10B6418E700FF6959 /* GalleryUploader.nib in Resources */ = {isa = PBXBuildFile; fileRef = FD879EDF0B6418E700FF6959 /* GalleryUploader.nib */; }; FD879EE50B64190400FF6959 /* GalleryUploader.mm in Sources */ = {isa = PBXBuildFile; fileRef = FD879EE30B64190400FF6959 /* GalleryUploader.mm */; }; FD879EE80B64191700FF6959 /* upload.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FD879EE60B64191700FF6959 /* upload.cpp */; }; FD9BA8550832B56A00B9396F /* Credits.html in Resources */ = {isa = PBXBuildFile; fileRef = FD9BA8540832B56A00B9396F /* Credits.html */; }; FDA4E5B30831DF3D00460DCE /* variation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FDA4E5B10831DF3D00460DCE /* variation.cpp */; }; FDA77E6D099C669E00EBA6BD /* SVGCanvas.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FDA77E6B099C669E00EBA6BD /* SVGCanvas.cpp */; }; FDB2FA78081B696300901B0E /* VariationFormatter.mm in Sources */ = {isa = PBXBuildFile; fileRef = FDB2FA76081B696300901B0E /* VariationFormatter.mm */; }; FDB2FAF8081CD10A00901B0E /* app.icns in Resources */ = {isa = PBXBuildFile; fileRef = FDB2FAF7081CD10A00901B0E /* app.icns */; }; FDC5D4AC082433AF00B5990D /* UserDefaults.plist in Resources */ = {isa = PBXBuildFile; fileRef = FDC5D4AB082433AF00B5990D /* UserDefaults.plist */; }; FDCD3F10081E145E00D4A589 /* doc.icns in Resources */ = {isa = PBXBuildFile; fileRef = FDCD3F0F081E145E00D4A589 /* doc.icns */; }; FDD3B7C80839C7640022DE7B /* ciliasun.cfdg in CopyFiles */ = {isa = PBXBuildFile; fileRef = FDD3B7C00839C7640022DE7B /* ciliasun.cfdg */; }; FDD3B7C90839C7640022DE7B /* octopi.cfdg in CopyFiles */ = {isa = PBXBuildFile; fileRef = FDD3B7C10839C7640022DE7B /* octopi.cfdg */; }; FDD3B7CB0839C7640022DE7B /* sierpinski.cfdg in CopyFiles */ = {isa = PBXBuildFile; fileRef = FDD3B7C30839C7640022DE7B /* sierpinski.cfdg */; }; FDD3B7CC0839C7640022DE7B /* snowflake.cfdg in CopyFiles */ = {isa = PBXBuildFile; fileRef = FDD3B7C40839C7640022DE7B /* snowflake.cfdg */; }; FDD3B7CD0839C7640022DE7B /* tangle.cfdg in CopyFiles */ = {isa = PBXBuildFile; fileRef = FDD3B7C50839C7640022DE7B /* tangle.cfdg */; }; FDD3B7CE0839C7640022DE7B /* triples.cfdg in CopyFiles */ = {isa = PBXBuildFile; fileRef = FDD3B7C60839C7640022DE7B /* triples.cfdg */; }; FDD3B7CF0839C7640022DE7B /* ziggy.cfdg in CopyFiles */ = {isa = PBXBuildFile; fileRef = FDD3B7C70839C7640022DE7B /* ziggy.cfdg */; }; FDF15B2E0880C3EF0041D85B /* lesson2.cfdg in CopyFiles */ = {isa = PBXBuildFile; fileRef = FDF15B2D0880C3E60041D85B /* lesson2.cfdg */; }; /* End PBXBuildFile section */ /* Begin PBXBuildRule section */ 524D22EA13BA02B3002732C2 /* PBXBuildRule */ = { isa = PBXBuildRule; compilerSpec = com.apple.compilers.proxy.script; fileType = sourcecode.yacc; isEditable = 1; outputFiles = ( "${DERIVED_FILES_DIR}/cfdg.tab.cpp", "${DERIVED_FILES_DIR}/cfdg.tab.hpp", ); script = "/usr/local/bin/bison -o \"${DERIVED_FILES_DIR}/${INPUT_FILE_BASE}.tab.cpp\" \"${INPUT_FILE_PATH}\""; }; 524D22EB13BA0318002732C2 /* PBXBuildRule */ = { isa = PBXBuildRule; compilerSpec = com.apple.compilers.proxy.script; fileType = sourcecode.lex; isEditable = 1; outputFiles = ( "$(DERIVED_FILES_DIR)/lex.yy.cpp", ); script = "cd \"${DERIVED_FILES_DIR}\"\n/usr/local/bin/flex \"--outfile=${DERIVED_FILES_DIR}/lex.yy.cpp\" \"${INPUT_FILE_PATH}\""; }; 529049B90F3E9C9B00484FED /* PBXBuildRule */ = { isa = PBXBuildRule; compilerSpec = com.apple.compilers.proxy.script; fileType = sourcecode.lex; isEditable = 1; outputFiles = ( "$(DERIVED_FILES_DIR)/lex.yy.cpp", ); script = "cd \"${DERIVED_FILES_DIR}\"\n/usr/local/bin/flex \"--outfile=${DERIVED_FILES_DIR}/lex.yy.cpp\" \"${INPUT_FILE_PATH}\""; }; 529049BA0F3E9E0000484FED /* PBXBuildRule */ = { isa = PBXBuildRule; compilerSpec = com.apple.compilers.proxy.script; fileType = sourcecode.yacc; isEditable = 1; outputFiles = ( "$(DERIVED_FILES_DIR)/cfdg.tab.cpp", "$(DERIVED_FILES_DIR)/cfdg.tab.hpp", ); script = "/usr/local/bin/bison -o \"${DERIVED_FILES_DIR}/${INPUT_FILE_BASE}.tab.cpp\" \"${INPUT_FILE_PATH}\""; }; /* End PBXBuildRule section */ /* Begin PBXCopyFilesBuildPhase section */ FD3C081108234EFE00693028 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = Examples; dstSubfolderSpec = 7; files = ( FD32FA480894A0CC00DB40F4 /* rose.cfdg in CopyFiles */, FDD3B7C80839C7640022DE7B /* ciliasun.cfdg in CopyFiles */, FDD3B7CB0839C7640022DE7B /* sierpinski.cfdg in CopyFiles */, FDD3B7CC0839C7640022DE7B /* snowflake.cfdg in CopyFiles */, FDD3B7CD0839C7640022DE7B /* tangle.cfdg in CopyFiles */, FDD3B7CE0839C7640022DE7B /* triples.cfdg in CopyFiles */, FDD3B7CF0839C7640022DE7B /* ziggy.cfdg in CopyFiles */, FD570D31082821B3003F064D /* i_curves.cfdg in CopyFiles */, FD570D32082821B3003F064D /* i_pix.cfdg in CopyFiles */, 520EC5F60A0C61DC00853FF3 /* i_polygons.cfdg in CopyFiles */, FD3C084008234F8300693028 /* demo1.cfdg in CopyFiles */, FD3C084108234F8300693028 /* demo2.cfdg in CopyFiles */, FD3C084408234F8300693028 /* funky_flower.cfdg in CopyFiles */, FD3C084908234F8300693028 /* mtree.cfdg in CopyFiles */, FDD3B7C90839C7640022DE7B /* octopi.cfdg in CopyFiles */, FD3C084B08234F8300693028 /* quadcity.cfdg in CopyFiles */, FD3C084D08234F8300693028 /* underground.cfdg in CopyFiles */, FD3C084F08234F8300693028 /* weighting_demo.cfdg in CopyFiles */, FD3C085008234F8300693028 /* welcome.cfdg in CopyFiles */, ); runOnlyForDeploymentPostprocessing = 0; }; FDF15B260880C3AD0041D85B /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = Examples; dstSubfolderSpec = 7; files = ( FD570D2A08281415003F064D /* lesson.cfdg in CopyFiles */, FDF15B2E0880C3EF0041D85B /* lesson2.cfdg in CopyFiles */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; 29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; 5205AE8C14455E4C00245A6F /* version.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = version.h; path = "src-common/version.h"; sourceTree = ""; }; 520EC5C00A0C3BA800853FF3 /* i_polygons.cfdg */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = i_polygons.cfdg; sourceTree = ""; }; 52100A7D0D3A9F1800F7070D /* Rand64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Rand64.h; sourceTree = ""; }; 52100A7E0D3A9F1800F7070D /* Rand64.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Rand64.cpp; sourceTree = ""; }; 521B94EB0BA507B800BD9A09 /* agg_pixfmt_rgb.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = agg_pixfmt_rgb.h; sourceTree = ""; }; 521F8124105607F10096D22C /* agg_color_rgba.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = agg_color_rgba.cpp; sourceTree = ""; }; 5226EFAA1071BB3900A30CC3 /* BitmapImageHolder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BitmapImageHolder.h; sourceTree = ""; }; 5226EFAD1071BB7600A30CC3 /* BitmapImageHolder.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = BitmapImageHolder.mm; sourceTree = ""; }; 523310F20CF7F1470087307A /* agg_conv_contour.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = agg_conv_contour.h; sourceTree = ""; }; 523310F30CF7F1470087307A /* agg_conv_curve.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = agg_conv_curve.h; sourceTree = ""; }; 523310F40CF7F1470087307A /* agg_conv_stroke.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = agg_conv_stroke.h; sourceTree = ""; }; 523310F80CF7F1D50087307A /* agg_conv_adaptor_vcgen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = agg_conv_adaptor_vcgen.h; sourceTree = ""; }; 523310F90CF7F1D50087307A /* agg_curves.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = agg_curves.h; sourceTree = ""; }; 523310FA0CF7F1D50087307A /* agg_vcgen_contour.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = agg_vcgen_contour.h; sourceTree = ""; }; 523310FB0CF7F1D50087307A /* agg_vcgen_stroke.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = agg_vcgen_stroke.h; sourceTree = ""; }; 523310FF0CF7F2120087307A /* agg_math_stroke.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = agg_math_stroke.h; sourceTree = ""; }; 523311030CF7F2450087307A /* agg_vertex_sequence.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = agg_vertex_sequence.h; sourceTree = ""; }; 5233110E0CF7F6260087307A /* agg_curves.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = agg_curves.cpp; sourceTree = ""; }; 5233110F0CF7F6260087307A /* agg_vcgen_contour.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = agg_vcgen_contour.cpp; sourceTree = ""; }; 523311100CF7F6260087307A /* agg_vcgen_stroke.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = agg_vcgen_stroke.cpp; sourceTree = ""; }; 523311170CF7F65B0087307A /* agg_shorten_path.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = agg_shorten_path.h; sourceTree = ""; }; 523311430CF807EA0087307A /* agg_bounding_rect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = agg_bounding_rect.h; sourceTree = ""; }; 523BFBB40CE6C469004218B9 /* agg_path_storage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = agg_path_storage.h; sourceTree = ""; }; 523BFBBF0CE6C864004218B9 /* agg_bezier_arc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = agg_bezier_arc.h; sourceTree = ""; }; 524464E509BAAD5C007E722B /* primShape.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = primShape.cpp; sourceTree = ""; }; 524464E609BAAD5C007E722B /* primShape.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = primShape.h; sourceTree = ""; }; 524955AD10B1248200BFB820 /* agg_renderer_fill.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = agg_renderer_fill.h; sourceTree = ""; }; 524D1FAF13AD0D7C002732C2 /* astexpression.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = astexpression.h; sourceTree = ""; }; 524D1FB013AD0D8A002732C2 /* astreplacement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = astreplacement.h; sourceTree = ""; }; 524D22A713B9FEBD002732C2 /* cfdg */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = cfdg; sourceTree = BUILT_PRODUCTS_DIR; }; 524D22DC13BA0200002732C2 /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = main.cpp; path = "src-unix/main.cpp"; sourceTree = ""; }; 524D22DD13BA0200002732C2 /* pngCanvas.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = pngCanvas.cpp; path = "src-unix/pngCanvas.cpp"; sourceTree = ""; }; 524D22DE13BA0200002732C2 /* pngCanvas.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = pngCanvas.h; path = "src-unix/pngCanvas.h"; sourceTree = ""; }; 524D22DF13BA0200002732C2 /* posixSystem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = posixSystem.cpp; path = "src-unix/posixSystem.cpp"; sourceTree = ""; }; 524D22E013BA0200002732C2 /* posixSystem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = posixSystem.h; path = "src-unix/posixSystem.h"; sourceTree = ""; }; 524D22E113BA0200002732C2 /* posixTimer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = posixTimer.cpp; path = "src-unix/posixTimer.cpp"; sourceTree = ""; }; 524D22E213BA0200002732C2 /* posixVersion.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = posixVersion.cpp; path = "src-unix/posixVersion.cpp"; sourceTree = ""; }; 524D22FC13BA0661002732C2 /* makeCFfilename.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = makeCFfilename.cpp; sourceTree = ""; }; 524D22FD13BA0661002732C2 /* makeCFfilename.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = makeCFfilename.h; sourceTree = ""; }; 5257B1611261754500A65849 /* CmdInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CmdInfo.h; sourceTree = ""; }; 525FB8FA0B06ED33006EA1C3 /* agg_rasterizer_cells_aa.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = agg_rasterizer_cells_aa.h; sourceTree = ""; }; 525FB8FB0B06ED33006EA1C3 /* agg_rasterizer_sl_clip.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = agg_rasterizer_sl_clip.h; sourceTree = ""; }; 526347601135AEC4005A96CF /* KFSplitView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KFSplitView.h; sourceTree = ""; }; 526347611135AEC4005A96CF /* KFSplitView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KFSplitView.m; sourceTree = ""; }; 526BCBBC10F5C12D003357E9 /* astexpression.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = astexpression.cpp; sourceTree = ""; }; 526BCBD810F5C425003357E9 /* astreplacement.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = astreplacement.cpp; sourceTree = ""; }; 5270D471101ABBEA001A46A9 /* ast.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ast.h; sourceTree = ""; }; 527107711027B79D00091D94 /* agg_trans_affine_time.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = agg_trans_affine_time.h; sourceTree = ""; }; 527631510D7B490B00F0F7C8 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = /System/Library/Frameworks/WebKit.framework; sourceTree = ""; }; 527631930D7B5D2D00F0F7C8 /* widgetform.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = widgetform.html; sourceTree = ""; }; 527631980D7B63A000F0F7C8 /* widget-style.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.css; path = "widget-style.css"; sourceTree = ""; }; 5276AA9813776AE1000FA1AB /* CmdInfo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CmdInfo.cpp; sourceTree = ""; }; 5276ACE7137A513B000FA1AB /* stacktype.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stacktype.h; sourceTree = ""; }; 5276ACE8137A513B000FA1AB /* stacktype.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = stacktype.cpp; sourceTree = ""; }; 527FE236135ABF2400F9B15F /* pathIterator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pathIterator.h; sourceTree = ""; }; 527FE237135ABF2400F9B15F /* pathIterator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = pathIterator.cpp; sourceTree = ""; }; 528D3E8E0CEAC3D20022E4F1 /* agg_bezier_arc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = agg_bezier_arc.cpp; sourceTree = ""; }; 529049A10F3E4CC900484FED /* cfdg.ypp */ = {isa = PBXFileReference; explicitFileType = sourcecode.yacc; fileEncoding = 4; path = cfdg.ypp; sourceTree = ""; }; 529049A20F3E4CC900484FED /* scanner.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = scanner.h; sourceTree = ""; }; 5298ED5216A216CB00C5726D /* chunk_vector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = chunk_vector.h; sourceTree = ""; }; 529A79530B7C373200D45C38 /* agg_scanline_p.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = agg_scanline_p.h; sourceTree = ""; }; 529CC95515A393820079C2B5 /* ffCanvas.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffCanvas.h; sourceTree = ""; }; 529CC95615A393820079C2B5 /* ffCanvasDummy.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ffCanvasDummy.cpp; sourceTree = ""; }; 52BA888A155F30490026AF04 /* ast.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ast.cpp; sourceTree = ""; }; 52C267B6154F268C00230EB9 /* abstractPngCanvas.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = abstractPngCanvas.h; sourceTree = ""; }; 52C267B7154F26BD00230EB9 /* abstractPngCanvas.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = abstractPngCanvas.cpp; sourceTree = ""; }; 52E94E9813650A2E00BB2D96 /* QTKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QTKit.framework; path = System/Library/Frameworks/QTKit.framework; sourceTree = SDKROOT; }; 52E94EAD13650C5C00BB2D96 /* qtCanvas.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = qtCanvas.mm; sourceTree = ""; }; 52E950A31367D3B600BB2D96 /* QuickTime.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuickTime.framework; path = System/Library/Frameworks/QuickTime.framework; sourceTree = SDKROOT; }; 52E95226136933C200BB2D96 /* qtCanvas.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = qtCanvas.h; sourceTree = ""; }; 52F014EF108D6AEA00A329BE /* agg_trans_affine_1D.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = agg_trans_affine_1D.h; sourceTree = ""; }; 52FB6B8009ECB3E60008CE6E /* tiledCanvas.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tiledCanvas.h; sourceTree = ""; }; 52FB6B9309ECB8A20008CE6E /* tiledCanvas.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tiledCanvas.cpp; sourceTree = ""; }; 8D1107320486CEB800E47090 /* Context Free.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Context Free.app"; sourceTree = BUILT_PRODUCTS_DIR; }; FD1EF08B0811ADE500FD38C6 /* cfdg.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cfdg.cpp; sourceTree = ""; }; FD1EF08C0811ADE500FD38C6 /* cfdg.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.h; fileEncoding = 4; path = cfdg.h; sourceTree = ""; }; FD1EF08D0811ADE500FD38C6 /* cfdg.l */ = {isa = PBXFileReference; explicitFileType = sourcecode.lex; fileEncoding = 4; path = cfdg.l; sourceTree = ""; }; FD1EF0980811AE1900FD38C6 /* Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Prefix.pch; sourceTree = ""; }; FD1EF09A0811AE1900FD38C6 /* English */ = {isa = PBXFileReference; explicitFileType = text.plist.strings; fileEncoding = 10; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; FD1EF09C0811AE1900FD38C6 /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/MainMenu.nib; sourceTree = ""; }; FD1EF09F0811AE1900FD38C6 /* GView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GView.h; sourceTree = ""; }; FD1EF0A00811AE1900FD38C6 /* GView.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = GView.mm; sourceTree = ""; }; FD1EF0A10811AE1900FD38C6 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; FD1EF0A20811AE1900FD38C6 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; FD1EF0A30811AE1900FD38C6 /* version.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = version.plist; sourceTree = ""; }; FD29F41B082732FA005B4B87 /* TopBar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TopBar.h; sourceTree = ""; }; FD29F41C082732FA005B4B87 /* TopBar.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = TopBar.mm; sourceTree = ""; }; FD2D472308411CB600697CE7 /* aggCanvas.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aggCanvas.cpp; sourceTree = ""; }; FD2D472408411CB600697CE7 /* aggCanvas.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aggCanvas.h; sourceTree = ""; }; FD2D476608411F5200697CE7 /* agg_array.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = agg_array.h; sourceTree = ""; }; FD2D476708411F5200697CE7 /* agg_basics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = agg_basics.h; sourceTree = ""; }; FD2D476808411F5200697CE7 /* agg_clip_liang_barsky.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = agg_clip_liang_barsky.h; sourceTree = ""; }; FD2D476908411F5200697CE7 /* agg_color_gray.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = agg_color_gray.h; sourceTree = ""; }; FD2D476A08411F5200697CE7 /* agg_color_rgba.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = agg_color_rgba.h; sourceTree = ""; }; FD2D476B08411F5200697CE7 /* agg_config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = agg_config.h; sourceTree = ""; }; FD2D476C08411F5200697CE7 /* agg_conv_centroid.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = agg_conv_centroid.h; sourceTree = ""; }; FD2D476D08411F5200697CE7 /* agg_ellipse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = agg_ellipse.h; sourceTree = ""; }; FD2D476E08411F5200697CE7 /* agg_gamma_functions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = agg_gamma_functions.h; sourceTree = ""; }; FD2D476F08411F5200697CE7 /* agg_math.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = agg_math.h; sourceTree = ""; }; FD2D477008411F5200697CE7 /* agg_pixfmt_gray.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = agg_pixfmt_gray.h; sourceTree = ""; }; FD2D477108411F5200697CE7 /* agg_rasterizer_scanline_aa.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = agg_rasterizer_scanline_aa.h; sourceTree = ""; }; FD2D477308411F5200697CE7 /* agg_renderer_base.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = agg_renderer_base.h; sourceTree = ""; }; FD2D477408411F5200697CE7 /* agg_renderer_scanline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = agg_renderer_scanline.h; sourceTree = ""; }; FD2D477508411F5200697CE7 /* agg_rendering_buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = agg_rendering_buffer.h; sourceTree = ""; }; FD2D477708411F5200697CE7 /* agg_trans_affine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = agg_trans_affine.h; sourceTree = ""; }; FD2D477A08411FB600697CE7 /* agg_trans_affine.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = agg_trans_affine.cpp; sourceTree = ""; }; FD32F9B70892E2CA00DB40F4 /* HSBColor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HSBColor.cpp; sourceTree = ""; }; FD32F9B80892E2CA00DB40F4 /* HSBColor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSBColor.h; sourceTree = ""; }; FD32F9D00892EFE100DB40F4 /* ColorCalc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ColorCalc.h; sourceTree = ""; }; FD32F9D10892EFE100DB40F4 /* ColorCalc.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ColorCalc.mm; sourceTree = ""; }; FD32FA2A08934E0900DB40F4 /* GrammarTextView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GrammarTextView.h; sourceTree = ""; }; FD32FA2B08934E0900DB40F4 /* GrammarTextView.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = GrammarTextView.mm; sourceTree = ""; }; FD32FA470894A0CC00DB40F4 /* rose.cfdg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = rose.cfdg; sourceTree = ""; }; FD3A51AD09A7DAE300BBCD6E /* builder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = builder.h; sourceTree = ""; }; FD3A51AE09A7DAE300BBCD6E /* builder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = builder.cpp; sourceTree = ""; }; FD3A51B709A7DD2F00BBCD6E /* shape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = shape.h; sourceTree = ""; }; FD3A51B809A7DD2F00BBCD6E /* shape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = shape.cpp; sourceTree = ""; }; FD3A51C209A7DEF500BBCD6E /* cfdgimpl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cfdgimpl.h; sourceTree = ""; }; FD3A51C309A7DEF500BBCD6E /* cfdgimpl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cfdgimpl.cpp; sourceTree = ""; }; FD3A51CC09A7FC3000BBCD6E /* renderimpl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = renderimpl.h; sourceTree = ""; }; FD3A51CD09A7FC3000BBCD6E /* renderimpl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = renderimpl.cpp; sourceTree = ""; }; FD3A534009AD3A5E00BBCD6E /* ImageCanvas.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ImageCanvas.h; sourceTree = ""; }; FD3A534109AD3A5F00BBCD6E /* ImageCanvas.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ImageCanvas.mm; sourceTree = ""; }; FD3C074108202C3C00693028 /* CFDGController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CFDGController.h; sourceTree = ""; }; FD3C074208202C3C00693028 /* CFDGController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = CFDGController.mm; sourceTree = ""; }; FD3C082D08234F8300693028 /* demo1.cfdg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = demo1.cfdg; sourceTree = ""; }; FD3C082E08234F8300693028 /* demo2.cfdg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = demo2.cfdg; sourceTree = ""; }; FD3C083108234F8300693028 /* funky_flower.cfdg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = funky_flower.cfdg; sourceTree = ""; }; FD3C083608234F8300693028 /* mtree.cfdg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = mtree.cfdg; sourceTree = ""; }; FD3C083808234F8300693028 /* quadcity.cfdg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = quadcity.cfdg; sourceTree = ""; }; FD3C083A08234F8300693028 /* underground.cfdg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = underground.cfdg; sourceTree = ""; }; FD3C083C08234F8300693028 /* weighting_demo.cfdg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = weighting_demo.cfdg; sourceTree = ""; }; FD3C083D08234F8300693028 /* welcome.cfdg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = welcome.cfdg; sourceTree = ""; }; FD4A7988086FA1AA0033B409 /* agg_fast_ellipse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = agg_fast_ellipse.h; sourceTree = ""; }; FD570D2908281415003F064D /* lesson.cfdg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = lesson.cfdg; sourceTree = ""; }; FD570D2F082821B3003F064D /* i_curves.cfdg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = i_curves.cfdg; sourceTree = ""; }; FD570D30082821B3003F064D /* i_pix.cfdg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = i_pix.cfdg; sourceTree = ""; }; FD68653709C858740005FCA4 /* agg_copy_rect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = agg_copy_rect.h; sourceTree = ""; }; FD782A89082869F100910D5E /* HelpMenu.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = HelpMenu.plist; sourceTree = ""; }; FD782C42082A03ED00910D5E /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = /System/Library/Frameworks/SystemConfiguration.framework; sourceTree = ""; }; FD81610108146BF0009AB595 /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/CFDGDocument.nib; sourceTree = ""; }; FD81610508146C33009AB595 /* CFDGDocument.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CFDGDocument.h; sourceTree = ""; }; FD81610608146C33009AB595 /* CFDGDocument.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = CFDGDocument.mm; sourceTree = ""; }; FD82A9D809CB901B00529D7B /* shapeSTL.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = shapeSTL.h; sourceTree = ""; }; FD82A9D909CB901B00529D7B /* shapeSTL.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = shapeSTL.cpp; sourceTree = ""; }; FD82AA2609CC8CC000529D7B /* bounds.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bounds.h; sourceTree = ""; }; FD82AA2709CC8CC000529D7B /* bounds.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = bounds.cpp; sourceTree = ""; }; FD82F7A409A4C34700D5C038 /* countable.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = countable.cpp; sourceTree = ""; }; FD82F7A509A4C34700D5C038 /* countable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = countable.h; sourceTree = ""; }; FD82F7B109A4C49400D5C038 /* tempfile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tempfile.h; sourceTree = ""; }; FD82F7B209A4C49400D5C038 /* tempfile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tempfile.cpp; sourceTree = ""; }; FD84F37B088F549E00D54B1B /* agg_pixfmt_rgba.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = agg_pixfmt_rgba.h; sourceTree = ""; }; FD879EE00B6418E700FF6959 /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/GalleryUploader.nib; sourceTree = ""; }; FD879EE20B64190400FF6959 /* GalleryUploader.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = GalleryUploader.h; sourceTree = ""; }; FD879EE30B64190400FF6959 /* GalleryUploader.mm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.objcpp; path = GalleryUploader.mm; sourceTree = ""; }; FD879EE60B64191700FF6959 /* upload.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = upload.cpp; sourceTree = ""; }; FD879EE70B64191700FF6959 /* upload.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = upload.h; sourceTree = ""; }; FD9BA8540832B56A00B9396F /* Credits.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = Credits.html; sourceTree = ""; }; FDA4E5B10831DF3D00460DCE /* variation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = variation.cpp; sourceTree = ""; }; FDA4E5B20831DF3D00460DCE /* variation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = variation.h; sourceTree = ""; }; FDA77E6B099C669E00EBA6BD /* SVGCanvas.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SVGCanvas.cpp; sourceTree = ""; }; FDA77E6C099C669E00EBA6BD /* SVGCanvas.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGCanvas.h; sourceTree = ""; }; FDB2FA75081B696300901B0E /* VariationFormatter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VariationFormatter.h; sourceTree = ""; }; FDB2FA76081B696300901B0E /* VariationFormatter.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = VariationFormatter.mm; sourceTree = ""; }; FDB2FAF7081CD10A00901B0E /* app.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = app.icns; sourceTree = ""; }; FDC5D4AB082433AF00B5990D /* UserDefaults.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = UserDefaults.plist; sourceTree = ""; }; FDCD3F0F081E145E00D4A589 /* doc.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = doc.icns; sourceTree = ""; }; FDD366D00860CE7A006114C4 /* ClassDesign.xcclassmodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcclassmodel; name = ClassDesign.xcclassmodel; path = "src-osx/ClassDesign.xcclassmodel"; sourceTree = ""; }; FDD3B7C00839C7640022DE7B /* ciliasun.cfdg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = ciliasun.cfdg; sourceTree = ""; }; FDD3B7C10839C7640022DE7B /* octopi.cfdg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = octopi.cfdg; sourceTree = ""; }; FDD3B7C30839C7640022DE7B /* sierpinski.cfdg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = sierpinski.cfdg; sourceTree = ""; }; FDD3B7C40839C7640022DE7B /* snowflake.cfdg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = snowflake.cfdg; sourceTree = ""; }; FDD3B7C50839C7640022DE7B /* tangle.cfdg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = tangle.cfdg; sourceTree = ""; }; FDD3B7C60839C7640022DE7B /* triples.cfdg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = triples.cfdg; sourceTree = ""; }; FDD3B7C70839C7640022DE7B /* ziggy.cfdg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = ziggy.cfdg; sourceTree = ""; }; FDF15B2D0880C3E60041D85B /* lesson2.cfdg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = lesson2.cfdg; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 524D22A513B9FEBC002732C2 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; 8D11072E0486CEB800E47090 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */, FD782C43082A03ED00910D5E /* SystemConfiguration.framework in Frameworks */, 527631520D7B490B00F0F7C8 /* WebKit.framework in Frameworks */, 52E94E9913650A2E00BB2D96 /* QTKit.framework in Frameworks */, 52E950A41367D3B600BB2D96 /* QuickTime.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */ = { isa = PBXGroup; children = ( 527631510D7B490B00F0F7C8 /* WebKit.framework */, FD782C42082A03ED00910D5E /* SystemConfiguration.framework */, 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */, 52E94E9813650A2E00BB2D96 /* QTKit.framework */, ); name = "Linked Frameworks"; sourceTree = ""; }; 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */ = { isa = PBXGroup; children = ( 29B97325FDCFA39411CA2CEA /* Foundation.framework */, 29B97324FDCFA39411CA2CEA /* AppKit.framework */, ); name = "Other Frameworks"; sourceTree = ""; }; 19C28FACFE9D520D11CA2CBB /* Products */ = { isa = PBXGroup; children = ( 8D1107320486CEB800E47090 /* Context Free.app */, 524D22A713B9FEBD002732C2 /* cfdg */, ); name = Products; sourceTree = ""; }; 29B97314FDCFA39411CA2CEA /* CFDA */ = { isa = PBXGroup; children = ( 524D22DB13BA01D8002732C2 /* src-unix */, FD2D472B08411DCC00697CE7 /* src-agg */, FD1EF08A0811ADE500FD38C6 /* src-common */, FD1EF0970811AE1900FD38C6 /* src-osx */, FDD366D00860CE7A006114C4 /* ClassDesign.xcclassmodel */, FD3C082A08234F8300693028 /* input */, 29B97323FDCFA39411CA2CEA /* Frameworks */, 19C28FACFE9D520D11CA2CBB /* Products */, 52E950A31367D3B600BB2D96 /* QuickTime.framework */, ); name = CFDA; sourceTree = ""; }; 29B97323FDCFA39411CA2CEA /* Frameworks */ = { isa = PBXGroup; children = ( 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */, 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */, ); name = Frameworks; sourceTree = ""; }; 524D22DB13BA01D8002732C2 /* src-unix */ = { isa = PBXGroup; children = ( 5205AE8C14455E4C00245A6F /* version.h */, 524D22DC13BA0200002732C2 /* main.cpp */, 524D22DD13BA0200002732C2 /* pngCanvas.cpp */, 524D22DE13BA0200002732C2 /* pngCanvas.h */, 524D22DF13BA0200002732C2 /* posixSystem.cpp */, 524D22E013BA0200002732C2 /* posixSystem.h */, 524D22E113BA0200002732C2 /* posixTimer.cpp */, 524D22E213BA0200002732C2 /* posixVersion.cpp */, ); name = "src-unix"; sourceTree = ""; }; FD1EF08A0811ADE500FD38C6 /* src-common */ = { isa = PBXGroup; children = ( 5298ED5216A216CB00C5726D /* chunk_vector.h */, 529CC95515A393820079C2B5 /* ffCanvas.h */, 529CC95615A393820079C2B5 /* ffCanvasDummy.cpp */, 524D22FC13BA0661002732C2 /* makeCFfilename.cpp */, 524D22FD13BA0661002732C2 /* makeCFfilename.h */, 526BCBD810F5C425003357E9 /* astreplacement.cpp */, 524D1FB013AD0D8A002732C2 /* astreplacement.h */, 526BCBBC10F5C12D003357E9 /* astexpression.cpp */, 524D1FAF13AD0D7C002732C2 /* astexpression.h */, 5270D471101ABBEA001A46A9 /* ast.h */, 52BA888A155F30490026AF04 /* ast.cpp */, 529049A10F3E4CC900484FED /* cfdg.ypp */, 529049A20F3E4CC900484FED /* scanner.h */, FD879EE60B64191700FF6959 /* upload.cpp */, FD879EE70B64191700FF6959 /* upload.h */, 52FB6B9309ECB8A20008CE6E /* tiledCanvas.cpp */, 52FB6B8009ECB3E60008CE6E /* tiledCanvas.h */, 524464E509BAAD5C007E722B /* primShape.cpp */, 524464E609BAAD5C007E722B /* primShape.h */, FD4A7987086FA1AA0033B409 /* agg-extras */, FD1EF08D0811ADE500FD38C6 /* cfdg.l */, FD1EF08C0811ADE500FD38C6 /* cfdg.h */, FD1EF08B0811ADE500FD38C6 /* cfdg.cpp */, FD3A51B709A7DD2F00BBCD6E /* shape.h */, FD3A51B809A7DD2F00BBCD6E /* shape.cpp */, 5276ACE7137A513B000FA1AB /* stacktype.h */, 5276ACE8137A513B000FA1AB /* stacktype.cpp */, FD3A51C209A7DEF500BBCD6E /* cfdgimpl.h */, FD3A51C309A7DEF500BBCD6E /* cfdgimpl.cpp */, FD3A51CC09A7FC3000BBCD6E /* renderimpl.h */, FD3A51CD09A7FC3000BBCD6E /* renderimpl.cpp */, FD3A51AD09A7DAE300BBCD6E /* builder.h */, FD3A51AE09A7DAE300BBCD6E /* builder.cpp */, FDA4E5B20831DF3D00460DCE /* variation.h */, FDA4E5B10831DF3D00460DCE /* variation.cpp */, FD2D472408411CB600697CE7 /* aggCanvas.h */, FD2D472308411CB600697CE7 /* aggCanvas.cpp */, FDA77E6B099C669E00EBA6BD /* SVGCanvas.cpp */, FDA77E6C099C669E00EBA6BD /* SVGCanvas.h */, FD32F9B80892E2CA00DB40F4 /* HSBColor.h */, FD32F9B70892E2CA00DB40F4 /* HSBColor.cpp */, FD82F7A509A4C34700D5C038 /* countable.h */, FD82F7A409A4C34700D5C038 /* countable.cpp */, FD82F7B109A4C49400D5C038 /* tempfile.h */, FD82F7B209A4C49400D5C038 /* tempfile.cpp */, FD82A9D809CB901B00529D7B /* shapeSTL.h */, FD82A9D909CB901B00529D7B /* shapeSTL.cpp */, FD82AA2609CC8CC000529D7B /* bounds.h */, FD82AA2709CC8CC000529D7B /* bounds.cpp */, 527FE236135ABF2400F9B15F /* pathIterator.h */, 527FE237135ABF2400F9B15F /* pathIterator.cpp */, 52100A7D0D3A9F1800F7070D /* Rand64.h */, 52100A7E0D3A9F1800F7070D /* Rand64.cpp */, 5257B1611261754500A65849 /* CmdInfo.h */, 5276AA9813776AE1000FA1AB /* CmdInfo.cpp */, 52C267B6154F268C00230EB9 /* abstractPngCanvas.h */, 52C267B7154F26BD00230EB9 /* abstractPngCanvas.cpp */, ); path = "src-common"; sourceTree = ""; }; FD1EF0970811AE1900FD38C6 /* src-osx */ = { isa = PBXGroup; children = ( 52E95226136933C200BB2D96 /* qtCanvas.h */, 52E94EAD13650C5C00BB2D96 /* qtCanvas.mm */, 526347601135AEC4005A96CF /* KFSplitView.h */, 526347611135AEC4005A96CF /* KFSplitView.m */, 5226EFAA1071BB3900A30CC3 /* BitmapImageHolder.h */, 5226EFAD1071BB7600A30CC3 /* BitmapImageHolder.mm */, FD879EE20B64190400FF6959 /* GalleryUploader.h */, FD879EE30B64190400FF6959 /* GalleryUploader.mm */, FD1EF0980811AE1900FD38C6 /* Prefix.pch */, FD1EF09F0811AE1900FD38C6 /* GView.h */, FD1EF0A00811AE1900FD38C6 /* GView.mm */, FD3A534009AD3A5E00BBCD6E /* ImageCanvas.h */, FD3A534109AD3A5F00BBCD6E /* ImageCanvas.mm */, FD29F41B082732FA005B4B87 /* TopBar.h */, FD29F41C082732FA005B4B87 /* TopBar.mm */, FD81610508146C33009AB595 /* CFDGDocument.h */, FD81610608146C33009AB595 /* CFDGDocument.mm */, FD3C074108202C3C00693028 /* CFDGController.h */, FD3C074208202C3C00693028 /* CFDGController.mm */, FDB2FA75081B696300901B0E /* VariationFormatter.h */, FDB2FA76081B696300901B0E /* VariationFormatter.mm */, FD1EF0A20811AE1900FD38C6 /* main.m */, FD1EF0AF0811AE6500FD38C6 /* Resources */, FD32F9D00892EFE100DB40F4 /* ColorCalc.h */, FD32F9D10892EFE100DB40F4 /* ColorCalc.mm */, FD32FA2A08934E0900DB40F4 /* GrammarTextView.h */, FD32FA2B08934E0900DB40F4 /* GrammarTextView.mm */, ); path = "src-osx"; sourceTree = ""; }; FD1EF0AF0811AE6500FD38C6 /* Resources */ = { isa = PBXGroup; children = ( 527631980D7B63A000F0F7C8 /* widget-style.css */, 527631930D7B5D2D00F0F7C8 /* widgetform.html */, FDB2FAF7081CD10A00901B0E /* app.icns */, FDCD3F0F081E145E00D4A589 /* doc.icns */, FD1EF0A30811AE1900FD38C6 /* version.plist */, FD9BA8540832B56A00B9396F /* Credits.html */, FD1EF0A10811AE1900FD38C6 /* Info.plist */, FD1EF0990811AE1900FD38C6 /* InfoPlist.strings */, FDC5D4AB082433AF00B5990D /* UserDefaults.plist */, FD782A89082869F100910D5E /* HelpMenu.plist */, FD1EF09B0811AE1900FD38C6 /* MainMenu.nib */, FD81610008146BF0009AB595 /* CFDGDocument.nib */, FD879EDF0B6418E700FF6959 /* GalleryUploader.nib */, ); name = Resources; sourceTree = ""; }; FD2D472B08411DCC00697CE7 /* src-agg */ = { isa = PBXGroup; children = ( FD2D476508411F5200697CE7 /* include */, FD2D477808411FB600697CE7 /* src */, ); path = "src-agg"; sourceTree = ""; }; FD2D476508411F5200697CE7 /* include */ = { isa = PBXGroup; children = ( 523311430CF807EA0087307A /* agg_bounding_rect.h */, 523311170CF7F65B0087307A /* agg_shorten_path.h */, 523311030CF7F2450087307A /* agg_vertex_sequence.h */, 523310FF0CF7F2120087307A /* agg_math_stroke.h */, 523310F80CF7F1D50087307A /* agg_conv_adaptor_vcgen.h */, 523310F90CF7F1D50087307A /* agg_curves.h */, 523310FA0CF7F1D50087307A /* agg_vcgen_contour.h */, 523310FB0CF7F1D50087307A /* agg_vcgen_stroke.h */, 523310F20CF7F1470087307A /* agg_conv_contour.h */, 523310F30CF7F1470087307A /* agg_conv_curve.h */, 523310F40CF7F1470087307A /* agg_conv_stroke.h */, 523BFBBF0CE6C864004218B9 /* agg_bezier_arc.h */, 523BFBB40CE6C469004218B9 /* agg_path_storage.h */, 529A79530B7C373200D45C38 /* agg_scanline_p.h */, 525FB8FA0B06ED33006EA1C3 /* agg_rasterizer_cells_aa.h */, 525FB8FB0B06ED33006EA1C3 /* agg_rasterizer_sl_clip.h */, FD2D476608411F5200697CE7 /* agg_array.h */, FD2D476708411F5200697CE7 /* agg_basics.h */, FD2D476808411F5200697CE7 /* agg_clip_liang_barsky.h */, FD2D476908411F5200697CE7 /* agg_color_gray.h */, FD2D476A08411F5200697CE7 /* agg_color_rgba.h */, FD2D476B08411F5200697CE7 /* agg_config.h */, FD2D476D08411F5200697CE7 /* agg_ellipse.h */, FD2D476E08411F5200697CE7 /* agg_gamma_functions.h */, FD2D476F08411F5200697CE7 /* agg_math.h */, FD2D477008411F5200697CE7 /* agg_pixfmt_gray.h */, 521B94EB0BA507B800BD9A09 /* agg_pixfmt_rgb.h */, FD84F37B088F549E00D54B1B /* agg_pixfmt_rgba.h */, FD2D477108411F5200697CE7 /* agg_rasterizer_scanline_aa.h */, FD2D477308411F5200697CE7 /* agg_renderer_base.h */, FD2D477408411F5200697CE7 /* agg_renderer_scanline.h */, FD2D477508411F5200697CE7 /* agg_rendering_buffer.h */, FD2D477708411F5200697CE7 /* agg_trans_affine.h */, ); path = include; sourceTree = ""; }; FD2D477808411FB600697CE7 /* src */ = { isa = PBXGroup; children = ( 5233110E0CF7F6260087307A /* agg_curves.cpp */, 5233110F0CF7F6260087307A /* agg_vcgen_contour.cpp */, 523311100CF7F6260087307A /* agg_vcgen_stroke.cpp */, 528D3E8E0CEAC3D20022E4F1 /* agg_bezier_arc.cpp */, FD2D477A08411FB600697CE7 /* agg_trans_affine.cpp */, 521F8124105607F10096D22C /* agg_color_rgba.cpp */, ); path = src; sourceTree = ""; }; FD3C082A08234F8300693028 /* input */ = { isa = PBXGroup; children = ( 520EC5C00A0C3BA800853FF3 /* i_polygons.cfdg */, FDD3B7C00839C7640022DE7B /* ciliasun.cfdg */, FD3C082D08234F8300693028 /* demo1.cfdg */, FD3C082E08234F8300693028 /* demo2.cfdg */, FD3C083108234F8300693028 /* funky_flower.cfdg */, FD570D2F082821B3003F064D /* i_curves.cfdg */, FD570D30082821B3003F064D /* i_pix.cfdg */, FD570D2908281415003F064D /* lesson.cfdg */, FDF15B2D0880C3E60041D85B /* lesson2.cfdg */, FD3C083608234F8300693028 /* mtree.cfdg */, FDD3B7C10839C7640022DE7B /* octopi.cfdg */, FD3C083808234F8300693028 /* quadcity.cfdg */, FD32FA470894A0CC00DB40F4 /* rose.cfdg */, FDD3B7C30839C7640022DE7B /* sierpinski.cfdg */, FDD3B7C40839C7640022DE7B /* snowflake.cfdg */, FDD3B7C50839C7640022DE7B /* tangle.cfdg */, FDD3B7C60839C7640022DE7B /* triples.cfdg */, FD3C083A08234F8300693028 /* underground.cfdg */, FD3C083C08234F8300693028 /* weighting_demo.cfdg */, FD3C083D08234F8300693028 /* welcome.cfdg */, FDD3B7C70839C7640022DE7B /* ziggy.cfdg */, ); path = input; sourceTree = ""; }; FD4A7987086FA1AA0033B409 /* agg-extras */ = { isa = PBXGroup; children = ( FD2D476C08411F5200697CE7 /* agg_conv_centroid.h */, 52F014EF108D6AEA00A329BE /* agg_trans_affine_1D.h */, 527107711027B79D00091D94 /* agg_trans_affine_time.h */, FD4A7988086FA1AA0033B409 /* agg_fast_ellipse.h */, FD68653709C858740005FCA4 /* agg_copy_rect.h */, 524955AD10B1248200BFB820 /* agg_renderer_fill.h */, ); path = "agg-extras"; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ 524D22A613B9FEBC002732C2 /* cfdg */ = { isa = PBXNativeTarget; buildConfigurationList = 524D22AD13B9FEDC002732C2 /* Build configuration list for PBXNativeTarget "cfdg" */; buildPhases = ( 524D22A413B9FEBC002732C2 /* Sources */, 524D22A513B9FEBC002732C2 /* Frameworks */, ); buildRules = ( 524D22EB13BA0318002732C2 /* PBXBuildRule */, 524D22EA13BA02B3002732C2 /* PBXBuildRule */, ); dependencies = ( ); name = cfdg; productName = cfdg; productReference = 524D22A713B9FEBD002732C2 /* cfdg */; productType = "com.apple.product-type.tool"; }; 8D1107260486CEB800E47090 /* Context Free */ = { isa = PBXNativeTarget; buildConfigurationList = FDB0D3CF085CEE00002FBEED /* Build configuration list for PBXNativeTarget "Context Free" */; buildPhases = ( 8D1107290486CEB800E47090 /* Resources */, FD3C081108234EFE00693028 /* CopyFiles */, FDF15B260880C3AD0041D85B /* CopyFiles */, 8D11072C0486CEB800E47090 /* Sources */, 8D11072E0486CEB800E47090 /* Frameworks */, ); buildRules = ( 529049BA0F3E9E0000484FED /* PBXBuildRule */, 529049B90F3E9C9B00484FED /* PBXBuildRule */, ); dependencies = ( ); name = "Context Free"; productInstallPath = "$(HOME)/Applications"; productName = CFDA; productReference = 8D1107320486CEB800E47090 /* Context Free.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 29B97313FDCFA39411CA2CEA /* Project object */ = { isa = PBXProject; attributes = { LastUpgradeCheck = 0450; }; buildConfigurationList = FDB0D3D3085CEE00002FBEED /* Build configuration list for PBXProject "Context Free" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = English; hasScannedForEncodings = 1; knownRegions = ( English, Japanese, French, German, ); mainGroup = 29B97314FDCFA39411CA2CEA /* CFDA */; projectDirPath = ""; projectRoot = ""; targets = ( 8D1107260486CEB800E47090 /* Context Free */, 524D22A613B9FEBC002732C2 /* cfdg */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 8D1107290486CEB800E47090 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( FD1EF0A50811AE1900FD38C6 /* InfoPlist.strings in Resources */, FD1EF0A60811AE1900FD38C6 /* MainMenu.nib in Resources */, FD1EF0AC0811AE1900FD38C6 /* version.plist in Resources */, FD81610208146BF0009AB595 /* CFDGDocument.nib in Resources */, FDB2FAF8081CD10A00901B0E /* app.icns in Resources */, FDCD3F10081E145E00D4A589 /* doc.icns in Resources */, FDC5D4AC082433AF00B5990D /* UserDefaults.plist in Resources */, FD782A8A082869F100910D5E /* HelpMenu.plist in Resources */, FD9BA8550832B56A00B9396F /* Credits.html in Resources */, FD879EE10B6418E700FF6959 /* GalleryUploader.nib in Resources */, 527631940D7B5D2D00F0F7C8 /* widgetform.html in Resources */, 527631990D7B63A000F0F7C8 /* widget-style.css in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 524D22A413B9FEBC002732C2 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 524D22BC13BA0123002732C2 /* cfdg.ypp in Sources */, 524D22BB13BA0123002732C2 /* cfdg.l in Sources */, 524D22B513BA0123002732C2 /* aggCanvas.cpp in Sources */, 524D22B613BA0123002732C2 /* astexpression.cpp in Sources */, 524D22B713BA0123002732C2 /* astreplacement.cpp in Sources */, 524D22B813BA0123002732C2 /* bounds.cpp in Sources */, 524D22B913BA0123002732C2 /* builder.cpp in Sources */, 524D22BA13BA0123002732C2 /* cfdg.cpp in Sources */, 524D22CD13BA0145002732C2 /* agg_bezier_arc.cpp in Sources */, 524D22CE13BA0145002732C2 /* agg_color_rgba.cpp in Sources */, 524D22CF13BA0145002732C2 /* agg_curves.cpp in Sources */, 524D22D013BA0145002732C2 /* agg_trans_affine.cpp in Sources */, 524D22D113BA0145002732C2 /* agg_vcgen_contour.cpp in Sources */, 524D22D213BA0145002732C2 /* agg_vcgen_stroke.cpp in Sources */, 524D22BD13BA0123002732C2 /* cfdgimpl.cpp in Sources */, 524D22BE13BA0123002732C2 /* CmdInfo.cpp in Sources */, 524D22BF13BA0123002732C2 /* countable.cpp in Sources */, 524D22C013BA0123002732C2 /* HSBColor.cpp in Sources */, 524D22C113BA0123002732C2 /* pathIterator.cpp in Sources */, 524D22C213BA0123002732C2 /* primShape.cpp in Sources */, 524D22C313BA0123002732C2 /* Rand64.cpp in Sources */, 524D22C413BA0123002732C2 /* renderimpl.cpp in Sources */, 524D22C513BA0123002732C2 /* shape.cpp in Sources */, 524D22C613BA0123002732C2 /* shapeSTL.cpp in Sources */, 524D22C713BA0123002732C2 /* stacktype.cpp in Sources */, 524D22C813BA0123002732C2 /* SVGCanvas.cpp in Sources */, 524D22C913BA0123002732C2 /* tempfile.cpp in Sources */, 524D22CA13BA0123002732C2 /* tiledCanvas.cpp in Sources */, 524D22CB13BA0123002732C2 /* upload.cpp in Sources */, 524D22CC13BA0123002732C2 /* variation.cpp in Sources */, 524D22E313BA0200002732C2 /* main.cpp in Sources */, 524D22E413BA0200002732C2 /* pngCanvas.cpp in Sources */, 524D22E513BA0200002732C2 /* posixSystem.cpp in Sources */, 524D22E613BA0200002732C2 /* posixTimer.cpp in Sources */, 524D22E713BA0200002732C2 /* posixVersion.cpp in Sources */, 524D22FE13BA0661002732C2 /* makeCFfilename.cpp in Sources */, 52C267B8154F26BD00230EB9 /* abstractPngCanvas.cpp in Sources */, 52BA888C155F30490026AF04 /* ast.cpp in Sources */, 529CC95715A393820079C2B5 /* ffCanvasDummy.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 8D11072C0486CEB800E47090 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 529049A30F3E4CC900484FED /* cfdg.ypp in Sources */, FD1EF0930811ADE500FD38C6 /* cfdg.l in Sources */, FD1EF0910811ADE500FD38C6 /* cfdg.cpp in Sources */, FD3A51BA09A7DD2F00BBCD6E /* shape.cpp in Sources */, FD3A51C509A7DEF500BBCD6E /* cfdgimpl.cpp in Sources */, FD3A51CF09A7FC3000BBCD6E /* renderimpl.cpp in Sources */, FD3A51B009A7DAE300BBCD6E /* builder.cpp in Sources */, FDA4E5B30831DF3D00460DCE /* variation.cpp in Sources */, FD82F7A609A4C34700D5C038 /* countable.cpp in Sources */, FD82F7B409A4C49400D5C038 /* tempfile.cpp in Sources */, FD32F9B90892E2CA00DB40F4 /* HSBColor.cpp in Sources */, FD2D477C08411FB600697CE7 /* agg_trans_affine.cpp in Sources */, FD2D472508411CB600697CE7 /* aggCanvas.cpp in Sources */, FDA77E6D099C669E00EBA6BD /* SVGCanvas.cpp in Sources */, FDB2FA78081B696300901B0E /* VariationFormatter.mm in Sources */, FD29F41E082732FA005B4B87 /* TopBar.mm in Sources */, FD32F9D30892EFE100DB40F4 /* ColorCalc.mm in Sources */, FD32FA2D08934E0900DB40F4 /* GrammarTextView.mm in Sources */, FD1EF0A90811AE1900FD38C6 /* GView.mm in Sources */, FD81610808146C33009AB595 /* CFDGDocument.mm in Sources */, FD3C074408202C3C00693028 /* CFDGController.mm in Sources */, FD1EF0AB0811AE1900FD38C6 /* main.m in Sources */, FD3A534309AD3A5F00BBCD6E /* ImageCanvas.mm in Sources */, 524464E709BAAD5C007E722B /* primShape.cpp in Sources */, FD82A9DB09CB901B00529D7B /* shapeSTL.cpp in Sources */, FD82AA2909CC8CC000529D7B /* bounds.cpp in Sources */, 52FB6B9409ECB8A20008CE6E /* tiledCanvas.cpp in Sources */, FD879EE50B64190400FF6959 /* GalleryUploader.mm in Sources */, FD879EE80B64191700FF6959 /* upload.cpp in Sources */, 528D3E8F0CEAC3D20022E4F1 /* agg_bezier_arc.cpp in Sources */, 523311110CF7F6260087307A /* agg_curves.cpp in Sources */, 523311120CF7F6260087307A /* agg_vcgen_contour.cpp in Sources */, 523311130CF7F6260087307A /* agg_vcgen_stroke.cpp in Sources */, 52100A7F0D3A9F1800F7070D /* Rand64.cpp in Sources */, 521F8125105607F10096D22C /* agg_color_rgba.cpp in Sources */, 5226EFAE1071BB7600A30CC3 /* BitmapImageHolder.mm in Sources */, 526BCBBD10F5C12D003357E9 /* astexpression.cpp in Sources */, 526BCBD910F5C425003357E9 /* astreplacement.cpp in Sources */, 526347621135AEC4005A96CF /* KFSplitView.m in Sources */, 527FE238135ABF2400F9B15F /* pathIterator.cpp in Sources */, 52E94EAE13650C5C00BB2D96 /* qtCanvas.mm in Sources */, 5276AA9913776AE1000FA1AB /* CmdInfo.cpp in Sources */, 5276ACE9137A513B000FA1AB /* stacktype.cpp in Sources */, 52BA888B155F30490026AF04 /* ast.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ FD1EF0990811AE1900FD38C6 /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( FD1EF09A0811AE1900FD38C6 /* English */, ); name = InfoPlist.strings; sourceTree = ""; }; FD1EF09B0811AE1900FD38C6 /* MainMenu.nib */ = { isa = PBXVariantGroup; children = ( FD1EF09C0811AE1900FD38C6 /* English */, ); name = MainMenu.nib; sourceTree = ""; }; FD81610008146BF0009AB595 /* CFDGDocument.nib */ = { isa = PBXVariantGroup; children = ( FD81610108146BF0009AB595 /* English */, ); name = CFDGDocument.nib; sourceTree = ""; }; FD879EDF0B6418E700FF6959 /* GalleryUploader.nib */ = { isa = PBXVariantGroup; children = ( FD879EE00B6418E700FF6959 /* English */, ); name = GalleryUploader.nib; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ 52086FBA0ABD19F6005EBDC1 /* Performance */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = YES; CLANG_CXX_LIBRARY = "libstdc++"; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; CURRENT_PROJECT_VERSION = 37; DEPLOYMENT_POSTPROCESSING = NO; GCC_GENERATE_DEBUGGING_SYMBOLS = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "src-osx/Prefix.pch"; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_PEDANTIC = NO; GCC_WARN_SIGN_COMPARE = YES; HEADER_SEARCH_PATHS = ""; INFOPLIST_FILE = "src-osx/Info.plist"; INSTALL_PATH = "$(HOME)/Applications"; MACOSX_DEPLOYMENT_TARGET = 10.5; "MACOSX_DEPLOYMENT_TARGET[arch=x86_64]" = 10.5; PRODUCT_NAME = "Context Free"; SCAN_ALL_SOURCE_FILES_FOR_INCLUDES = NO; STRIP_INSTALLED_PRODUCT = NO; USER_HEADER_SEARCH_PATHS = /usr/local/include; VERSIONING_SYSTEM = "apple-generic"; WRAPPER_EXTENSION = app; ZERO_LINK = NO; }; name = Performance; }; 52086FBB0ABD19F6005EBDC1 /* Performance */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(ARCHS_STANDARD_64_BIT)"; GCC_FAST_MATH = YES; GCC_OBJC_CALL_CXX_CDTORS = YES; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_PEDANTIC = YES; GCC_WARN_STRICT_SELECTOR_MATCH = YES; MACOSX_DEPLOYMENT_TARGET = 10.4; "MACOSX_DEPLOYMENT_TARGET[arch=x86_64]" = 10.5; SDKROOT = macosx; WARNING_CFLAGS = "-Wall"; }; name = Performance; }; 524D22A913B9FEBE002732C2 /* Development */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_CXX_LIBRARY = "libstdc++"; COPY_PHASE_STRIP = NO; GCC_C_LANGUAGE_STANDARD = c99; GCC_DYNAMIC_NO_PIC = NO; GCC_MODEL_TUNING = G5; GCC_OPTIMIZATION_LEVEL = 0; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_PEDANTIC = NO; HEADER_SEARCH_PATHS = ( /usr/include, /usr/local/include, "src-agg/include", "src-common", ); INSTALL_PATH = /usr/local/bin; LIBRARY_SEARCH_PATHS = /usr/local/lib; MACH_O_TYPE = mh_execute; MACOSX_DEPLOYMENT_TARGET = 10.5; "MACOSX_DEPLOYMENT_TARGET[arch=x86_64]" = 10.5; OTHER_LDFLAGS = "-lpng"; PRODUCT_NAME = cfdg; SDKROOT = macosx10.7; }; name = Development; }; 524D22AA13B9FEBE002732C2 /* Deployment */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_CXX_LIBRARY = "libstdc++"; COPY_PHASE_STRIP = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_C_LANGUAGE_STANDARD = c99; GCC_MODEL_TUNING = G5; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_PEDANTIC = NO; HEADER_SEARCH_PATHS = ( /usr/include, /usr/local/include, "src-agg/include", "src-common", ); INSTALL_PATH = /usr/local/bin; LIBRARY_SEARCH_PATHS = /usr/local/lib; MACH_O_TYPE = mh_execute; MACOSX_DEPLOYMENT_TARGET = 10.5; "MACOSX_DEPLOYMENT_TARGET[arch=x86_64]" = 10.5; OTHER_LDFLAGS = "-lpng"; PRODUCT_NAME = cfdg; SDKROOT = macosx10.7; ZERO_LINK = NO; }; name = Deployment; }; 524D22AB13B9FEBE002732C2 /* Universal */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_CXX_LIBRARY = "libstdc++"; GCC_C_LANGUAGE_STANDARD = c99; GCC_MODEL_TUNING = G5; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_PEDANTIC = NO; HEADER_SEARCH_PATHS = ( /usr/include, /usr/local/include, "src-agg/include", "src-common", ); INSTALL_PATH = /usr/local/bin; LIBRARY_SEARCH_PATHS = /usr/local/lib; MACH_O_TYPE = mh_execute; MACOSX_DEPLOYMENT_TARGET = 10.5; "MACOSX_DEPLOYMENT_TARGET[arch=x86_64]" = 10.5; OTHER_LDFLAGS = "-lpng"; PRODUCT_NAME = cfdg; SDKROOT = macosx10.7; }; name = Universal; }; 524D22AC13B9FEBE002732C2 /* Performance */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_CXX_LIBRARY = "libstdc++"; GCC_C_LANGUAGE_STANDARD = c99; GCC_MODEL_TUNING = G5; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_PEDANTIC = NO; HEADER_SEARCH_PATHS = ( /usr/include, /usr/local/include, "src-agg/include", "src-common", ); INSTALL_PATH = /usr/local/bin; LIBRARY_SEARCH_PATHS = /usr/local/lib; MACH_O_TYPE = mh_execute; MACOSX_DEPLOYMENT_TARGET = 10.5; "MACOSX_DEPLOYMENT_TARGET[arch=x86_64]" = 10.5; OTHER_LDFLAGS = "-lpng"; PRODUCT_NAME = cfdg; SDKROOT = macosx10.7; }; name = Performance; }; FD6A132309B25B3000F4E1BC /* Universal */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = YES; ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; CLANG_CXX_LIBRARY = "libstdc++"; CODE_SIGN_IDENTITY = "Mac Developer: John Horigan (TR6ES2TBTV)"; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = YES; CURRENT_PROJECT_VERSION = 37; DEPLOYMENT_POSTPROCESSING = YES; GCC_GENERATE_DEBUGGING_SYMBOLS = NO; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "src-osx/Prefix.pch"; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_PEDANTIC = NO; GCC_WARN_SIGN_COMPARE = YES; HEADER_SEARCH_PATHS = ""; INFOPLIST_FILE = "src-osx/Info.plist"; INSTALL_PATH = "$(HOME)/Applications"; MACOSX_DEPLOYMENT_TARGET = 10.5; "MACOSX_DEPLOYMENT_TARGET[arch=x86_64]" = 10.5; "OTHER_CFLAGS[arch=*]" = "-DNDEBUG=1"; PRODUCT_NAME = "Context Free"; PROVISIONING_PROFILE = "E36258C9-C0C3-47B3-BDD2-3FB55B36E10A"; SCAN_ALL_SOURCE_FILES_FOR_INCLUDES = NO; USER_HEADER_SEARCH_PATHS = /usr/local/include; VERSIONING_SYSTEM = "apple-generic"; WRAPPER_EXTENSION = app; ZERO_LINK = NO; }; name = Universal; }; FD6A132409B25B3000F4E1BC /* Universal */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; GCC_FAST_MATH = YES; GCC_OBJC_CALL_CXX_CDTORS = YES; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_PEDANTIC = YES; GCC_WARN_STRICT_SELECTOR_MATCH = YES; MACOSX_DEPLOYMENT_TARGET = 10.4; "MACOSX_DEPLOYMENT_TARGET[arch=x86_64]" = 10.5; SDKROOT = macosx; WARNING_CFLAGS = "-Wall"; }; name = Universal; }; FDB0D3D0085CEE00002FBEED /* Development */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = YES; ARCHS = "$(ARCHS_STANDARD_64_BIT)"; CLANG_CXX_LIBRARY = "libstdc++"; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; CURRENT_PROJECT_VERSION = 37; GCC_DEBUGGING_SYMBOLS = full; GCC_GENERATE_DEBUGGING_SYMBOLS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "src-osx/Prefix.pch"; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_PEDANTIC = NO; GCC_WARN_SIGN_COMPARE = YES; HEADER_SEARCH_PATHS = ""; INFOPLIST_FILE = "src-osx/Info.plist"; INSTALL_PATH = "$(HOME)/Applications"; MACOSX_DEPLOYMENT_TARGET = 10.5; "MACOSX_DEPLOYMENT_TARGET[arch=x86_64]" = 10.5; PRODUCT_NAME = "Context Free"; SCAN_ALL_SOURCE_FILES_FOR_INCLUDES = NO; USER_HEADER_SEARCH_PATHS = /usr/local/include; VERSIONING_SYSTEM = "apple-generic"; WARNING_CFLAGS = "-Wall"; WRAPPER_EXTENSION = app; ZERO_LINK = YES; }; name = Development; }; FDB0D3D1085CEE00002FBEED /* Deployment */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = YES; CLANG_CXX_LIBRARY = "libstdc++"; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = YES; CURRENT_PROJECT_VERSION = 37; DEPLOYMENT_POSTPROCESSING = YES; GCC_GENERATE_DEBUGGING_SYMBOLS = NO; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "src-osx/Prefix.pch"; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_PEDANTIC = NO; GCC_WARN_SIGN_COMPARE = YES; HEADER_SEARCH_PATHS = ""; INFOPLIST_FILE = "src-osx/Info.plist"; INSTALL_PATH = "$(HOME)/Applications"; MACOSX_DEPLOYMENT_TARGET = 10.5; "MACOSX_DEPLOYMENT_TARGET[arch=x86_64]" = 10.5; PRODUCT_NAME = "Context Free"; SCAN_ALL_SOURCE_FILES_FOR_INCLUDES = NO; USER_HEADER_SEARCH_PATHS = /usr/local/include; VERSIONING_SYSTEM = "apple-generic"; WRAPPER_EXTENSION = app; ZERO_LINK = NO; }; name = Deployment; }; FDB0D3D4085CEE00002FBEED /* Development */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(ARCHS_STANDARD_64_BIT)"; GCC_FAST_MATH = YES; GCC_OBJC_CALL_CXX_CDTORS = YES; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_PEDANTIC = YES; GCC_WARN_STRICT_SELECTOR_MATCH = YES; MACOSX_DEPLOYMENT_TARGET = 10.4; "MACOSX_DEPLOYMENT_TARGET[arch=x86_64]" = 10.5; SDKROOT = macosx; WARNING_CFLAGS = "-Wall"; }; name = Development; }; FDB0D3D5085CEE00002FBEED /* Deployment */ = { isa = XCBuildConfiguration; buildSettings = { GCC_FAST_MATH = YES; GCC_OBJC_CALL_CXX_CDTORS = YES; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_PEDANTIC = YES; GCC_WARN_STRICT_SELECTOR_MATCH = YES; MACOSX_DEPLOYMENT_TARGET = 10.4; "MACOSX_DEPLOYMENT_TARGET[arch=x86_64]" = 10.5; SDKROOT = macosx; WARNING_CFLAGS = "-Wall"; }; name = Deployment; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 524D22AD13B9FEDC002732C2 /* Build configuration list for PBXNativeTarget "cfdg" */ = { isa = XCConfigurationList; buildConfigurations = ( 524D22A913B9FEBE002732C2 /* Development */, 524D22AA13B9FEBE002732C2 /* Deployment */, 524D22AB13B9FEBE002732C2 /* Universal */, 524D22AC13B9FEBE002732C2 /* Performance */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Development; }; FDB0D3CF085CEE00002FBEED /* Build configuration list for PBXNativeTarget "Context Free" */ = { isa = XCConfigurationList; buildConfigurations = ( FDB0D3D0085CEE00002FBEED /* Development */, FDB0D3D1085CEE00002FBEED /* Deployment */, FD6A132309B25B3000F4E1BC /* Universal */, 52086FBA0ABD19F6005EBDC1 /* Performance */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Development; }; FDB0D3D3085CEE00002FBEED /* Build configuration list for PBXProject "Context Free" */ = { isa = XCConfigurationList; buildConfigurations = ( FDB0D3D4085CEE00002FBEED /* Development */, FDB0D3D5085CEE00002FBEED /* Deployment */, FD6A132409B25B3000F4E1BC /* Universal */, 52086FBB0ABD19F6005EBDC1 /* Performance */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Development; }; /* End XCConfigurationList section */ }; rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; } contextfree-3.0.5+dfsg1.orig/Context Free.xcodeproj/project.xcworkspace/0000755000175000017500000000000012245646004024713 5ustar brambramcontextfree-3.0.5+dfsg1.orig/Context Free.xcodeproj/project.xcworkspace/contents.xcworkspacedata0000644000175000017500000000023512076364074031663 0ustar brambram contextfree-3.0.5+dfsg1.orig/ContextFreeCLI.vcxproj.filters0000644000175000017500000003141712076364074022311 0ustar brambram {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files contextfree-3.0.5+dfsg1.orig/.hgtags0000644000175000017500000000174512076364074015726 0ustar brambram4c2e28db05c00c42393b45dfa43074a4aa641473 Version3beta1 5ef3f964f9c11105346a6ca502dbc63fad23d511 Version3beta2 00c9065139a55da5452d5c121516b23c2030a745 Version3beta2again 57a41f69e2b089218c2d4c4474e11a34265516d5 Version3beta3 ad9a16c50b0ffe096a529a6c205be12fd877f6de Version3beta3again 31f3271efce8499081a5a199f6e7693d5a42e69c Version3beta4 8e5dc65637bbec9337abb7e9ec6ef7774178419f Version3beta4_1 8773e602dd2348cfff5b5549ebff43fcd5b20176 Version3beta4_2 649724fab4ad0918ffd763750706a4ff73d84f77 Version3beta4_3 a0a8c55f309e8f1a0804bddbf222ad0723d8411f Version3 f95c9db62e5515d95e5bccfea88b848a03e107a4 Version3_1 19ae2cbdc2f06f5f310903fd5b45691b942b74d7 Version3.0.1 e0b821351dbd363c6440e07546c91d9c7892f974 Version3.0.1_1 9a505dc8fc57893ca68e959fe0ca51dce23487f0 Version3.0.2 ec1486009d0822076635a522108f864bd2d2bf89 Version3.0.3 66ccf21600f0f5c6f3afe510927bfdb3f877d231 Version3.0.4 197f5679cb4e99ee7ad1c963c9c0d414a61a41f1 Version3.0.4_1 d4ee22164cdb0125098207aa3560e42374b0c1be Version3.0.4_2 contextfree-3.0.5+dfsg1.orig/input/0000755000175000017500000000000012245646004015572 5ustar brambramcontextfree-3.0.5+dfsg1.orig/input/i_curves.cfdg0000644000175000017500000007213712076364074020256 0ustar brambram// This is a library file that is included in other files // It offers a family of curves startshape test_i_curves shape curveright_0_9_5 rule { SQUARE [ ] curveright_0_9_5 [ rotate -5 size 0.9 x -0.0124921 y 0.909067 ] } shape curveright_0_9_4 rule { SQUARE [ ] curveright_0_9_4 [ rotate -4 size 0.9 x -0.0197055 y 0.917513 ] } shape curveright_0_9_3 rule { SQUARE [ ] curveright_0_9_3 [ rotate -3 size 0.9 x -0.0270653 y 0.925832 ] } shape curveright_0_9_2 rule { SQUARE [ ] curveright_0_9_2 [ rotate -2 size 0.9 x -0.0345691 y 0.934021 ] } shape curveright_0_9_1 rule { SQUARE [ ] curveright_0_9_1 [ rotate -1 size 0.9 x -0.0422147 y 0.942078 ] } shape curveleft_0_9_0 rule { SQUARE [ ] curveleft_0_9_0 [ rotate 0 size 0.9 x 0.0500008 y 0.950001 ] } shape curveleft_0_9_1 rule { SQUARE [ ] curveleft_0_9_1 [ rotate 1 size 0.9 x 0.0422158 y 0.942079 ] } shape curveleft_0_9_2 rule { SQUARE [ ] curveleft_0_9_2 [ rotate 2 size 0.9 x 0.0345701 y 0.934022 ] } shape curveleft_0_9_3 rule { SQUARE [ ] curveleft_0_9_3 [ rotate 3 size 0.9 x 0.0270664 y 0.925833 ] } shape curveleft_0_9_4 rule { SQUARE [ ] curveleft_0_9_4 [ rotate 4 size 0.9 x 0.0197066 y 0.917514 ] } shape curveleft_0_9_5 rule { SQUARE [ ] curveleft_0_9_5 [ rotate 5 size 0.9 x 0.0124931 y 0.909068 ] } shape curveright_0_91_5 rule { SQUARE [ ] curveright_0_91_5 [ rotate -5 size 0.91 x -0.00707531 y 0.913612 ] } shape curveright_0_91_4 rule { SQUARE [ ] curveright_0_91_4 [ rotate -4 size 0.91 x -0.0143689 y 0.922152 ] } shape curveright_0_91_3 rule { SQUARE [ ] curveright_0_91_3 [ rotate -3 size 0.91 x -0.0218104 y 0.930563 ] } shape curveright_0_91_2 rule { SQUARE [ ] curveright_0_91_2 [ rotate -2 size 0.91 x -0.0293976 y 0.938843 ] } shape curveright_0_91_1 rule { SQUARE [ ] curveright_0_91_1 [ rotate -1 size 0.91 x -0.0371282 y 0.94699 ] } shape curveleft_0_91_0 rule { SQUARE [ ] curveleft_0_91_0 [ rotate 0 size 0.91 x 0.0450008 y 0.955001 ] } shape curveleft_0_91_1 rule { SQUARE [ ] curveleft_0_91_1 [ rotate 1 size 0.91 x 0.0371293 y 0.946991 ] } shape curveleft_0_91_2 rule { SQUARE [ ] curveleft_0_91_2 [ rotate 2 size 0.91 x 0.0293987 y 0.938844 ] } shape curveleft_0_91_3 rule { SQUARE [ ] curveleft_0_91_3 [ rotate 3 size 0.91 x 0.0218115 y 0.930565 ] } shape curveleft_0_91_4 rule { SQUARE [ ] curveleft_0_91_4 [ rotate 4 size 0.91 x 0.01437 y 0.922153 ] } shape curveleft_0_91_5 rule { SQUARE [ ] curveleft_0_91_5 [ rotate 5 size 0.91 x 0.00707635 y 0.913614 ] } shape curveright_0_92_5 rule { SQUARE [ ] curveright_0_92_5 [ rotate -5 size 0.92 x -0.00165855 y 0.918158 ] } shape curveright_0_92_4 rule { SQUARE [ ] curveright_0_92_4 [ rotate -4 size 0.92 x -0.00903229 y 0.926791 ] } shape curveright_0_92_3 rule { SQUARE [ ] curveright_0_92_3 [ rotate -3 size 0.92 x -0.0165556 y 0.935295 ] } shape curveright_0_92_2 rule { SQUARE [ ] curveright_0_92_2 [ rotate -2 size 0.92 x -0.0242262 y 0.943666 ] } shape curveright_0_92_1 rule { SQUARE [ ] curveright_0_92_1 [ rotate -1 size 0.92 x -0.0320417 y 0.951902 ] } shape curveleft_0_92_0 rule { SQUARE [ ] curveleft_0_92_0 [ rotate 0 size 0.92 x 0.0400008 y 0.960001 ] } shape curveleft_0_92_1 rule { SQUARE [ ] curveleft_0_92_1 [ rotate 1 size 0.92 x 0.0320428 y 0.951903 ] } shape curveleft_0_92_2 rule { SQUARE [ ] curveleft_0_92_2 [ rotate 2 size 0.92 x 0.0242272 y 0.943667 ] } shape curveleft_0_92_3 rule { SQUARE [ ] curveleft_0_92_3 [ rotate 3 size 0.92 x 0.0165567 y 0.935296 ] } shape curveleft_0_92_4 rule { SQUARE [ ] curveleft_0_92_4 [ rotate 4 size 0.92 x 0.00903342 y 0.926793 ] } shape curveleft_0_92_5 rule { SQUARE [ ] curveleft_0_92_5 [ rotate 5 size 0.92 x 0.00165959 y 0.918159 ] } shape curveright_0_93_5 rule { SQUARE [ ] curveright_0_93_5 [ rotate -5 size 0.93 x 0.00375817 y 0.922703 ] } shape curveright_0_93_4 rule { SQUARE [ ] curveright_0_93_4 [ rotate -4 size 0.93 x -0.00369572 y 0.93143 ] } shape curveright_0_93_3 rule { SQUARE [ ] curveright_0_93_3 [ rotate -3 size 0.93 x -0.0113008 y 0.940026 ] } shape curveright_0_93_2 rule { SQUARE [ ] curveright_0_93_2 [ rotate -2 size 0.93 x -0.0190547 y 0.948488 ] } shape curveright_0_93_1 rule { SQUARE [ ] curveright_0_93_1 [ rotate -1 size 0.93 x -0.0269552 y 0.956814 ] } shape curveleft_0_93_0 rule { SQUARE [ ] curveleft_0_93_0 [ rotate 0 size 0.93 x 0.0350009 y 0.965001 ] } shape curveleft_0_93_1 rule { SQUARE [ ] curveleft_0_93_1 [ rotate 1 size 0.93 x 0.0269564 y 0.956815 ] } shape curveleft_0_93_2 rule { SQUARE [ ] curveleft_0_93_2 [ rotate 2 size 0.93 x 0.0190558 y 0.948489 ] } shape curveleft_0_93_3 rule { SQUARE [ ] curveleft_0_93_3 [ rotate 3 size 0.93 x 0.0113019 y 0.940027 ] } shape curveleft_0_93_4 rule { SQUARE [ ] curveleft_0_93_4 [ rotate 4 size 0.93 x 0.00369686 y 0.931432 ] } shape curveleft_0_93_5 rule { SQUARE [ ] curveleft_0_93_5 [ rotate 5 size 0.93 x -0.00375711 y 0.922704 ] } shape curveright_0_94_5 rule { SQUARE [ ] curveright_0_94_5 [ rotate -5 size 0.94 x 0.00917493 y 0.927248 ] } shape curveright_0_94_4 rule { SQUARE [ ] curveright_0_94_4 [ rotate -4 size 0.94 x 0.00164089 y 0.936069 ] } shape curveright_0_94_3 rule { SQUARE [ ] curveright_0_94_3 [ rotate -3 size 0.94 x -0.00604596 y 0.944758 ] } shape curveright_0_94_2 rule { SQUARE [ ] curveright_0_94_2 [ rotate -2 size 0.94 x -0.0138833 y 0.953311 ] } shape curveright_0_94_1 rule { SQUARE [ ] curveright_0_94_1 [ rotate -1 size 0.94 x -0.0218687 y 0.961725 ] } shape curveleft_0_94_0 rule { SQUARE [ ] curveleft_0_94_0 [ rotate 0 size 0.94 x 0.0300009 y 0.970001 ] } shape curveleft_0_94_1 rule { SQUARE [ ] curveleft_0_94_1 [ rotate 1 size 0.94 x 0.0218699 y 0.961727 ] } shape curveleft_0_94_2 rule { SQUARE [ ] curveleft_0_94_2 [ rotate 2 size 0.94 x 0.0138844 y 0.953312 ] } shape curveleft_0_94_3 rule { SQUARE [ ] curveleft_0_94_3 [ rotate 3 size 0.94 x 0.00604711 y 0.944759 ] } shape curveleft_0_94_4 rule { SQUARE [ ] curveleft_0_94_4 [ rotate 4 size 0.94 x -0.00163974 y 0.936071 ] } shape curveleft_0_94_5 rule { SQUARE [ ] curveleft_0_94_5 [ rotate 5 size 0.94 x -0.00917386 y 0.927249 ] } shape curveright_0_95_5 rule { SQUARE [ ] curveright_0_95_5 [ rotate -5 size 0.95 x 0.0145917 y 0.931793 ] } shape curveright_0_95_4 rule { SQUARE [ ] curveright_0_95_4 [ rotate -4 size 0.95 x 0.0069775 y 0.940708 ] } shape curveright_0_95_3 rule { SQUARE [ ] curveright_0_95_3 [ rotate -3 size 0.95 x 0 y 0.949489 ] } shape curveright_0_95_2 rule { SQUARE [ ] curveright_0_95_2 [ rotate -2 size 0.95 x -0.00871182 y 0.958133 ] } shape curveright_0_95_1 rule { SQUARE [ ] curveright_0_95_1 [ rotate -1 size 0.95 x -0.0167822 y 0.966637 ] } shape curveleft_0_95_0 rule { SQUARE [ ] curveleft_0_95_0 [ rotate 0 size 0.95 x 0.0250009 y 0.975001 ] } shape curveleft_0_95_1 rule { SQUARE [ ] curveleft_0_95_1 [ rotate 1 size 0.95 x 0.0167834 y 0.966639 ] } shape curveleft_0_95_2 rule { SQUARE [ ] curveleft_0_95_2 [ rotate 2 size 0.95 x 0.00871294 y 0.958134 ] } shape curveleft_0_95_3 rule { SQUARE [ ] curveleft_0_95_3 [ rotate 3 size 0.95 x 0 y 0.94949 ] } shape curveleft_0_95_4 rule { SQUARE [ ] curveleft_0_95_4 [ rotate 4 size 0.95 x -0.00697634 y 0.94071 ] } shape curveleft_0_95_5 rule { SQUARE [ ] curveleft_0_95_5 [ rotate 5 size 0.95 x -0.0145906 y 0.931794 ] } shape curveright_0_96_5 rule { SQUARE [ ] curveright_0_96_5 [ rotate -5 size 0.96 x 0.0200085 y 0.936338 ] } shape curveright_0_96_4 rule { SQUARE [ ] curveright_0_96_4 [ rotate -4 size 0.96 x 0.0123141 y 0.945347 ] } shape curveright_0_96_3 rule { SQUARE [ ] curveright_0_96_3 [ rotate -3 size 0.96 x 0.00446371 y 0.954221 ] } shape curveright_0_96_2 rule { SQUARE [ ] curveright_0_96_2 [ rotate -2 size 0.96 x -0.00354036 y 0.962956 ] } shape curveright_0_96_1 rule { SQUARE [ ] curveright_0_96_1 [ rotate -1 size 0.96 x -0.0116957 y 0.971549 ] } shape curveleft_0_96_0 rule { SQUARE [ ] curveleft_0_96_0 [ rotate 0 size 0.96 x 0.0200009 y 0.980001 ] } shape curveleft_0_96_1 rule { SQUARE [ ] curveleft_0_96_1 [ rotate 1 size 0.96 x 0.0116969 y 0.971551 ] } shape curveleft_0_96_2 rule { SQUARE [ ] curveleft_0_96_2 [ rotate 2 size 0.96 x 0.00354149 y 0.962957 ] } shape curveleft_0_96_3 rule { SQUARE [ ] curveleft_0_96_3 [ rotate 3 size 0.96 x -0.00446254 y 0.954222 ] } shape curveleft_0_96_4 rule { SQUARE [ ] curveleft_0_96_4 [ rotate 4 size 0.96 x -0.0123129 y 0.945349 ] } shape curveleft_0_96_5 rule { SQUARE [ ] curveleft_0_96_5 [ rotate 5 size 0.96 x -0.0200074 y 0.93634 ] } shape curveright_0_97_5 rule { SQUARE [ ] curveright_0_97_5 [ rotate -5 size 0.97 x 0.0254252 y 0.940884 ] } shape curveright_0_97_4 rule { SQUARE [ ] curveright_0_97_4 [ rotate -4 size 0.97 x 0.0176507 y 0.949986 ] } shape curveright_0_97_3 rule { SQUARE [ ] curveright_0_97_3 [ rotate -3 size 0.97 x 0.00971855 y 0.958952 ] } shape curveright_0_97_2 rule { SQUARE [ ] curveright_0_97_2 [ rotate -2 size 0.97 x 0.0016311 y 0.967778 ] } shape curveright_0_97_1 rule { SQUARE [ ] curveright_0_97_1 [ rotate -1 size 0.97 x -0.00660916 y 0.976461 ] } shape curveleft_0_97_0 rule { SQUARE [ ] curveleft_0_97_0 [ rotate 0 size 0.97 x 0.0150009 y 0.985001 ] } shape curveleft_0_97_1 rule { SQUARE [ ] curveleft_0_97_1 [ rotate 1 size 0.97 x 0.00661039 y 0.976463 ] } shape curveleft_0_97_2 rule { SQUARE [ ] curveleft_0_97_2 [ rotate 2 size 0.97 x -0.00162996 y 0.967779 ] } shape curveleft_0_97_3 rule { SQUARE [ ] curveleft_0_97_3 [ rotate 3 size 0.97 x -0.00971737 y 0.958953 ] } shape curveleft_0_97_4 rule { SQUARE [ ] curveleft_0_97_4 [ rotate 4 size 0.97 x -0.0176495 y 0.949988 ] } shape curveleft_0_97_5 rule { SQUARE [ ] curveleft_0_97_5 [ rotate 5 size 0.97 x -0.0254241 y 0.940885 ] } shape curveright_0_98_5 rule { SQUARE [ ] curveright_0_98_5 [ rotate -5 size 0.98 x 0.030842 y 0.945429 ] } shape curveright_0_98_4 rule { SQUARE [ ] curveright_0_98_4 [ rotate -4 size 0.98 x 0.0229873 y 0.954625 ] } shape curveright_0_98_3 rule { SQUARE [ ] curveright_0_98_3 [ rotate -3 size 0.98 x 0.0149734 y 0.963684 ] } shape curveright_0_98_2 rule { SQUARE [ ] curveright_0_98_2 [ rotate -2 size 0.98 x 0.00680257 y 0.9726 ] } shape curveright_0_98_1 rule { SQUARE [ ] curveright_0_98_1 [ rotate -1 size 0.98 x -0.00152265 y 0.981373 ] } shape curveleft_0_98_0 rule { SQUARE [ ] curveleft_0_98_0 [ rotate 0 size 0.98 x 0.0100009 y 0.990001 ] } shape curveleft_0_98_1 rule { SQUARE [ ] curveleft_0_98_1 [ rotate 1 size 0.98 x 0.00152389 y 0.981375 ] } shape curveleft_0_98_2 rule { SQUARE [ ] curveleft_0_98_2 [ rotate 2 size 0.98 x -0.00680141 y 0.972602 ] } shape curveleft_0_98_3 rule { SQUARE [ ] curveleft_0_98_3 [ rotate 3 size 0.98 x -0.0149722 y 0.963685 ] } shape curveleft_0_98_4 rule { SQUARE [ ] curveleft_0_98_4 [ rotate 4 size 0.98 x -0.0229861 y 0.954627 ] } shape curveleft_0_98_5 rule { SQUARE [ ] curveleft_0_98_5 [ rotate 5 size 0.98 x -0.0308409 y 0.94543 ] } shape curveright_0_99_5 rule { SQUARE [ ] curveright_0_99_5 [ rotate -5 size 0.99 x 0.0362587 y 0.949974 ] } shape curveright_0_99_4 rule { SQUARE [ ] curveright_0_99_4 [ rotate -4 size 0.99 x 0.028324 y 0.959264 ] } shape curveright_0_99_3 rule { SQUARE [ ] curveright_0_99_3 [ rotate -3 size 0.99 x 0.0202282 y 0.968415 ] } shape curveright_0_99_2 rule { SQUARE [ ] curveright_0_99_2 [ rotate -2 size 0.99 x 0.011974 y 0.977423 ] } shape curveright_0_99_1 rule { SQUARE [ ] curveright_0_99_1 [ rotate -1 size 0.99 x 0.00356386 y 0.986285 ] } shape curveleft_0_99_0 rule { SQUARE [ ] curveleft_0_99_0 [ rotate 0 size 0.99 x 0.0050009 y 0.995001 ] } shape curveleft_0_99_1 rule { SQUARE [ ] curveleft_0_99_1 [ rotate 1 size 0.99 x -0.00356261 y 0.986287 ] } shape curveleft_0_99_2 rule { SQUARE [ ] curveleft_0_99_2 [ rotate 2 size 0.99 x -0.0119729 y 0.977424 ] } shape curveleft_0_99_3 rule { SQUARE [ ] curveleft_0_99_3 [ rotate 3 size 0.99 x -0.020227 y 0.968416 ] } shape curveleft_0_99_4 rule { SQUARE [ ] curveleft_0_99_4 [ rotate 4 size 0.99 x -0.0283227 y 0.959266 ] } shape curveleft_0_99_5 rule { SQUARE [ ] curveleft_0_99_5 [ rotate 5 size 0.99 x -0.0362576 y 0.949975 ] } shape curveright_1_5 rule { SQUARE [ ] curveright_1_5 [ rotate -5 size 1 x 0.0416755 y 0.954519 ] } shape curveright_1_4 rule { SQUARE [ ] curveright_1_4 [ rotate -4 size 1 x 0.0336605 y 0.963903 ] } shape curveright_1_3 rule { SQUARE [ ] curveright_1_3 [ rotate -3 size 1 x 0.025483 y 0.973146 ] } shape curveright_1_2 rule { SQUARE [ ] curveright_1_2 [ rotate -2 size 1 x 0.0171454 y 0.982245 ] } shape curveright_1_1 rule { SQUARE [ ] curveright_1_1 [ rotate -1 size 1 x 0.00865033 y 0.991197 ] } shape curveleft_1_0 rule { SQUARE [ ] curveleft_1_0 [ rotate 0 size 1 x 0 y 1 ] } shape curveleft_1_1 rule { SQUARE [ ] curveleft_1_1 [ rotate 1 size 1 x -0.00864906 y 0.991199 ] } shape curveleft_1_2 rule { SQUARE [ ] curveleft_1_2 [ rotate 2 size 1 x -0.0171443 y 0.982247 ] } shape curveleft_1_3 rule { SQUARE [ ] curveleft_1_3 [ rotate 3 size 1 x -0.0254818 y 0.973148 ] } shape curveleft_1_4 rule { SQUARE [ ] curveleft_1_4 [ rotate 4 size 1 x -0.0336593 y 0.963905 ] } shape curveleft_1_5 rule { SQUARE [ ] curveleft_1_5 [ rotate 5 size 1 x -0.0416743 y 0.954521 ] } shape curveright_1_01_5 rule { SQUARE [ ] curveright_1_01_5 [ rotate -5 size 1.01 x 0.0470922 y 0.959064 ] } shape curveright_1_01_4 rule { SQUARE [ ] curveright_1_01_4 [ rotate -4 size 1.01 x 0.0389971 y 0.968542 ] } shape curveright_1_01_3 rule { SQUARE [ ] curveright_1_01_3 [ rotate -3 size 1.01 x 0.0307379 y 0.977878 ] } shape curveright_1_01_2 rule { SQUARE [ ] curveright_1_01_2 [ rotate -2 size 1.01 x 0.0223169 y 0.987068 ] } shape curveright_1_01_1 rule { SQUARE [ ] curveright_1_01_1 [ rotate -1 size 1.01 x 0.0137368 y 0.996109 ] } shape curveleft_1_01_0 rule { SQUARE [ ] curveleft_1_01_0 [ rotate 0 size 1.01 x -0.00499905 y 1.005 ] } shape curveleft_1_01_1 rule { SQUARE [ ] curveleft_1_01_1 [ rotate 1 size 1.01 x -0.0137356 y 0.996111 ] } shape curveleft_1_01_2 rule { SQUARE [ ] curveleft_1_01_2 [ rotate 2 size 1.01 x -0.0223157 y 0.987069 ] } shape curveleft_1_01_3 rule { SQUARE [ ] curveleft_1_01_3 [ rotate 3 size 1.01 x -0.0307366 y 0.977879 ] } shape curveleft_1_01_4 rule { SQUARE [ ] curveleft_1_01_4 [ rotate 4 size 1.01 x -0.0389959 y 0.968544 ] } shape curveleft_1_01_5 rule { SQUARE [ ] curveleft_1_01_5 [ rotate 5 size 1.01 x -0.0470911 y 0.959066 ] } shape curveright_1_02_5 rule { SQUARE [ ] curveright_1_02_5 [ rotate -5 size 1.02 x 0.0525089 y 0.96361 ] } shape curveright_1_02_4 rule { SQUARE [ ] curveright_1_02_4 [ rotate -4 size 1.02 x 0.0443337 y 0.973181 ] } shape curveright_1_02_3 rule { SQUARE [ ] curveright_1_02_3 [ rotate -3 size 1.02 x 0.0359927 y 0.982609 ] } shape curveright_1_02_2 rule { SQUARE [ ] curveright_1_02_2 [ rotate -2 size 1.02 x 0.0274883 y 0.99189 ] } shape curveright_1_02_1 rule { SQUARE [ ] curveright_1_02_1 [ rotate -1 size 1.02 x 0.0188233 y 1.00102 ] } shape curveleft_1_02_0 rule { SQUARE [ ] curveleft_1_02_0 [ rotate 0 size 1.02 x -0.00999901 y 1.01 ] } shape curveleft_1_02_1 rule { SQUARE [ ] curveleft_1_02_1 [ rotate 1 size 1.02 x -0.018822 y 1.00102 ] } shape curveleft_1_02_2 rule { SQUARE [ ] curveleft_1_02_2 [ rotate 2 size 1.02 x -0.0274871 y 0.991892 ] } shape curveleft_1_02_3 rule { SQUARE [ ] curveleft_1_02_3 [ rotate 3 size 1.02 x -0.0359914 y 0.982611 ] } shape curveleft_1_02_4 rule { SQUARE [ ] curveleft_1_02_4 [ rotate 4 size 1.02 x -0.0443325 y 0.973183 ] } shape curveleft_1_02_5 rule { SQUARE [ ] curveleft_1_02_5 [ rotate 5 size 1.02 x -0.0525078 y 0.963611 ] } shape curveright_1_03_5 rule { SQUARE [ ] curveright_1_03_5 [ rotate -5 size 1.03 x 0.0579257 y 0.968155 ] } shape curveright_1_03_4 rule { SQUARE [ ] curveright_1_03_4 [ rotate -4 size 1.03 x 0.0496704 y 0.977821 ] } shape curveright_1_03_3 rule { SQUARE [ ] curveright_1_03_3 [ rotate -3 size 1.03 x 0.0412475 y 0.987341 ] } shape curveright_1_03_2 rule { SQUARE [ ] curveright_1_03_2 [ rotate -2 size 1.03 x 0.0326598 y 0.996713 ] } shape curveright_1_03_1 rule { SQUARE [ ] curveright_1_03_1 [ rotate -1 size 1.03 x 0.0239099 y 1.00593 ] } shape curveleft_1_03_0 rule { SQUARE [ ] curveleft_1_03_0 [ rotate 0 size 1.03 x -0.014999 y 1.015 ] } shape curveleft_1_03_1 rule { SQUARE [ ] curveleft_1_03_1 [ rotate 1 size 1.03 x -0.0239086 y 1.00593 ] } shape curveleft_1_03_2 rule { SQUARE [ ] curveleft_1_03_2 [ rotate 2 size 1.03 x -0.0326586 y 0.996714 ] } shape curveleft_1_03_3 rule { SQUARE [ ] curveleft_1_03_3 [ rotate 3 size 1.03 x -0.0412463 y 0.987342 ] } shape curveleft_1_03_4 rule { SQUARE [ ] curveleft_1_03_4 [ rotate 4 size 1.03 x -0.0496691 y 0.977822 ] } shape curveleft_1_03_5 rule { SQUARE [ ] curveleft_1_03_5 [ rotate 5 size 1.03 x -0.0579246 y 0.968156 ] } shape curveright_1_04_5 rule { SQUARE [ ] curveright_1_04_5 [ rotate -5 size 1.04 x 0.0633425 y 0.9727 ] } shape curveright_1_04_4 rule { SQUARE [ ] curveright_1_04_4 [ rotate -4 size 1.04 x 0.0550069 y 0.98246 ] } shape curveright_1_04_3 rule { SQUARE [ ] curveright_1_04_3 [ rotate -3 size 1.04 x 0.0465023 y 0.992072 ] } shape curveright_1_04_2 rule { SQUARE [ ] curveright_1_04_2 [ rotate -2 size 1.04 x 0.0378313 y 1.00154 ] } shape curveright_1_04_1 rule { SQUARE [ ] curveright_1_04_1 [ rotate -1 size 1.04 x 0.0289963 y 1.01085 ] } shape curveleft_1_04_0 rule { SQUARE [ ] curveleft_1_04_0 [ rotate 0 size 1.04 x -0.019999 y 1.02 ] } shape curveleft_1_04_1 rule { SQUARE [ ] curveleft_1_04_1 [ rotate 1 size 1.04 x -0.028995 y 1.01085 ] } shape curveleft_1_04_2 rule { SQUARE [ ] curveleft_1_04_2 [ rotate 2 size 1.04 x -0.03783 y 1.00154 ] } shape curveleft_1_04_3 rule { SQUARE [ ] curveleft_1_04_3 [ rotate 3 size 1.04 x -0.0465011 y 0.992074 ] } shape curveleft_1_04_4 rule { SQUARE [ ] curveleft_1_04_4 [ rotate 4 size 1.04 x -0.0550057 y 0.982461 ] } shape curveleft_1_04_5 rule { SQUARE [ ] curveleft_1_04_5 [ rotate 5 size 1.04 x -0.0633413 y 0.972701 ] } shape curveright_1_05_5 rule { SQUARE [ ] curveright_1_05_5 [ rotate -5 size 1.05 x 0.0687592 y 0.977245 ] } shape curveright_1_05_4 rule { SQUARE [ ] curveright_1_05_4 [ rotate -4 size 1.05 x 0.0603435 y 0.987099 ] } shape curveright_1_05_3 rule { SQUARE [ ] curveright_1_05_3 [ rotate -3 size 1.05 x 0.0517571 y 0.996804 ] } shape curveright_1_05_2 rule { SQUARE [ ] curveright_1_05_2 [ rotate -2 size 1.05 x 0.0430027 y 1.00636 ] } shape curveright_1_05_1 rule { SQUARE [ ] curveright_1_05_1 [ rotate -1 size 1.05 x 0.0340828 y 1.01576 ] } shape curveleft_1_05_0 rule { SQUARE [ ] curveleft_1_05_0 [ rotate 0 size 1.05 x -0.024999 y 1.025 ] } shape curveleft_1_05_1 rule { SQUARE [ ] curveleft_1_05_1 [ rotate 1 size 1.05 x -0.0340815 y 1.01576 ] } shape curveleft_1_05_2 rule { SQUARE [ ] curveleft_1_05_2 [ rotate 2 size 1.05 x -0.0430014 y 1.00636 ] } shape curveleft_1_05_3 rule { SQUARE [ ] curveleft_1_05_3 [ rotate 3 size 1.05 x -0.0517558 y 0.996805 ] } shape curveleft_1_05_4 rule { SQUARE [ ] curveleft_1_05_4 [ rotate 4 size 1.05 x -0.0603422 y 0.9871 ] } shape curveleft_1_05_5 rule { SQUARE [ ] curveleft_1_05_5 [ rotate 5 size 1.05 x -0.068758 y 0.977246 ] } shape curveright_1_06_5 rule { SQUARE [ ] curveright_1_06_5 [ rotate -5 size 1.06 x 0.074176 y 0.98179 ] } shape curveright_1_06_4 rule { SQUARE [ ] curveright_1_06_4 [ rotate -4 size 1.06 x 0.0656802 y 0.991738 ] } shape curveright_1_06_3 rule { SQUARE [ ] curveright_1_06_3 [ rotate -3 size 1.06 x 0.057012 y 1.00154 ] } shape curveright_1_06_2 rule { SQUARE [ ] curveright_1_06_2 [ rotate -2 size 1.06 x 0.0481742 y 1.01118 ] } shape curveright_1_06_1 rule { SQUARE [ ] curveright_1_06_1 [ rotate -1 size 1.06 x 0.0391693 y 1.02067 ] } shape curveleft_1_06_0 rule { SQUARE [ ] curveleft_1_06_0 [ rotate 0 size 1.06 x -0.029999 y 1.03 ] } shape curveleft_1_06_1 rule { SQUARE [ ] curveleft_1_06_1 [ rotate 1 size 1.06 x -0.039168 y 1.02067 ] } shape curveleft_1_06_2 rule { SQUARE [ ] curveleft_1_06_2 [ rotate 2 size 1.06 x -0.0481729 y 1.01118 ] } shape curveleft_1_06_3 rule { SQUARE [ ] curveleft_1_06_3 [ rotate 3 size 1.06 x -0.0570107 y 1.00154 ] } shape curveleft_1_06_4 rule { SQUARE [ ] curveleft_1_06_4 [ rotate 4 size 1.06 x -0.0656789 y 0.991739 ] } shape curveleft_1_06_5 rule { SQUARE [ ] curveleft_1_06_5 [ rotate 5 size 1.06 x -0.0741748 y 0.981792 ] } shape curveright_1_07_5 rule { SQUARE [ ] curveright_1_07_5 [ rotate -5 size 1.07 x 0.0795927 y 0.986336 ] } shape curveright_1_07_4 rule { SQUARE [ ] curveright_1_07_4 [ rotate -4 size 1.07 x 0.0710168 y 0.996377 ] } shape curveright_1_07_3 rule { SQUARE [ ] curveright_1_07_3 [ rotate -3 size 1.07 x 0.0622668 y 1.00627 ] } shape curveright_1_07_2 rule { SQUARE [ ] curveright_1_07_2 [ rotate -2 size 1.07 x 0.0533456 y 1.016 ] } shape curveright_1_07_1 rule { SQUARE [ ] curveright_1_07_1 [ rotate -1 size 1.07 x 0.0442559 y 1.02558 ] } shape curveleft_1_07_0 rule { SQUARE [ ] curveleft_1_07_0 [ rotate 0 size 1.07 x -0.034999 y 1.035 ] } shape curveleft_1_07_1 rule { SQUARE [ ] curveleft_1_07_1 [ rotate 1 size 1.07 x -0.0442545 y 1.02558 ] } shape curveleft_1_07_2 rule { SQUARE [ ] curveleft_1_07_2 [ rotate 2 size 1.07 x -0.0533444 y 1.016 ] } shape curveleft_1_07_3 rule { SQUARE [ ] curveleft_1_07_3 [ rotate 3 size 1.07 x -0.0622655 y 1.00627 ] } shape curveleft_1_07_4 rule { SQUARE [ ] curveleft_1_07_4 [ rotate 4 size 1.07 x -0.0710155 y 0.996378 ] } shape curveleft_1_07_5 rule { SQUARE [ ] curveleft_1_07_5 [ rotate 5 size 1.07 x -0.0795915 y 0.986337 ] } shape curveright_1_08_5 rule { SQUARE [ ] curveright_1_08_5 [ rotate -5 size 1.08 x 0.0850095 y 0.990881 ] } shape curveright_1_08_4 rule { SQUARE [ ] curveright_1_08_4 [ rotate -4 size 1.08 x 0.0763534 y 1.00102 ] } shape curveright_1_08_3 rule { SQUARE [ ] curveright_1_08_3 [ rotate -3 size 1.08 x 0.0675217 y 1.011 ] } shape curveright_1_08_2 rule { SQUARE [ ] curveright_1_08_2 [ rotate -2 size 1.08 x 0.0585171 y 1.02083 ] } shape curveright_1_08_1 rule { SQUARE [ ] curveright_1_08_1 [ rotate -1 size 1.08 x 0.0493424 y 1.03049 ] } shape curveleft_1_08_0 rule { SQUARE [ ] curveleft_1_08_0 [ rotate 0 size 1.08 x -0.039999 y 1.04 ] } shape curveleft_1_08_1 rule { SQUARE [ ] curveleft_1_08_1 [ rotate 1 size 1.08 x -0.049341 y 1.03049 ] } shape curveleft_1_08_2 rule { SQUARE [ ] curveleft_1_08_2 [ rotate 2 size 1.08 x -0.0585158 y 1.02083 ] } shape curveleft_1_08_3 rule { SQUARE [ ] curveleft_1_08_3 [ rotate 3 size 1.08 x -0.0675204 y 1.011 ] } shape curveleft_1_08_4 rule { SQUARE [ ] curveleft_1_08_4 [ rotate 4 size 1.08 x -0.0763521 y 1.00102 ] } shape curveleft_1_08_5 rule { SQUARE [ ] curveleft_1_08_5 [ rotate 5 size 1.08 x -0.0850083 y 0.990882 ] } shape curveright_1_09_5 rule { SQUARE [ ] curveright_1_09_5 [ rotate -5 size 1.09 x 0.0904263 y 0.995426 ] } shape curveright_1_09_4 rule { SQUARE [ ] curveright_1_09_4 [ rotate -4 size 1.09 x 0.08169 y 1.00565 ] } shape curveright_1_09_3 rule { SQUARE [ ] curveright_1_09_3 [ rotate -3 size 1.09 x 0.0727765 y 1.01573 ] } shape curveright_1_09_2 rule { SQUARE [ ] curveright_1_09_2 [ rotate -2 size 1.09 x 0.0636886 y 1.02565 ] } shape curveright_1_09_1 rule { SQUARE [ ] curveright_1_09_1 [ rotate -1 size 1.09 x 0.0544289 y 1.03541 ] } shape curveleft_1_09_0 rule { SQUARE [ ] curveleft_1_09_0 [ rotate 0 size 1.09 x -0.044999 y 1.045 ] } shape curveleft_1_09_1 rule { SQUARE [ ] curveleft_1_09_1 [ rotate 1 size 1.09 x -0.0544275 y 1.03541 ] } shape curveleft_1_09_2 rule { SQUARE [ ] curveleft_1_09_2 [ rotate 2 size 1.09 x -0.0636873 y 1.02565 ] } shape curveleft_1_09_3 rule { SQUARE [ ] curveleft_1_09_3 [ rotate 3 size 1.09 x -0.0727752 y 1.01573 ] } shape curveleft_1_09_4 rule { SQUARE [ ] curveleft_1_09_4 [ rotate 4 size 1.09 x -0.0816887 y 1.00566 ] } shape curveleft_1_09_5 rule { SQUARE [ ] curveleft_1_09_5 [ rotate 5 size 1.09 x -0.090425 y 0.995427 ] } shape curveright_1_1_5 rule { SQUARE [ ] curveright_1_1_5 [ rotate -5 size 1.1 x 0.095843 y 0.999971 ] } shape curveright_1_1_4 rule { SQUARE [ ] curveright_1_1_4 [ rotate -4 size 1.1 x 0.0870266 y 1.01029 ] } shape curveright_1_1_3 rule { SQUARE [ ] curveright_1_1_3 [ rotate -3 size 1.1 x 0.0780314 y 1.02046 ] } shape curveright_1_1_2 rule { SQUARE [ ] curveright_1_1_2 [ rotate -2 size 1.1 x 0.06886 y 1.03047 ] } shape curveright_1_1_1 rule { SQUARE [ ] curveright_1_1_1 [ rotate -1 size 1.1 x 0.0595154 y 1.04032 ] } shape curveleft_1_1_0 rule { SQUARE [ ] curveleft_1_1_0 [ rotate 0 size 1.1 x -0.049999 y 1.05 ] } shape curveleft_1_1_1 rule { SQUARE [ ] curveleft_1_1_1 [ rotate 1 size 1.1 x -0.059514 y 1.04032 ] } shape curveleft_1_1_2 rule { SQUARE [ ] curveleft_1_1_2 [ rotate 2 size 1.1 x -0.0688587 y 1.03047 ] } shape curveleft_1_1_3 rule { SQUARE [ ] curveleft_1_1_3 [ rotate 3 size 1.1 x -0.07803 y 1.02046 ] } shape curveleft_1_1_4 rule { SQUARE [ ] curveleft_1_1_4 [ rotate 4 size 1.1 x -0.0870253 y 1.0103 ] } shape curveleft_1_1_5 rule { SQUARE [ ] curveleft_1_1_5 [ rotate 5 size 1.1 x -0.0958418 y 0.999973 ] } shape test_i_curves rule { test_i_curves_0_9 [ x -35 y -40 ] test_i_curves_0_91 [ x 0 y -40 ] test_i_curves_0_92 [ x 35 y -40 ] test_i_curves_0_93 [ x -40 y -20 ] test_i_curves_0_94 [ x 0 y -20 ] test_i_curves_0_95 [ x 40 y -20 ] test_i_curves_0_96 [ x -55 y 0 ] test_i_curves_0_97 [ x 0 y 0 ] test_i_curves_0_98 [ x 55 y 0 ] test_i_curves_0_99 [ x 0 y 40 ] } shape test_i_curves_0_9 rule { curveright_0_9_5 [ x 10 ] curveright_0_9_4 [ x 8 ] curveright_0_9_3 [ x 6 ] curveright_0_9_2 [ x 4 ] curveright_0_9_1 [ x 2 ] curveleft_0_9_0 [ ] curveleft_0_9_1 [ x -2 ] curveleft_0_9_2 [ x -4 ] curveleft_0_9_3 [ x -6 ] curveleft_0_9_4 [ x -8 ] curveleft_0_9_5 [ x -10 ] } shape test_i_curves_0_91 rule { curveright_0_91_5 [ x 10 ] curveright_0_91_4 [ x 8 ] curveright_0_91_3 [ x 6 ] curveright_0_91_2 [ x 4 ] curveright_0_91_1 [ x 2 ] curveleft_0_91_0 [ ] curveleft_0_91_1 [ x -2 ] curveleft_0_91_2 [ x -4 ] curveleft_0_91_3 [ x -6 ] curveleft_0_91_4 [ x -8 ] curveleft_0_91_5 [ x -10 ] } shape test_i_curves_0_92 rule { curveright_0_92_5 [ x 10 ] curveright_0_92_4 [ x 8 ] curveright_0_92_3 [ x 6 ] curveright_0_92_2 [ x 4 ] curveright_0_92_1 [ x 2 ] curveleft_0_92_0 [ ] curveleft_0_92_1 [ x -2 ] curveleft_0_92_2 [ x -4 ] curveleft_0_92_3 [ x -6 ] curveleft_0_92_4 [ x -8 ] curveleft_0_92_5 [ x -10 ] } shape test_i_curves_0_93 rule { curveright_0_93_5 [ x 10 ] curveright_0_93_4 [ x 8 ] curveright_0_93_3 [ x 6 ] curveright_0_93_2 [ x 4 ] curveright_0_93_1 [ x 2 ] curveleft_0_93_0 [ ] curveleft_0_93_1 [ x -2 ] curveleft_0_93_2 [ x -4 ] curveleft_0_93_3 [ x -6 ] curveleft_0_93_4 [ x -8 ] curveleft_0_93_5 [ x -10 ] } shape test_i_curves_0_94 rule { curveright_0_94_5 [ x 10 ] curveright_0_94_4 [ x 8 ] curveright_0_94_3 [ x 6 ] curveright_0_94_2 [ x 4 ] curveright_0_94_1 [ x 2 ] curveleft_0_94_0 [ ] curveleft_0_94_1 [ x -2 ] curveleft_0_94_2 [ x -4 ] curveleft_0_94_3 [ x -6 ] curveleft_0_94_4 [ x -8 ] curveleft_0_94_5 [ x -10 ] } shape test_i_curves_0_95 rule { curveright_0_95_5 [ x 10 ] curveright_0_95_4 [ x 8 ] curveright_0_95_3 [ x 6 ] curveright_0_95_2 [ x 4 ] curveright_0_95_1 [ x 2 ] curveleft_0_95_0 [ ] curveleft_0_95_1 [ x -2 ] curveleft_0_95_2 [ x -4 ] curveleft_0_95_3 [ x -6 ] curveleft_0_95_4 [ x -8 ] curveleft_0_95_5 [ x -10 ] } shape test_i_curves_0_96 rule { curveright_0_96_5 [ x 10 ] curveright_0_96_4 [ x 8 ] curveright_0_96_3 [ x 6 ] curveright_0_96_2 [ x 4 ] curveright_0_96_1 [ x 2 ] curveleft_0_96_0 [ ] curveleft_0_96_1 [ x -2 ] curveleft_0_96_2 [ x -4 ] curveleft_0_96_3 [ x -6 ] curveleft_0_96_4 [ x -8 ] curveleft_0_96_5 [ x -10 ] } shape test_i_curves_0_97 rule { curveright_0_97_5 [ x 10 ] curveright_0_97_4 [ x 8 ] curveright_0_97_3 [ x 6 ] curveright_0_97_2 [ x 4 ] curveright_0_97_1 [ x 2 ] curveleft_0_97_0 [ ] curveleft_0_97_1 [ x -2 ] curveleft_0_97_2 [ x -4 ] curveleft_0_97_3 [ x -6 ] curveleft_0_97_4 [ x -8 ] curveleft_0_97_5 [ x -10 ] } shape test_i_curves_0_98 rule { curveright_0_98_5 [ x 10 ] curveright_0_98_4 [ x 8 ] curveright_0_98_3 [ x 6 ] curveright_0_98_2 [ x 4 ] curveright_0_98_1 [ x 2 ] curveleft_0_98_0 [ ] curveleft_0_98_1 [ x -2 ] curveleft_0_98_2 [ x -4 ] curveleft_0_98_3 [ x -6 ] curveleft_0_98_4 [ x -8 ] curveleft_0_98_5 [ x -10 ] } shape test_i_curves_0_99 rule { curveright_0_99_5 [ x 10 ] curveright_0_99_4 [ x 8 ] curveright_0_99_3 [ x 6 ] curveright_0_99_2 [ x 4 ] curveright_0_99_1 [ x 2 ] curveleft_0_99_0 [ ] curveleft_0_99_1 [ x -2 ] curveleft_0_99_2 [ x -4 ] curveleft_0_99_3 [ x -6 ] curveleft_0_99_4 [ x -8 ] curveleft_0_99_5 [ x -10 ] } contextfree-3.0.5+dfsg1.orig/input/alphabet.cfdg0000644000175000017500000000276312076364074020215 0ustar brambram startshape SEED include i_pix.cfdg rule SEED { LEFTCURVELETTER {} } rule SEED { RIGHTCURVELETTER {} } rule RIGHTCURVELETTER {THING {} RIGHTCURVELETTER {x 2 rotate -9 size 0.98}} rule RIGHTCURVELETTER {THING {} RIGHTCURVELETTER {x 2 rotate -9 size 0.97}} rule RIGHTCURVELETTER {THING {} RIGHTCURVELETTER {x 2 rotate -9 size 0.97}} rule RIGHTCURVELETTER {THING {} RIGHTCURVELETTER {x 2 rotate -9 size 0.97}} rule RIGHTCURVELETTER {THING {} RIGHTCURVELETTER {x 2 rotate -9 size 0.97}} rule RIGHTCURVELETTER {THING {} RIGHTCURVELETTER {x 2 rotate -9 size 0.99}} rule RIGHTCURVELETTER {THING {} RIGHTCURVELETTER {x 2 rotate -9 size 0.99}} rule RIGHTCURVELETTER {THING {} RIGHTCURVELETTER {x 2 rotate -9 size 0.98}} rule RIGHTCURVELETTER {THING {} RIGHTCURVELETTER {x 2 rotate -9 size 0.99}} rule RIGHTCURVELETTER {LEFTCURVELETTER {}} rule RIGHTCURVELETTER {MAYBESPLIT {}} rule LEFTCURVELETTER {THING {} LEFTCURVELETTER {x 2 rotate 15 size 0.97}} rule LEFTCURVELETTER {THING {} LEFTCURVELETTER {x 2 rotate 15 size 0.97}} rule LEFTCURVELETTER {THING {} LEFTCURVELETTER {x 2 rotate 15 size 0.96}} rule LEFTCURVELETTER {THING {} LEFTCURVELETTER {x 2 rotate 15 size 0.96}} rule LEFTCURVELETTER {RIGHTCURVELETTER {}} rule LEFTCURVELETTER {RIGHTCURVELETTER {}} rule LEFTCURVELETTER {MAYBESPLIT {}} rule LEFTCURVELETTER {MAYBESPLIT {}} rule MAYBESPLIT {LEFTCURVELETTER {}} rule MAYBESPLIT {RIGHTCURVELETTER {}} rule MAYBESPLIT { LEFTCURVELETTER {y 1.1} RIGHTCURVELETTER {y -1.1} } rule THING { RANDOM_LETTER_5by5 {} } contextfree-3.0.5+dfsg1.orig/input/xmas.cfdg0000644000175000017500000000173112076364074017377 0ustar brambramstartshape Tree rule Tree { Pine { } Star { y 16 b 0.5 s 0.5 } CandlesL { y 3 s 0.8 } CandlesR { y 3.5 s 0.8 } } rule Pine { Trunk { } BranchesL { y 3 s 0.8 } BranchesR { y 3.5 s 0.8 } } rule Trunk { SQUARE { } Trunk { y 0.4 s 0.975 } } rule BranchesL { Pine { r 80 s 0.5 } BranchesL { y 3 s 0.815 } } rule BranchesR { Pine { r -80 s 0.5 } BranchesR { y 3 s 0.81 } } rule CandlesL { Candle { x -6.5 y 1.2 s 0.4 } CandlesL { y 3 s 0.815 } } rule CandlesR { Candle { x 6.5 y 1.2 s 0.4 } CandlesR { y 3 s 0.81 } } rule Candle { SQUARE { y 0 } SQUARE { y 0.7 } SQUARE { y 1.4 } SQUARE { y 2 } Flame { y 3.1 b 0.3 } Ray { y 3.6 s 0.5 b 0.5 } } rule Flame { CIRCLE { } Flame { y 0.15 s 0.9 b 0.1 r 2 } } rule Star { Arm { r 0 } Arm { r 72 } Arm { r 144 } Arm { r -72 } Arm { r -144 } Ray { b 0.7 r 180 } } rule Arm { CIRCLE { } Arm { y 0.1 s 0.9 } } rule Ray { Line { y 8 s 0.2 } Ray { r -36 s 0.97 } } rule Line { SQUARE { } Line { y 0.8 s 0.9 } } contextfree-3.0.5+dfsg1.orig/input/rendering-tests.cfdg0000644000175000017500000001033212076364074021541 0ustar brambramstartshape Tests rule Tests { // borders should be 8 pixels beyond these pins Pin { x 0 y 0 r 135 s 0.5 } Pin { x 20 y 0 r -135 s 0.5 } Pin { x 0 y 20 r 45 s 0.5 } Pin { x 20 y 20 r -45 s 0.5 } // top row, left to right TouchingTestsSized { x 2 y 5.5 } TouchingTestsRotated { x 7.5 y 5.5 } SizeTests { x 11 y 17 s 0.5 r -90 } SquareEdge { x 13 y 6 } CircleLine { x 15 y 6 } BrightnessLines { x 17 y 6 } // bottom row TouchingTestsJittered { x 1.5 y 2 b 0.5 } } rule TouchingTestsSized { TouchingTests { x 0 } TouchingTests { y 5 s 0.7 } TouchingTests { y 8.5 s 0.4 } } rule TouchingTestsRotated { TouchingTests { x 0 y 9 s 0.4 r 45 } TouchingTests { x 0 y 6.5 s 0.4 r 30 } TouchingTests { x 0 y 4.2 s 0.4 r 15 } TouchingTests { x 0 y 2 s 0.4 r 5 } TouchingTests { x 0 y -0.25 s 0.4 r 2 } } rule TouchingTestsJittered { // at 2000pixels, 1 unit = 100pixels // important: there should be no scaling between the startshape and here! // optimally, only the rightmost pair should touch TouchPair { x 00 y 0.0200 } // 2 pixel gap TouchPair { x 01 y 0.0150 } // 1.5 pixel gap TouchPair { x 02 y 0.0100 } // 1 pixel gap TouchPair { x 03 y 0.0090 } TouchPair { x 04 y 0.0080 } TouchPair { x 05 y 0.0070 } TouchPair { x 06 y 0.0060 } TouchPair { x 07 y 0.0050 } TouchPair { x 08 y 0.0040 } TouchPair { x 09 y 0.0030 } TouchPair { x 10 y 0.0020 } TouchPair { x 11 y 0.0010 } TouchPair { x 12 y 0.0000 } // exact TouchFixed { x 00 } TouchFixed { x 01 } TouchFixed { x 02 } TouchFixed { x 03 } TouchFixed { x 04 } TouchFixed { x 05 } TouchFixed { x 06 } TouchFixed { x 07 } TouchFixed { x 08 } TouchFixed { x 09 } TouchFixed { x 10 } TouchFixed { x 11 } TouchFixed { x 12 } } rule TouchPair { SQUARE { x 0 y 0.0 s 0.5 b 0.0 } SQUARE { x 0 y 0.5 s 0.5 b 0.0 } } rule TouchFixed { SQUARE { x 0 y 1 s 0.5 b 0.0 } } rule TouchingTests { SquareAbutTest { x 0 y 2.5 } OverlapTest { x 3 y 2.5 } CircleAbutTest { x 0 y 0 } CircleInSquaresTest { x 3 y 0 } } rule SquareAbutTest { // there should be no white showing between these SQUARE { x -0.5 } SQUARE { x 0.5 } SQUARE { y 1 } } rule CircleInSquaresTest { // the circle should just touch the squares CIRCLE { } SQUARE { x -1 } SQUARE { x 1 } SQUARE { y 1 } } rule CircleAbutTest { // the circles should just touch CIRCLE { x -0.5 } CIRCLE { x 0.5 } CIRCLE { y 1 x -0.5 } CIRCLE { y 1 x 0.5 } } rule OverlapTest { // center should be a clean cross-hair SQUARE { x -0.5 } SQUARE { x 0.5 b 0.5 } SQUARE { x -0.5 y 1 b 0.75 } SQUARE { x 0.5 y 1 b 0.25 } } rule SizeTests { // the progression of shapes should appear smooth SizeSquareTests { y -0.75 } SizeCircleTests { y 0.75 } } rule SizeCircleTests { CIRCLE { } SizeCircleTests { x 2.25 s 0.90 } } rule SizeSquareTests { SQUARE { } SizeSquareTests { x 2.25 s 0.90 } } rule SquareEdge { // there should be no white space between the squares as they get smaller, and the right edge should be a straight line SQUARE { } SquareEdge { y 0.95 x 0.05 s 0.90 } } rule CircleLine { // the circles should just touch as they get smaller CIRCLE { } CircleLine { y 0.95 s 0.90 } } rule BrightnessLines { BrightnessLinePerCent { x 0 } BrightnessLineHex { x 0.84375 y -0.15625 s 0.6875 } Pin { x -0.5 y 10.5 r -135 s 0.25 } Pin { x 1.1875 y 10.5 r 135 s 0.25 } } rule BrightnessLinePerCent { // eleven even gradations from white to black SQUARE { b 0.0 y 0 } SQUARE { b 0.1 y 1 } SQUARE { b 0.2 y 2 } SQUARE { b 0.3 y 3 } SQUARE { b 0.4 y 4 } SQUARE { b 0.5 y 5 } SQUARE { b 0.6 y 6 } SQUARE { b 0.7 y 7 } SQUARE { b 0.8 y 8 } SQUARE { b 0.9 y 9 } SQUARE { b 1.0 y 10 } } rule BrightnessLineHex { // sixteen even gradations from white to black SQUARE { b 0.0 y 0 } SQUARE { b 0.0666666667 y 1 } SQUARE { b 0.1333333333 y 2 } SQUARE { b 0.2000000000 y 3 } SQUARE { b 0.2666666667 y 4 } SQUARE { b 0.3333333333 y 5 } SQUARE { b 0.4000000000 y 6 } SQUARE { b 0.4666666667 y 7 } SQUARE { b 0.5333333333 y 8 } SQUARE { b 0.6000000000 y 9 } SQUARE { b 0.6666666667 y 10 } SQUARE { b 0.7333333333 y 11 } SQUARE { b 0.8000000000 y 12 } SQUARE { b 0.8666666667 y 13 } SQUARE { b 0.9333333333 y 14 } SQUARE { b 1.0000000000 y 15 } } rule Pin { PinLine { y -1 s 0.2 } } rule PinLine { CIRCLE { } PinLine { y 0.25 s 0.95 } } contextfree-3.0.5+dfsg1.orig/input/tree_number_5.cfdg0000644000175000017500000000071312076364074021161 0ustar brambramstartshape SEED1 rule SEED1 { SQUARE{} SEED1 {y 1.0 size 0.99 rotate 1.5 brightness 0.02} } rule SEED1 0.05 {SEED2 {}} rule SEED2 { SQUARE{} SEED2 {y 1.0 size 0.99 rotate -1.5} } rule SEED1 0.05 { SQUARE{} SEED2 {y 1.0 size 0.99 rotate 1.5} SEED1 {y 1.0 size 0.6 rotate -60} SEED2 {y 1.0 size 0.5 rotate 60} } rule SEED2 0.05 { SQUARE{} SEED1 {y 1.0 size 0.99 rotate 1.5} SEED2 {y 1.0 size 0.6 rotate -60} SEED1 {y 1.0 size 0.5 rotate 60} } contextfree-3.0.5+dfsg1.orig/input/line_ending_tests.tgz0000644000175000017500000000064512076364074022030 0ustar brambram-DJ0{j$Yv* <<u˶bWiQwۮT2`ݔ}IyhDI"U2lauq(Gu{Ũ` ECl#UX+?~Zޥ 'jJ_CێӰ kLDz lrU=kPW*xA*Z\Oz[0hxZhU! ^+8v/XA CDkҨwiKĠYGcǡ3D!~S} 7*Im߭)#mzc      r|$Ñ(contextfree-3.0.5+dfsg1.orig/input/i_polygons.cfdg0000644000175000017500000000552212076364074020613 0ustar brambramstartshape polygontest // This is kind of a dumb way to define a general regular polygon path. // But it matches the existing polygon shapes. path polygon(number sides) { MOVETO( 0.5*cos(180/sides), -0.5*sin(180/sides)) loop sides - 1 [r (360/sides)] LINETO( 0.5*cos(180/sides), 0.5*sin(180/sides)) CLOSEPOLY() FILL[] } shape polygontest { polygonRightTriangle [] CIRCLE [x 2] SQUARE [size 1.0 0.1 x 4 rotate 45] TRIANGLE [x 6] SQUARE [x 8] polygon5sided [x 0 y 2] polygon6sided [x 2 y 2] polygon7sided [x 4 y 2] polygon8sided [x 6 y 2] polygon9sided [x 8 y 2] polygon10sided [x 0 y 4] polygon11sided [x 2 y 4] polygon12sided [x 4 y 4] polygon13sided [x 6 y 4] polygon14sided [x 8 y 4] polygon15sided [x 0 y 6] polygon16sided [x 2 y 6] polygon17sided [x 4 y 6] polygon18sided [x 6 y 6] polygon19sided [x 8 y 6] polygon20sided [x 0 y 8] polygon21sided [x 2 y 8] polygon22sided [x 4 y 8] polygon23sided [x 6 y 8] polygon24sided [x 8 y 8] } // This is a unit right triangle shape polygonRightTriangle { TRIANGLE [[ size 1 1.155 x 0.165 y -0.144 skew 30 0 ]] } shape polygon5sided { polygon(5)[] loop 5 [r 72] SQUARE [[rotate 0 size 0.404509 0.587785 x 0.5]] } shape polygon6sided { loop 3 [r 60] SQUARE [[rotate 0 size 0.866025 0.5]] } shape polygon7sided { loop 7 [r 51.4286] SQUARE [[rotate 0 size 0.450484 0.433884 x 0.5]] } shape polygon8sided { loop 4 [r 45] SQUARE [[rotate 0 size 0.92388 0.382683]] } shape polygon9sided { loop 9 [r 40] SQUARE [[rotate 0 size 0.469846 0.34202 x 0.5]] } shape polygon10sided { loop 5 [r 36] SQUARE [[rotate 0 size 0.951057 0.309017]] } shape polygon11sided { loop 11 [r 32.7273] SQUARE [[rotate 0 size 0.479746 0.281733 x 0.5]] } shape polygon12sided { loop 6 [r 30] SQUARE [[rotate 0 size 0.965926 0.258819]] } shape polygon13sided { loop 13 [r 27.6923] SQUARE [[rotate 0 size 0.485471 0.239316 x 0.5]] } shape polygon14sided { loop 7 [r 25.7143] SQUARE [[rotate 0 size 0.974928 0.222521]] } shape polygon15sided { loop 15 [r 24] SQUARE [[rotate 0 size 0.489074 0.207912 x 0.5]] } shape polygon16sided { loop 8 [r 22.5] SQUARE [[rotate 0 size 0.980785 0.19509]] } shape polygon17sided { loop 17 [r 21.1765] SQUARE [[rotate 0 size 0.491487 0.18375 x 0.5]] } shape polygon18sided { loop 9 [r 20] SQUARE [[rotate 0 size 0.984808 0.173648]] } shape polygon19sided { loop 19 [r 18.9474] SQUARE [[rotate 0 size 0.493181 0.164595 x 0.5]] } shape polygon20sided { loop 10 [r 18] SQUARE [[rotate 0 size 0.987688 0.156434]] } shape polygon21sided { loop 21 [r 17.1429] SQUARE [[rotate 0 size 0.494415 0.149042 x 0.5]] } shape polygon22sided { loop 11 [r 16.3636] SQUARE [[rotate 0 size 0.989821 0.142315]] } shape polygon23sided { loop 23 [r 15.6522] SQUARE [[rotate 0 size 0.495343 0.136167 x 0.5]] } shape polygon24sided { loop 12 [r 15] SQUARE [[rotate 0 size 0.991445 0.130526]] } contextfree-3.0.5+dfsg1.orig/input/ziggy.cfdg0000644000175000017500000000105212076364074017554 0ustar brambramstartshape Trident shape Trident { ZigL [ x 0 b 0.02 ] Zig [ ] ZagL [ x 0 b 0.02 flip 90] CIRCLE [ x 10 y 10 s 6 b 0.75 ] CIRCLE [ x -10 y 10 s 6 b 0.75 ] // CIRCLE { x 17 y 15 s 4 b 0.75 } // CIRCLE { x -17 y 15 s 4 b 0.75 } } shape Zig { Seg [ x -0.5 r -45 ] Zag [ y 1 s 0.97 ] } shape Zag { Seg [ x 0.5 r 45 ] Zig [ y 1 s 0.97 ] } shape ZigL { Seg [ x -0.5 r -45 ] ZagL [ y 1 s 0.97 r 2 ] } shape ZagL { Seg [ x 0.5 r 45 ] ZigL [ y 1 s 0.97 r 2 ] } shape ZigL rule 0.1 { Trident [ ] } shape Seg { SQUARE [ y 0.6925 s 0.5 1.885 ] } contextfree-3.0.5+dfsg1.orig/input/weighting_demo.cfdg0000644000175000017500000000043712076364074021422 0ustar brambramstartshape SEED1 shape SEED1 rule { SQUARE[] SEED1 [y 1.2 size 0.99 rotate 1.5 brightness 0.03] } rule 0.05 {SEED1 [flip 90]} rule 0.05 { SQUARE[] SEED1 [y 1.2 s 0.99 r 1.5 b -0.5 flip 90] SEED1 [y 1.2 x 1.2 s 0.6 r -60 b -0.5] SEED1 [y 1.2 x -1.2 s 0.5 r 60 b -0.5 flip 90] } contextfree-3.0.5+dfsg1.orig/input/quadcity.cfdg0000644000175000017500000000041212076364074020245 0ustar brambramstartshape WHOLE shape WHOLE { QUAD [ x -0.5 y -0.5 ] QUAD [ x 0.5 y -0.5 ] QUAD [ x 0.5 y 0.5 ] QUAD [ x -0.5 y 0.5 ] } shape QUAD rule { FILLIT [ ] } rule 5 { WHOLE [ size 0.45 r 2 ] } rule 0.5 { // nothing } shape FILLIT { SQUARE [ size 0.8 ] } contextfree-3.0.5+dfsg1.orig/input/sierpinski.cfdg0000644000175000017500000000130012076364074020577 0ustar brambramstartshape Top shape Top { Sierpinski [ r -13.5 b 0.5 ] } shape SierpinskiOrig { Shape [ ] Sierpinski [ s 0.5 r 5 y -1 x 0 ] Sierpinski [ s 0.5 r 5 y 0.5 x -0.866025 ] Sierpinski [ s 0.5 r 5 y 0.5 x 0.866025 ] } shape Sierpinski { Shape [ ] Sierpinski [ s 0.6 r 5 b 0.2 y -1.5 x 0 ] Sierpinski [ s 0.6 r 5 b -0.2 y 0.75 x -1.2990375 ] Sierpinski [ s 0.6 r 5 y 0.75 x 1.2990375 ] } # comment out all but one of these rules for Shape: shape Shape { CIRCLE [ ] } #rule Shape { Triangle { s 0.5 } } #rule Shape { Triangle { } } // this last one fills the image shape Triangle { Arm [ r 0 ] Arm [ r 120 ] Arm [ r -120 ] } shape Arm { CIRCLE [ ] Arm [ y 0.1 s 0.9 ] } contextfree-3.0.5+dfsg1.orig/input/octopi.cfdg0000644000175000017500000000133112076364074017720 0ustar brambramstartshape family shape family { octopus [] family [x 10 y 2 s 0.3 r -10] family [x 0 y 10 s 0.3 r 10] } shape octopus { octopus_leg1 [r 90 s 0.7] octopus_leg1 [r 100] octopus_leg1 [r 80] octopus_leg1 [r 110] octopus_leg1 [r 180 s 0.7 flip 90] octopus_leg1 [r 190 flip 90] octopus_leg1 [r 170 flip 90] octopus_leg1 [r 200 flip 90] CIRCLE [s 5 x 2 y 2] CIRCLE [s 5 x 2.5 y 2.5] CIRCLE [s 5 x 3 y 3] CIRCLE [b 1 x 1 y 3] CIRCLE [b 1 x 3 y 2] CIRCLE [s 0.7 x 1.1 y 2.9] CIRCLE [s 0.7 x 2.9 y 1.9] } shape octopus_leg1 { unit [] octopus_leg1 [x 1 y 1 r 10 s 0.95] octopus_leg1 [s 0.2 x 1 y 1 r 90] } shape unit { seed [] seed [r 90] } shape seed { CIRCLE [x -0.5] SQUARE [] CIRCLE [x 0.5] } contextfree-3.0.5+dfsg1.orig/input/cilia.cfdg0000644000175000017500000000253412076364074017512 0ustar brambramstartshape LINES rule TRIPLES { LINES { r 0 } LINES { r 120 } LINES { r -120 } } rule LINES { LINER { } LINER { x 2 } LINER { x 4 } LINER { x 6 } LINER { x 8 } LINES { x 0.7 y 1.5 b 0.1 s 0.8 } } rule LINER { LINER1 { } } rule LINER { LINER2 { } } rule LINER { LINER3 { } } rule LINER { LINER4 { } } rule LINER { LINER5 { } } rule LINER { LINER6 { } } rule LINER1 { UTRIANGLE { y 0.5 } LINER1 { r -1 b 0.02 y 0.75 x 0.4330125 s 0.97 } } rule LINER2 { UTRIANGLE { y 0.5 } LINER2 { r -2 b 0.02 y 0.75 x 0.4330125 s 0.97 } } rule LINER3 { UTRIANGLE { y 0.5 } LINER3 { r -3 b 0.02 y 0.75 x 0.4330125 s 0.97 } } rule LINER4 { UTRIANGLE { y 0.5 } LINER4 { r 1 b 0.02 y 0.75 x 0.4330125 s 0.97 } } rule LINER5 { UTRIANGLE { y 0.5 } LINER5 { r 2 b 0.02 y 0.75 x 0.4330125 s 0.97 } } rule LINER6 { UTRIANGLE { y 0.5 } LINER6 { r 3 b 0.02 y 0.75 x 0.4330125 s 0.97 } } rule LINER1 .1 { LINER { } } rule LINER2 .1 { LINER { } } rule LINER3 .1 { LINER { } } rule LINER4 .1 { LINER { } } rule LINER5 .1 { LINER { } } rule LINER6 .1 { LINER { } } // 0.754877 is the solution to // x^2 + x^3 = 1 // this allows double backed // triangles to exactly line up! rule UTRIANGLE { TRIANGLE { r 42.5 s 0.525 } } rule TRIANGLE{ ARM { r 0 } ARM { r 120 } ARM { r -120 } } rule ARM { CIRCLE { } ARM { y 0.1 s 0.9 r 2 } } contextfree-3.0.5+dfsg1.orig/input/mtree.cfdg0000644000175000017500000000046112076364074017542 0ustar brambramstartshape PLANT shape PLANT { EITHER [x -2] EITHER [x 2] } shape BOTH { BL [rotate 30] BL [rotate -30 flip 90] } shape EITHER rule {BL[]} rule {BL[flip 90]} shape BL { CIRCLE [] WL [size 0.95 y 1.6] } shape WL rule 10 {BL [rotate randint(3, 8)]} rule {BOTH []} rule {BL [rotate -10 flip 90]} contextfree-3.0.5+dfsg1.orig/input/demo2.cfdg0000644000175000017500000000063512076364074017437 0ustar brambram# # An example, showing how to include another file. # Note that the include path has to be absolute OR # relative to the directory you run .cfdg in # startshape thingy import i_pix.cfdg shape thingy { point [y -1 rotate 180] point [] } shape point { C_5by5 [] F_5by5 [x 1.2] D_5by5 [y -1.2] G_5by5 [y -1.2 x 1.2] point [y 2.0 x -2.5 rotate 20 size 0.6] point [y 2.0 x 2.5 rotate -20 size 0.6] } contextfree-3.0.5+dfsg1.orig/input/chanukah.cfdg0000644000175000017500000000311112076364074020203 0ustar brambramstartshape Menorah rule Menorah { Base { } Star { y 1 b 0.65 } Candles { y 10.25 } } rule Base { Trunk { } ArmL1 { y 3 r 90 } ArmR1 { y 3 r -90 } ArmL2 { y 4 r 85 } ArmR2 { y 4 r -85 } ArmL3 { y 5.5 r 80 } ArmR3 { y 5.5 r -80 } ArmL4 { y 7.5 r 75 } ArmR4 { y 7.5 r -75 } } rule Trunk { SQUARE { } Trunk { y 0.4 s 0.97 } } rule ArmL1 { CIRCLE { } ArmL1 { r -1 y 0.4 s 0.975 } } rule ArmR1 { CIRCLE { } ArmR1 { r 1 y 0.4 s 0.975 } } rule ArmL2 { CIRCLE { } ArmL2 { r -1 y 0.3 s 0.975 } } rule ArmR2 { CIRCLE { } ArmR2 { r 1 y 0.3 s 0.975 } } rule ArmL3 { CIRCLE { } ArmL3 { r -1 y 0.2 s 0.975 } } rule ArmR3 { CIRCLE { } ArmR3 { r 1 y 0.2 s 0.975 } } rule ArmL4 { CIRCLE { } ArmL4 { r -1 y 0.1 s 0.975 } } rule ArmR4 { CIRCLE { } ArmR4 { r 1 y 0.1 s 0.975 } } rule Candles { Candle { x -11.4 s 0.5 } Candle { x 11.4 s 0.5 } Candle { x -8.0 s 0.5 } Candle { x 8.0 s 0.5 } Candle { x -5.0 s 0.5 } Candle { x 5.0 s 0.5 } Candle { x -2.2 s 0.5 } Candle { x 2.2 s 0.5 } Candle { y 2 s 0.5 } } rule Candle { Flat { x -2 y -0.45 s 0.2 } SQUARE { y 0 } SQUARE { y 0.7 } SQUARE { y 1.4 } SQUARE { y 2.1 } SQUARE { y 2.8 } SQUARE { y 3.5 } SQUARE { y 4 } Flame { y 5.1 b 0.3 } Ray { y 5.6 s 0.5 b 0.5 } } rule Flat { SQUARE { } Flat { x 0.8 s 0.965 } } rule Flame { CIRCLE { } Flame { y 0.15 s 0.9 b 0.1 r 2 } } rule Star { Arm { r 0 } Arm { r 60 } Arm { r 120 } Arm { r -60 } Arm { r -120 } Arm { r 180 } } rule Arm { CIRCLE { } Arm { y 0.1 s 0.9 } } rule Ray { Line { y 8 s 0.2 } Ray { r -36 s 0.97 } } rule Line { SQUARE { } Line { y 0.8 s 0.9 } } contextfree-3.0.5+dfsg1.orig/input/thingy.cfdg0000644000175000017500000000030412076364074017724 0ustar brambramstartshape THINGY rule THINGY { MINICIRCLE {} THINGY {x 1 size 0.5} THINGY {x -1 size 0.5} THINGY {y 1 size 0.5} THINGY {y -1 size 0.5} } rule MINICIRCLE { CIRCLE { size 0.5} }contextfree-3.0.5+dfsg1.orig/input/funky_flower.cfdg0000644000175000017500000000110012076364074021127 0ustar brambramstartshape GARDEN import i_curves.cfdg shape GARDEN rule { SEED [] } shape SEED rule { curveleft_0_98_3 [x -2] curveleft_0_98_2 [] curveleft_0_98_1 [x 2] LEFT_OR_RIGHT [x 4 size 4 y 1.3] curveright_0_98_1 [x 6] curveright_0_98_2 [x 8] curveright_0_98_3 [x 10] } shape LEFT_OR_RIGHT rule { LEFT_FLOWER [] } rule { LEFT_FLOWER [flip 90] } shape LEFT_FLOWER rule { curveleft_0_97_1 [] FLOWER [x -13 y 25.3 size 1] } shape FLOWER rule { CIRCLE [size 2] loop 6 [r 60] NEW_SEED [] } shape NEW_SEED rule { SEED [size 0.1 y 3] } contextfree-3.0.5+dfsg1.orig/input/demo1.cfdg0000644000175000017500000000154412076364074017436 0ustar brambramstartshape FOREST shape FOREST { SEED [] SEED [x -20] SEED [x -40] } shape SEED rule {BRANCH []} rule {BRANCH [rotate 1]} rule {BRANCH [rotate -1]} rule {BRANCH [rotate 2]} rule {BRANCH [rotate -2]} rule {FORK []} shape BRANCH rule {LEFTBRANCH [flip 90]} rule {LEFTBRANCH []} shape LEFTBRANCH rule 4 {BLOCK [] LEFTBRANCH [y 0.885 rotate 0.1 size 0.99]} rule 4 {BLOCK [] LEFTBRANCH [y 0.885 rotate 0.2 size 0.99]} rule {BLOCK [] LEFTBRANCH [y 0.885 rotate 4 size 0.99]} rule {BLOCK [] FORK []} shape BLOCK { SQUARE [rotate 1] SQUARE [rotate -1] SQUARE [] } shape FORK rule { BRANCH [ ] BRANCH [size 0.5 rotate 40] } rule { BRANCH [ ] BRANCH [size 0.5 rotate -40] } rule { BRANCH [size 0.5 rotate -20] BRANCH [ ] } rule { BRANCH [size 0.7 y 0.1 rotate 20] BRANCH [size 0.7 y 0.1 rotate -20] } contextfree-3.0.5+dfsg1.orig/input/triples.cfdg0000644000175000017500000000166312076364074020115 0ustar brambramstartshape TRIPLES shape TRIPLES { LINES [ r 0 ] LINES [ r 120 ] LINES [ r -120 ] } shape LINES { UTRIANGLE [ y 0.5 ] LINES [ r 20 b 0.15 y 0.75 x -0.4330125 s 0.754877 ] LINER [ r -60 b 0.15 y 0.75 x 0.4330125 s 0.754877 ] } shape LINER { UTRIANGLE [ y 0.5 ] LINER [ r -15…-6 b 0.02 y 0.75 x 0.4330125 s 0.754877 ] } // 0.754877 is the solution to // x^2 + x^3 = 1 // this allows double backed // triangles to exactly line up! shape TESTU { TESTU_background [ ] UTRIANGLE [ ] UTRIANGLE [ y 0.5 x -0.866025 b 0.5 r 60 ] UTRIANGLE [ y 0.5 x +0.866025 b 0.5 r 60 ] } shape TESTU_background { CIRCLE [ b 0.5 ] CIRCLE [ y -1 ] CIRCLE [ y -0.5 x -0.866025 ] CIRCLE [ y -0.5 x 0.866025 ] CIRCLE [ y 0.5 x -0.866025 ] CIRCLE [ y 0.5 x 0.866025 ] CIRCLE [ y 1 ] } shape UTRIANGLE { transform [ r 42.5 s 0.525 ] { ARM [ r 0 ] ARM [ r 120 ] ARM [ r -120 ] } } shape ARM { CIRCLE [ ] ARM [ y 0.1 s 0.9 r 2 ] } contextfree-3.0.5+dfsg1.orig/input/aliastest.cfdg0000644000175000017500000000076112076364074020422 0ustar brambramstartshape Tests rule Tests { SQUARE { x 0 y 0 r 45 } CIRCLE { x 2 y 0 } Angles { x 0 y -2 } Sizes { x 0 y -4 } } rule Angles { AngleLine { s 0.5 } } rule AngleLine { SQUARE { x 0.0 y 0 r 0 } SQUARE { x 1.5 y 0 r 5 } SQUARE { x 3.0 y 0 r 10 } SQUARE { x 4.5 y 0 r 15 } SQUARE { x 6.0 y 0 r 20 } SQUARE { x 7.5 y 0 r 25 } SQUARE { x 9.0 y 0 r 30 } SQUARE { x 10.5 y 0 r 35 } SQUARE { x 12.0 y 0 r 40 } } rule Sizes { CIRCLE { x 0 y 0 s 1.00 } Sizes { x 1.5 s 0.7 } } contextfree-3.0.5+dfsg1.orig/input/ciliasun.cfdg0000644000175000017500000000075312076364074020241 0ustar brambramstartshape SUN shape SUN { loop 72 [r 5] LINER(-3…3) [y 5 sat 1 b 0.3] } shape LINER(number angle) rule { UTRIANGLE [y 0.5 s 0.86 r 0.5] LINER(=) [r angle b 0.1 hue 0.1 60 y 0.75 x 0.4330125 s 0.97] } rule .1 { LINER(-3…3) [] } path UTRIANGLE { MOVETO(0, -0.5) loop 3 [r 120] { CURVEREL( 0.25, sqrt(3)/4, -0.05, 0.025, 0, sqrt(3)/8 ) CURVEREL( 0.25, sqrt(3)/4, 0.25 + 0.025, sqrt(3)/4 - 0.025, CF::Continuous ) } CLOSEPOLY(CF::Align) FILL[] } contextfree-3.0.5+dfsg1.orig/input/snowflake.cfdg0000644000175000017500000000026612076364074020422 0ustar brambramstartshape SPIKE CF::Symmetry = CF::Dihedral, 6 shape SPIKE rule { SQUARE [] SPIKE [y 0.95 s 0.97] } rule 0.03 { SQUARE [] SPIKE [r 60] SPIKE [r -60] SPIKE [y 0.95 s 0.97] } contextfree-3.0.5+dfsg1.orig/input/i_pix.cfdg0000644000175000017500000002360512076364074017543 0ustar brambram// This is a library file that is included in other files // It offers a dot-matix like alphabet based on a 5 by 5 grid startshape the5by5_test shape the5by5_test { random_test [] the5by5_line [] } shape random_test { loop 5 [y 1.2] random_test_row [x 24.0 y -21.0] } shape random_test_row { loop 5 [x 1.2] RANDOM_ALNUM_5by5 [] } shape the5by5_line { A_5by5 [x 0] B_5by5 [x 1.2 ] C_5by5 [x 2.4] D_5by5 [x 3.6] E_5by5 [x 4.8] F_5by5 [x 6.0] G_5by5 [x 7.2] H_5by5 [x 8.4] I_5by5 [x 9.6] J_5by5 [x 10.8] K_5by5 [x 12.0] L_5by5 [x 13.2] M_5by5 [x 14.4] N_5by5 [x 15.6] O_5by5 [x 16.8] P_5by5 [x 18.0] Q_5by5 [x 19.2] R_5by5 [x 20.4] S_5by5 [x 21.6] T_5by5 [x 22.8] U_5by5 [x 24.0] V_5by5 [x 25.2] W_5by5 [x 26.4] X_5by5 [x 27.6] Y_5by5 [x 28.8] Z_5by5 [x 30.0] the5by5_line [y -2.4 size 0.90 x 0.2] NUM_0_5by5 [y -1.2 x 0] NUM_1_5by5 [y -1.2 x 1.2] NUM_2_5by5 [y -1.2 x 2.4] NUM_3_5by5 [y -1.2 x 3.6] NUM_4_5by5 [y -1.2 x 4.8] NUM_5_5by5 [y -1.2 x 6.0] NUM_6_5by5 [y -1.2 x 7.2] NUM_7_5by5 [y -1.2 x 8.4] NUM_8_5by5 [y -1.2 x 9.6] NUM_9_5by5 [y -1.2 x 10.8] } shape pix_5by5_00 { block_5by5 [size 0.20 x -0.4 y 0.4] } shape pix_5by5_10 { block_5by5 [size 0.20 x -0.2 y 0.4] } shape pix_5by5_20 { block_5by5 [size 0.20 x 0.0 y 0.4] } shape pix_5by5_30 { block_5by5 [size 0.20 x 0.2 y 0.4] } shape pix_5by5_40 { block_5by5 [size 0.20 x 0.4 y 0.4] } shape pix_5by5_01 { block_5by5 [size 0.20 x -0.4 y 0.2] } shape pix_5by5_11 { block_5by5 [size 0.20 x -0.2 y 0.2] } shape pix_5by5_21 { block_5by5 [size 0.20 x 0.0 y 0.2] } shape pix_5by5_31 { block_5by5 [size 0.20 x 0.2 y 0.2] } shape pix_5by5_41 { block_5by5 [size 0.20 x 0.4 y 0.2] } shape pix_5by5_02 { block_5by5 [size 0.20 x -0.4 y 0.0] } shape pix_5by5_12 { block_5by5 [size 0.20 x -0.2 y 0.0] } shape pix_5by5_22 { block_5by5 [size 0.20 x 0.0 y 0.0] } shape pix_5by5_32 { block_5by5 [size 0.20 x 0.2 y 0.0] } shape pix_5by5_42 { block_5by5 [size 0.20 x 0.4 y 0.0] } shape pix_5by5_03 { block_5by5 [size 0.20 x -0.4 y -0.2] } shape pix_5by5_13 { block_5by5 [size 0.20 x -0.2 y -0.2] } shape pix_5by5_23 { block_5by5 [size 0.20 x 0.0 y -0.2] } shape pix_5by5_33 { block_5by5 [size 0.20 x 0.2 y -0.2] } shape pix_5by5_43 { block_5by5 [size 0.20 x 0.4 y -0.2] } shape pix_5by5_04 { block_5by5 [size 0.20 x -0.4 y -0.4] } shape pix_5by5_14 { block_5by5 [size 0.20 x -0.2 y -0.4] } shape pix_5by5_24 { block_5by5 [size 0.20 x 0.0 y -0.4] } shape pix_5by5_34 { block_5by5 [size 0.20 x 0.2 y -0.4] } shape pix_5by5_44 { block_5by5 [size 0.20 x 0.4 y -0.4] } shape block_5by5 { SQUARE [size 0.7] } shape A_5by5 { pix_5by5_04 [] pix_5by5_44 [] pix_5by5_03 [] pix_5by5_43 [] pix_5by5_02 [] pix_5by5_42 [] pix_5by5_11 [] pix_5by5_31 [] pix_5by5_20 [] pix_5by5_20 [] pix_5by5_13 [] pix_5by5_23 [] pix_5by5_33 [] } shape B_5by5 { pix_5by5_04 [] pix_5by5_03 [] pix_5by5_02 [] pix_5by5_01 [] pix_5by5_00 [] pix_5by5_10 [] pix_5by5_12 [] pix_5by5_14 [] pix_5by5_20 [] pix_5by5_22 [] pix_5by5_24 [] pix_5by5_31 [] pix_5by5_32 [] pix_5by5_34 [] pix_5by5_43 [] } shape C_5by5 { pix_5by5_03 [] pix_5by5_02 [] pix_5by5_01 [] pix_5by5_10 [] pix_5by5_14 [] pix_5by5_20 [] pix_5by5_24 [] pix_5by5_30 [] pix_5by5_34 [] pix_5by5_40 [] pix_5by5_44 [] } shape D_5by5 { pix_5by5_04 [] pix_5by5_03 [] pix_5by5_02 [] pix_5by5_01 [] pix_5by5_00 [] pix_5by5_10 [] pix_5by5_14 [] pix_5by5_20 [] pix_5by5_24 [] pix_5by5_30 [] pix_5by5_34 [] pix_5by5_41 [] pix_5by5_42 [] pix_5by5_43 [] } shape E_5by5 { pix_5by5_04 [] pix_5by5_03 [] pix_5by5_02 [] pix_5by5_01 [] pix_5by5_00 [] pix_5by5_10 [] pix_5by5_12 [] pix_5by5_14 [] pix_5by5_20 [] pix_5by5_22 [] pix_5by5_24 [] pix_5by5_30 [] pix_5by5_34 [] pix_5by5_40 [] pix_5by5_44 [] } shape F_5by5 { pix_5by5_04 [] pix_5by5_03 [] pix_5by5_02 [] pix_5by5_01 [] pix_5by5_00 [] pix_5by5_10 [] pix_5by5_12 [] pix_5by5_20 [] pix_5by5_22 [] pix_5by5_30 [] pix_5by5_40 [] } shape G_5by5 { pix_5by5_03 [] pix_5by5_02 [] pix_5by5_01 [] pix_5by5_10 [] pix_5by5_14 [] pix_5by5_20 [] pix_5by5_22 [] pix_5by5_24 [] pix_5by5_30 [] pix_5by5_32 [] pix_5by5_34 [] pix_5by5_40 [] pix_5by5_42 [] pix_5by5_43 [] } shape H_5by5 { pix_5by5_00 [] pix_5by5_04 [] pix_5by5_03 [] pix_5by5_02 [] pix_5by5_01 [] pix_5by5_12 [] pix_5by5_22 [] pix_5by5_32 [] pix_5by5_40 [] pix_5by5_41 [] pix_5by5_42 [] pix_5by5_43 [] pix_5by5_44 [] } shape I_5by5 { H_5by5 [rotate 90] } shape J_5by5 { pix_5by5_00 [] pix_5by5_03 [] pix_5by5_10 [] pix_5by5_14 [] pix_5by5_20 [] pix_5by5_24 [] pix_5by5_30 [] pix_5by5_31 [] pix_5by5_32 [] pix_5by5_33 [] pix_5by5_40 [] } shape K_5by5 { pix_5by5_00 [] pix_5by5_01 [] pix_5by5_02 [] pix_5by5_03 [] pix_5by5_04 [] pix_5by5_12 [] pix_5by5_23 [] pix_5by5_21 [] pix_5by5_34 [] pix_5by5_30 [] pix_5by5_44 [] pix_5by5_44 [] } shape L_5by5 { pix_5by5_00 [] pix_5by5_01 [] pix_5by5_02 [] pix_5by5_03 [] pix_5by5_04 [] pix_5by5_14 [] pix_5by5_24 [] pix_5by5_34 [] pix_5by5_44 [] } shape M_5by5 { pix_5by5_00 [] pix_5by5_01 [] pix_5by5_02 [] pix_5by5_03 [] pix_5by5_04 [] pix_5by5_40 [] pix_5by5_41 [] pix_5by5_42 [] pix_5by5_43 [] pix_5by5_44 [] pix_5by5_10 [] pix_5by5_21 [] pix_5by5_30 [] } shape N_5by5 { pix_5by5_00 [] pix_5by5_01 [] pix_5by5_02 [] pix_5by5_03 [] pix_5by5_04 [] pix_5by5_40 [] pix_5by5_41 [] pix_5by5_42 [] pix_5by5_43 [] pix_5by5_44 [] pix_5by5_11 [] pix_5by5_22 [] pix_5by5_33 [] } shape O_5by5 { pix_5by5_01 [] pix_5by5_02 [] pix_5by5_03 [] pix_5by5_41 [] pix_5by5_42 [] pix_5by5_43 [] pix_5by5_10 [] pix_5by5_20 [] pix_5by5_30 [] pix_5by5_14 [] pix_5by5_24 [] pix_5by5_34 [] } shape P_5by5 { pix_5by5_01 [] pix_5by5_02 [] pix_5by5_03 [] pix_5by5_04 [] pix_5by5_00 [] pix_5by5_10 [] pix_5by5_12 [] pix_5by5_20 [] pix_5by5_22 [] pix_5by5_30 [] pix_5by5_32 [] pix_5by5_41 [] } shape Q_5by5 { pix_5by5_01 [] pix_5by5_02 [] pix_5by5_03 [] pix_5by5_10 [] pix_5by5_14 [] pix_5by5_20 [] pix_5by5_24 [] pix_5by5_22 [] pix_5by5_30 [] pix_5by5_33 [] pix_5by5_41 [] pix_5by5_42 [] pix_5by5_44 [] } shape R_5by5 { P_5by5[] pix_5by5_33 [] pix_5by5_44 [] } shape S_5by5 { pix_5by5_01 [] pix_5by5_04 [] pix_5by5_10 [] pix_5by5_12 [] pix_5by5_14 [] pix_5by5_20 [] pix_5by5_24 [] pix_5by5_22 [] pix_5by5_30 [] pix_5by5_34 [] pix_5by5_32 [] pix_5by5_40 [] pix_5by5_43 [] } shape T_5by5 { pix_5by5_00 [] pix_5by5_10 [] pix_5by5_20 [] pix_5by5_30 [] pix_5by5_40 [] pix_5by5_21 [] pix_5by5_22 [] pix_5by5_23 [] pix_5by5_24 [] } shape U_5by5 { pix_5by5_00 [] pix_5by5_01 [] pix_5by5_02 [] pix_5by5_03 [] pix_5by5_14 [] pix_5by5_24 [] pix_5by5_34 [] pix_5by5_40 [] pix_5by5_41 [] pix_5by5_42 [] pix_5by5_43 [] } shape V_5by5 { pix_5by5_00 [] pix_5by5_01 [] pix_5by5_02 [] pix_5by5_13 [] pix_5by5_24 [] pix_5by5_33 [] pix_5by5_40 [] pix_5by5_41 [] pix_5by5_42 [] } shape W_5by5 { M_5by5 [rotate 180] } shape X_5by5 { pix_5by5_00 [] pix_5by5_04 [] pix_5by5_11 [] pix_5by5_13 [] pix_5by5_22 [] pix_5by5_31 [] pix_5by5_33 [] pix_5by5_40 [] pix_5by5_44 [] } shape Y_5by5 { pix_5by5_00 [] pix_5by5_11 [] pix_5by5_22 [] pix_5by5_31 [] pix_5by5_23 [] pix_5by5_24 [] pix_5by5_40 [] } shape Z_5by5 { N_5by5 [rotate 90] } shape RANDOM_LETTER_5by5 rule { A_5by5 []} rule { B_5by5 []} rule { C_5by5 []} rule { D_5by5 []} rule { E_5by5 []} rule { F_5by5 []} rule { G_5by5 []} rule { H_5by5 []} rule { I_5by5 []} rule { J_5by5 []} rule { K_5by5 []} rule { L_5by5 []} rule { M_5by5 []} rule { N_5by5 []} rule { O_5by5 []} rule { P_5by5 []} rule { Q_5by5 []} rule { R_5by5 []} rule { S_5by5 []} rule { T_5by5 []} rule { U_5by5 []} rule { V_5by5 []} rule { W_5by5 []} rule { X_5by5 []} rule { Y_5by5 []} rule { Z_5by5 []} //generate numbers randomly shape RANDOM_NUMBER_5by5 rule { NUM_0_5by5 [] } rule { NUM_1_5by5 [] } rule { NUM_2_5by5 [] } rule { NUM_3_5by5 [] } rule { NUM_4_5by5 [] } rule { NUM_5_5by5 [] } rule { NUM_6_5by5 [] } rule { NUM_7_5by5 [] } rule { NUM_8_5by5 [] } rule { NUM_9_5by5 [] } shape RANDOM_ALNUM_5by5 rule 26 { RANDOM_LETTER_5by5 [] } rule 10 { RANDOM_NUMBER_5by5 [] } shape NUM_0_5by5 { //make 0 pix_5by5_10 [] pix_5by5_20 [] pix_5by5_30 [] pix_5by5_01 [] pix_5by5_02 [] pix_5by5_03 [] pix_5by5_41 [] pix_5by5_42 [] pix_5by5_43 [] pix_5by5_14 [] pix_5by5_24 [] pix_5by5_34 [] pix_5by5_31 [] pix_5by5_22 [] pix_5by5_13 [] } shape NUM_1_5by5 { //make 1 pix_5by5_20 [] pix_5by5_21 [] pix_5by5_22 [] pix_5by5_23 [] pix_5by5_24 [] pix_5by5_04 [] pix_5by5_14 [] pix_5by5_34 [] pix_5by5_44 [] pix_5by5_01 [] pix_5by5_10 [] } shape NUM_2_5by5 { //make 2 pix_5by5_20 [] pix_5by5_30 [] pix_5by5_41 [] pix_5by5_32 [] pix_5by5_22 [] pix_5by5_22 [] pix_5by5_04 [] pix_5by5_14 [] pix_5by5_24 [] pix_5by5_34 [] pix_5by5_44 [] pix_5by5_13 [] pix_5by5_01 [] pix_5by5_10 [] } shape NUM_3_5by5 { //make 3 pix_5by5_20 [] pix_5by5_30 [] pix_5by5_41 [] pix_5by5_32 [] pix_5by5_22 [] pix_5by5_22 [] pix_5by5_03 [] pix_5by5_14 [] pix_5by5_24 [] pix_5by5_34 [] pix_5by5_43 [] pix_5by5_01 [] pix_5by5_10 [] } shape NUM_4_5by5 { //make 4 pix_5by5_01 [] pix_5by5_02 [] pix_5by5_03 [] pix_5by5_10 [] pix_5by5_13 [] pix_5by5_23 [] pix_5by5_30 [] pix_5by5_31 [] pix_5by5_32 [] pix_5by5_33 [] pix_5by5_34 [] pix_5by5_43 [] } shape NUM_5_5by5 { //make 5 pix_5by5_00 [] pix_5by5_01 [] pix_5by5_02 [] pix_5by5_04 [] pix_5by5_10 [] pix_5by5_12 [] pix_5by5_14 [] pix_5by5_20 [] pix_5by5_22 [] pix_5by5_24 [] pix_5by5_30 [] pix_5by5_32 [] pix_5by5_34 [] pix_5by5_43 [] } shape NUM_6_5by5 { //make 6 pix_5by5_01 [] pix_5by5_02 [] pix_5by5_03 [] pix_5by5_10 [] pix_5by5_12 [] pix_5by5_14 [] pix_5by5_20 [] pix_5by5_22 [] pix_5by5_24 [] pix_5by5_30 [] pix_5by5_32 [] pix_5by5_34 [] pix_5by5_43 [] } shape NUM_7_5by5 { //make 7 pix_5by5_00 [] pix_5by5_10 [] pix_5by5_20 [] pix_5by5_23 [] pix_5by5_24 [] pix_5by5_32 [] pix_5by5_30 [] pix_5by5_40 [] pix_5by5_41 [] } shape NUM_8_5by5 { //make 8 pix_5by5_01 [] pix_5by5_03 [] pix_5by5_10 [] pix_5by5_12 [] pix_5by5_14 [] pix_5by5_20 [] pix_5by5_22 [] pix_5by5_24 [] pix_5by5_30 [] pix_5by5_32 [] pix_5by5_34 [] pix_5by5_43 [] pix_5by5_41 [] } shape NUM_9_5by5 rule { //make 9 pix_5by5_01 [] pix_5by5_04 [] pix_5by5_10 [] pix_5by5_12 [] pix_5by5_14 [] pix_5by5_20 [] pix_5by5_22 [] pix_5by5_24 [] pix_5by5_30 [] pix_5by5_32 [] pix_5by5_34 [] pix_5by5_41 [] pix_5by5_42 [] pix_5by5_43 [] } contextfree-3.0.5+dfsg1.orig/input/tangle.cfdg0000644000175000017500000000040612076364074017677 0ustar brambramstartshape SPIKES shape SPIKES { loop 4 [r 90] SPIKE [] } shape SPIKE rule { LSPIKE [] } rule { LSPIKE [ flip 90 ] } shape LSPIKE rule { SQUARE [] LSPIKE [ y 0.98 s 0.99 r 1] } rule 0.01 { SPIKE [ r 90 ] SPIKE [ r -90 ] LSPIKE [ y 0.98 s 0.99 r 1] } contextfree-3.0.5+dfsg1.orig/input/rose.cfdg0000644000175000017500000000133712076364074017401 0ustar brambramstartshape plant shape rose1 { loop 4 [r 90] petal [r -15…15 x 0.9 s 0.9 1.8] rose1 [ r 14 s 0.92 hue 0.12 60 ] } shape petal { CIRCLE [] CIRCLE [ s 0.975 x -0.025 hue 0.1 60 ] CIRCLE [ s 0.95 x -0.05 hue 0.2 60 ] CIRCLE [ s 0.925 x -0.075 hue 0.3 60 ] CIRCLE [ s 0.90 x -0.10 hue 0.4 60 ] } shape stem { CIRCLE [s 2 6 r -15 y -3 x -.5] CIRCLE [s 2 6 r -15 y -3 x -0.35 sat -1 b 1] leaf [[ y -4 x -1.625 r 30 s 0.15 ]] leaf [[ y -4 x -1.625 flip 80 r 30 s 0.15 ]] } shape plant { rose1 [ b 1 sat 1] stem [ b 0.4 sat 1 hue 120 z -1] } shape leaf { loop 4 [[y 0.5 s 0.95 y 0.5 r 1]] SQUARE [] finally { CIRCLE [[r 7 s 7.5 15 y 0.5]] CIRCLE [[r 7 s 7.5 15 b 0.2 y 0.5 s 0.80 0.90]] leaf [] } } contextfree-3.0.5+dfsg1.orig/input/underground.cfdg0000644000175000017500000000130112076364074020754 0ustar brambramstartshape MAP shape MAP { LOGO [ ] ROUTE [ x 80 y 80 rotate 90 ] } shape ROUTE rule { LINES [ brightness 0.2 ] } rule { LINES [ brightness -0.2 ] } shape LINES { LINE [ ] LINE [ rotate 180 ] } shape LINE rule 1000 { CIRCLE [ ] LINE [ y 0.1 ] } // turns rule 1 { LINE [ rotate 45 ] } rule 1 { LINE [ rotate -45 ] } rule 1 { LINE [ rotate 90 ] } rule 1 { LINE [ rotate -90 ] } // station rule 4 { SQUARE [ size 3 rotate 45 ] LINE [ ] } // interchange rule 0.5 { LINE [ ] ROUTE [ rotate 90 ] } // terminus rule 1 { CIRCLE [ size 3 ] CIRCLE [ size 1 brightness 1 ] } shape LOGO { CIRCLE [ size 5 brightness 0.5 ] CIRCLE [ size 3.5 brightness 1.0 ] SQUARE [ s 6 1 ] } contextfree-3.0.5+dfsg1.orig/input/welcome.cfdg0000644000175000017500000000261612076364074020065 0ustar brambramstartshape WELCOME shape WELCOME { MESSAGE [ hue 225 sat 0.7 b 0.6 ] VINEL [ sat 1 hue 120 x 3 y -55 r 0 b 0.5 s 10 ] VINEL [ flip 90 sat 1 hue 120 x 85 y -55 r 0 b 0.5 s 10 ] } shape MESSAGE { W [ x 0 ] E [ x 12 ] L [ x 24 ] C [ x 34 ] O [ x 46 ] M [ x 64 ] E [ x 80 ] } shape W { LINE [ r -7 ] LINE [ r 7 ] LINE [ x 6 r -7 ] LINE [ x 6 r 7 ] } shape E { LINE [ s 0.9 ] LINE [ s 0.9 -1 y 24 ] LINE [ s 0.4 r -90 y 0 ] LINE [ s 0.4 r -90 y 12 ] LINE [ s 0.4 r -90 y 24 ] } shape L { LINE [ ] LINE [ s 0.4 x 0.4 r -90 y 0 ] } shape C { ARCL [ y 12 flip 90 ] ARCL [ y 12 r 180 ] } shape O { ARCL [ y 12 flip 90] ARCL [ y 12 r 180 ] ARCL [ y 12 x 14 r 180 flip 90] ARCL [ y 12 x 14 ] } shape M { LINE [ y 24 r 180 ] LINE [ y 24 r -160 s 0.75 ] LINE [ y 24 x 12 r 160 s 0.75 ] LINE [ y 24 x 12 r 180 ] } shape LINE { TRIANGLE [[ s 1 30 y 0.26 ]] //MARK { } //LINE { size 0.98 y 0.5 } } shape ARCL { MARK [ ] ARCL [ size 0.97 y 0.55 r 1.5 ] } shape MARK { SQUARE [ ] } shape VINEL { STEML [ ] STEML [ x 1 r 5 flip 0 ] VINEL [ x 2 size 0.9 r 10 ] } shape STEML { GOL [ r 20 s 0.1 ] END [ s 0.2 r 120 hue 150 x 1.3 y -0.6 b -0.3] } shape GOL { CIRCLE [ ] GOL [ x 0.3 r -1 s 0.985 ] } shape END { CIRCLE [ x -0.5 y 0.0 s 1.0 ] CIRCLE [ x 0.45 y 0.6 s 0.9 ] CIRCLE [ x -0.4 y 1.2 s 0.8 ] CIRCLE [ x 0.35 y 1.8 s 0.7 ] CIRCLE [ x -0.3 y 2.4 s 0.6 ] } contextfree-3.0.5+dfsg1.orig/input/lesson.cfdg0000644000175000017500000000757312076364074017744 0ustar brambram/* CFDG Lesson */ startshape TOC // each grammar file must // have a "startshape" // statement to say which // shape to begin with shape TOC { // a "rule" statement says how // to compose a shape out of // other shapes CHAPTER1 [ x 0 y 0 ] CHAPTER2 [ x 10 y 0 ] CHAPTER3 [ x 0 y -10 ] CHAPTER4 [ x 10 y -10 ] // each entry in the rule // names a shape to draw and // some "adjustments" in curly // braces TITLES [ ] } shape CHAPTER1 { ## BASIC SHAPES ## SQUARE [ x 2 y 5 size 3 ] CIRCLE [ x 6 y 5 size 3 ] TRIANGLE [ x 4 y 2 size 3 ] // these shapes are special: // they draw a shape into the // image, centered at the // current location SHAPES [ y 1 size 3 ] // This tells you the relative // sizes and positions of each // basic shape. } shape SHAPES { SQUARE [] CIRCLE [b 0.3] TRIANGLE [b 0.5] TRIANGLE [r 60 b 0.7] } shape CHAPTER2 { ## BASIC ADJUSTMENTS ## SQUARE [ ] // empty adjustments // this is the lone square in // chapter 2's area SQUARE [ x 3 y 7 ] // adjust location // even though adjustments // are written after the shape // they are applied before! SQUARE [ x 5 y 7 rotate 30 ] // adjust rotation SQUARE [ x 3 y 5 size 0.75 ] // adjust size // notice that rotaion and size // are adjusted after location SQUARE [ x 5 y 5 brightness 0.5 ] // adjust brightness SQUARE [ x 7 y 6 // shorthands: r 45 // for rotate s 0.7 // for size b 0.7 // for brightness ] FOURSQUARE [ x 5 y 1 size 0.2 rotate 10 ] // adjustments are cumulative } shape FOURSQUARE { SQUARE [ x 0 y 0 size 5 3] SQUARE [ x 0 y 5 size 2 4 ] SQUARE [ x 5 y 5 size 3 ] SQUARE [ x 5 y 0 size 2 ] // even though these are // at locations and sizes // that seem big, they have // all been relocated, scaled // and rotated when the rule // for CHAPTER2 used // FOURSQUARE // Two SQUAREs have been // have been turned into // rectangles } shape CHAPTER3 { ## RECURSION ## SPIRAL [ x 0 y 3 ] } shape SPIRAL { CIRCLE [ size 0.5 ] SPIRAL [ y 0.2 rotate -3 size 0.995 ] // a shape can use itself so // long as it keeps getting // smaller // the system will stop the // recursion when the shapes // get to small to see } shape CHAPTER4 { ## RANDOMNESS ## TREE [ x 1 y 0 ] TREE [ x 6 y 0 ] TREE [ x 1 y 4 ] TREE [ x 6 y 4 ] // even though these are the // same shape used four // times, each looks different } shape TREE rule 20 { // first rule for TREE CIRCLE [ size 0.25 ] TREE [ y 0.1 size 0.97 ] } rule 1.5 { // second rule for TREE BRANCH [ ] } // When expanding a TREE, a // rule is picked randomly. // The first rule has been given a // weight of 20, the second of 1.5, // so the first will be picked // proportionally more often shape BRANCH { BRANCH_LEFT [ ] BRANCH_RIGHT [ ] } shape BRANCH_LEFT rule { TREE [ rotate 20 ] } rule { TREE [ rotate 30 ] } rule { TREE [ rotate 40 ] } rule { // empty rules are okay } // If no weight is given for a rule // the weight is 1. Hence, the // above four rules are picked // equally randomly shape BRANCH_RIGHT rule { TREE [ rotate -20 ] } rule { TREE [ rotate -30 ] } rule { TREE [ rotate -40 ] } rule { // empty rules are okay } ## Utilities ## import i_pix.cfdg // The "include" statement reads // in all the rules from another file. // Any "startshape" in the included // file is ignored. shape TITLES { TITLE1 [ x 0 y 8.5 ] TITLE2 [ x 10 y 8.5 ] TITLE3 [ x 0 y -1.5 ] TITLE4 [ x 10 y -1.5 ] } shape TITLE1 { O_5by5 [ x 0 ] N_5by5 [ x 1.2 ] E_5by5 [ x 2.4 ] } shape TITLE2 { T_5by5 [ x 0 ] W_5by5 [ x 1.2 ] O_5by5 [ x 2.4 ] } shape TITLE3 { T_5by5 [ x 0 ] H_5by5 [ x 1.2 ] R_5by5 [ x 2.4 ] E_5by5 [ x 3.6 ] E_5by5 [ x 4.8 ] } shape TITLE4 { F_5by5 [ x 0 ] O_5by5 [ x 1.2 ] U_5by5 [ x 2.4 ] R_5by5 [ x 3.6 ] } contextfree-3.0.5+dfsg1.orig/input/point.cfdg0000644000175000017500000000306512076364074017562 0ustar brambramstartshape POINT rule POINT { POINT {rotate 43.345223} UNIT { y 100 size 1} } rule POINT { POINT {rotate 73.9 size 0.99} UNIT { y 100 size 0.7} } rule POINT { POINT {rotate 73.9 size 0.99} UNIT { y 100 size 0.3} } rule POINT 2 { POINT {rotate 73.9 size 0.99} UNIT { y 100 size 0.1} } rule UNIT { SEED {size 10}} rule SEED {BRANCH {}} rule SEED {BRANCH {rotate 1}} rule SEED {BRANCH {rotate -1}} rule SEED {BRANCH {rotate 2}} rule SEED {BRANCH {rotate -2}} rule SEED {FORK {}} rule BRANCH {LEFTBRANCH {flip 90}} rule BRANCH {LEFTBRANCH {}} rule LEFTBRANCH {BLOCK {} LEFTBRANCH {y 0.885 rotate 0.1 size 0.99}} rule LEFTBRANCH {BLOCK {} LEFTBRANCH {y 0.885 rotate 0.2 size 0.99}} rule LEFTBRANCH {BLOCK {} LEFTBRANCH {y 0.885 rotate 0.1 size 0.99}} rule LEFTBRANCH {BLOCK {} LEFTBRANCH {y 0.885 rotate 0.2 size 0.99}} rule LEFTBRANCH {BLOCK {} LEFTBRANCH {y 0.885 rotate 0.1 size 0.99}} rule LEFTBRANCH {BLOCK {} LEFTBRANCH {y 0.885 rotate 0.2 size 0.99}} rule LEFTBRANCH {BLOCK {} LEFTBRANCH {y 0.885 rotate 0.1 size 0.99}} rule LEFTBRANCH {BLOCK {} LEFTBRANCH {y 0.885 rotate 0.2 size 0.99}} rule LEFTBRANCH {BLOCK {} LEFTBRANCH {y 0.885 rotate 4 size 0.99}} rule LEFTBRANCH {BLOCK {} FORK {}} rule BLOCK { SQUARE {rotate 1} SQUARE {rotate -1} SQUARE {} } rule FORK { BRANCH { } BRANCH {size 0.5 rotate 40} } rule FORK { BRANCH { } BRANCH {size 0.5 rotate -40} } rule FORK { BRANCH {size 0.5 rotate -20} BRANCH { } } rule FORK { BRANCH {size 0.7 y 0.1 rotate 20} BRANCH {size 0.7 y 0.1 rotate -20} } contextfree-3.0.5+dfsg1.orig/input/thorns.cfdg0000644000175000017500000000040112076364074017735 0ustar brambramstartshape THORNS2 rule THORN { CIRCLE {} THORN { s 0.95 y 0.3 } } rule THORNS { THORN {} THORNS {s 0.5 r -85 y 6.2 } THORNS {s 0.5 r 85 y 6.2 } THORNS {s 0.5 y 6.2 } } rule THORNS2 { THORNS {r 45} THORNS {r 135} THORNS {r 225} THORNS {r 315} }contextfree-3.0.5+dfsg1.orig/input/lesson2.cfdg0000644000175000017500000000656112076364074020022 0ustar brambram/* CFDG Lesson */ startshape TOC shape TOC { CHAPTER5 [ x 0 y 0 ] CHAPTER6 [ x 10 y 0 ] CHAPTER7 [ x 0 y -10 ] CHAPTER8 [ x 10 y -10 ] TITLES [ ] } shape CHAPTER5 { ## SKEW TRANSFORM ## SierpinskiTri [ x 2 y 4 size 6.0 ] SQUARE [ x 0.5 y 5.5 skew 15 15 size 2 ] // a skew transform (also called // a shear) pushes a shape parallel // to the x axis or y axis or both. // The two numbers following } shape SierpinskiTri { polygonRightTriangle [ ] hole [ b 1 ] } shape hole { polygonRightTriangle [ size -0.495 x 0.25 y -0.25 ] hole [ b -0.2 size 0.5 x -0.25 y -0.25 ] hole [ b -0.2 size 0.5 x 0.25 y -0.25 ] hole [ b -0.2 size 0.5 x 0.25 y 0.25 ] } shape polygonRightTriangle { TRIANGLE [[ size 1 1.155 x 0.165 y -0.144 skew 30 0 ]] } shape CHAPTER6 { ## FLIP TRANSFORM ## HEART [ x 2 y 1 size 0.12 0.1] // A flip transform reflects a // shape across a line at the // specified angle. } import i_curves.cfdg shape HEART { curveright_0_99_1 [ r 64 ] curveright_0_99_1 [ flip 90 r -64 ] HEART [ s 0.9 y 2.5 ] } shape CHAPTER7 { ## TRANSFORM ORDERING ## TranSquare [ s 0.5 x 1 y 5 ] TranCircle [ s 0.5 x 1 y 3 ] TranTriangle [ s 0.5 x -1 y 1 ] SquareLine [ x -1 y 7 ] // When transforms are in curly // braces then they are applied // in a fixed order: // 1) Translate // 2) Rotate // 3) Scale // 4) Skew // 5) Reflect // Only one transform of each // type is allowed (all but the // last are ignored). // When transforms are in square // braces then they are applied // in the order they are found // and there can be multiple // occurances of a given type // of transform. } shape TranSquare { SQUARE [[ r 45 x 4 s 3 ]] SQUARE [[ b 0.2 x 4 s 3 ]] SQUARE [[ b 0.4 x 4 ]] SQUARE [[ b 0.7 ]] // Ordering a rotate before a // translate (x or y) causes the // translate to be rotated. This // saves } shape TranCircle { Ellipse [[ x 4 r 45 s 3 ]] Ellipse [[ b 0.2 r 45 s 3 ]] Ellipse [[ b 0.4 s 3 ]] Ellipse [[ b 0.7 ]] // This happens to be the order // that CF uses when the transforms // are enclosed in curly braces. } shape TranTriangle { TRIANGLE [[ s 3 x 4 r 45 ]] TRIANGLE [[ b 0.2 x 4 r 45 ]] TRIANGLE [[ b 0.4 r 45 ]] TRIANGLE [[ b 0.7 ]] // Putting the scale before the // translate scales the translate // as well } shape SquareLine { SQUARE [] SquareLine [[ y -0.5 s 0.75 y -0.5 ]] // Transforms can be specified // more than once and subsequent // transforms are modifed by the // ones before them. In the above // idiom the squares are always // just touching, even when you // change the scale amount. } shape Ellipse { CIRCLE [ s 1 0.5 ] } shape CHAPTER8 { ## COLOR ## // Coming soon. } ## Utilities ## import i_pix.cfdg // The "include" statement reads // in all the rules from another file. // Any "startshape" in the included // file is ignored. shape TITLES { TITLE5 [ x 0 y 8.5 ] TITLE6 [ x 10 y 8.5 ] TITLE7 [ x 0 y -1.5 ] TITLE8 [ x 10 y -1.5 ] } shape TITLE5 { F_5by5 [ x 0 ] I_5by5 [ x 1.2 ] V_5by5 [ x 2.4 ] E_5by5 [ x 3.6 ] } shape TITLE6 { S_5by5 [ x 0 ] I_5by5 [ x 1.2 ] X_5by5 [ x 2.4 ] } shape TITLE7 { S_5by5 [ x 0 ] E_5by5 [ x 1.2 ] V_5by5 [ x 2.4 ] E_5by5 [ x 3.6 ] N_5by5 [ x 4.8 ] } shape TITLE8 { E_5by5 [ x 0 ] I_5by5 [ x 1.2 ] G_5by5 [ x 2.4 ] H_5by5 [ x 3.6 ] T_5by5 [ x 4.8 ] } contextfree-3.0.5+dfsg1.orig/src-win/0000755000175000017500000000000012245646004016015 5ustar brambramcontextfree-3.0.5+dfsg1.orig/src-win/WinCanvas.h0000644000175000017500000000341312076364074020066 0ustar brambram// WinCanvas.h // this file is part of Context Free // --------------------- // Copyright (C) 2005-2011 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #ifndef INCLUDE_WINCANVAS_H #define INCLUDE_WINCANVAS_H #include "cfdg.h" #include "aggCanvas.h" class WinSystem; class WinCanvas : public aggCanvas { public: WinCanvas(WinSystem* sys, aggCanvas::PixelFormat pixfmt, int width, int height, agg::rgba bkgrnd); WinCanvas(const WinCanvas&); // declare but do not implement WinCanvas& operator=(const WinCanvas&); // declare but do not implement ~WinCanvas(); int mStride; aggCanvas::PixelFormat mPixelFormat; char* mBM; agg::rgba mBackground; bool mNoUpdate; void start(bool clear, const agg::rgba& bk, int, int); void end(); WinCanvas* Make8bitCopy(); protected: WinSystem* mSystem; }; #endif // INCLUDE_WINCANVAS_Hcontextfree-3.0.5+dfsg1.orig/src-win/win-install/0000755000175000017500000000000012245646004020256 5ustar brambramcontextfree-3.0.5+dfsg1.orig/src-win/win-install/sidebar.bmp0000644000175000017500000014653612076364074022414 0ustar brambramBM^6(:( ~~~}}}|||{{{zzzyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA???>>>===<<<;;;:::999888777666444333222111000///...---,,,+++)))(((&&&%%%$$$###!!!  %dsBu)b&`__9}C FQ" k/n] C>m/s< #} 6E9`=rFo \ Q+7ؾ '$) .!Q|#`"ab2# YEr?ՈpO_ 86U~- "O he"R Dr'ο|}.<+GJ@s; h;. </wS6Dz"L\wa?7ld/yT5/mXJ eQNk"82#Y&13aƉO C wNQ5whrp ө1kTzuʭj}, #;M,4 s-R~5>m0I#&%(|;+*&)-(.7.!MCo=7#  -(h &-A2k R 6r."r[o)^>t+K3j30[\/Dw,L+be:T8X=  88   ", + +Q Q6$9[@-=:. Me227==%knD^#Tii6aa ,CS=AA AKC{$$$W=0 DVWwP4nNW,h +:k)wP%9W ? H1QY>Y" c3&Q9#Q;\Sg .a4 1.9 F#p ,OtM4 3v 0R9{Hl90N= M|B'z==3:_=ht0T*= #8mi.^': -e3iMb:qP#63<,V\M.WZ#\Uv1A;SaS%BB,8.uB$.6H=MphV1"&{t2S=A2 -U$%t'%{' x[kB;i3=z,; 4 wAxO4 >b/H>V!Y0!i + 3;.."  . !K% 14JYl6QE##ẠY=1e3OF6ZiDJ?&+ Q1F!j 8KDm. a9 D@k?),ɤ|#,f''9#2 C3Ԭ9 Cq U6 3G9xk?6Q<_{)"0%.2/*uu2 = >o.X~grW3}e@2LRRl =&e1 4%:X*c48.F //!Gsm6!W3;Ui{UG(l `B3/i?%Qr* {6@7(fSz9x?e SI:!b o'=F0lLZr;s@36-'4`kuH@#5jJMo99k:? <>#(#^n)_V aOF> jU~bT ZLP $0 3 d-58R:2.Ve{TG7;TYNS!#My/2 /&G:2y$O"5"7 810@-'jR #ez7* GZBT=eeV#%1?& LgO8.@ .Q\}*DB+YTH<& ` 77@J_q-F<'9\9P#.o.=,f! x)DbG4KW%HnZ(!& '.d 6A!zD#0)3 kD&L[L- ?0((.YnAQQB?6%?\ .:s/&#i84M#HxV8t&"N(P8'rFR'SR":K0^D@Z@#*!!@O!,L5("^^'_ @5D+<M1V2>-m [%@+ T IB6&6@4:JO!icontextfree-3.0.5+dfsg1.orig/src-win/win-install/splash.bmp0000644000175000017500000257627012076364074022301 0ustar brambramBM 6(X 333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333@'@fSf3333333333333333YDYYDY33333333333333333333333333333333YDYfSffSf33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333YDYfSffSf33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333fSf3333333333333333p@'@3333333333333333333333333333fSf33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333fSf3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333fSf333333333333333333p3333333333333333333333333333M6M333333~333333333333333333333333333333333333333333333333M6M~̲sas33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333M6M333333~333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333sas̥fSf3333YDY̥@'@3333fSf~̿sas333333333333333333fSfp33333333fSfp333333fSf~@'@fSf33M6M333333M6M333333sassas33333333333333psas3333M6M@'@3333333333333333p333333YDY̥@'@33333333sas̍~333333@'@~̿sas333333333333333333M6MfSf333333~̿sas33333333@'@̲YDY33333333p̲fSf333333333333M6M̲YDY33333333sas̍~333333fSfp333333fSfp3333pfSf333333pfSf333333333333M6M3333333333pfSf333333sas̍~333333fSfp33333333fSfp333333fSf~@'@fSf3333sas̿pfSfp3333pfSf333333pfSf33333333333333YDY̥M6M33@'@YDY3333333333M6M333333333333fSfp3333YDY̍~YDY3333fSfp33333333fSfp333333YDYYDY3333333333fSf3333fSf̿p@'@33fSfp333333fSfp333333M6M33YDY̲p33pM6M33M6M333333M6M3333@'@~̥YDY3333M6M33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333ppfSf33YDYfSf@'@33fSffSfpp33333333fSf333333333333333333p򥚥fSf33fSf333333fSf3333fSfpfSffSf333333333333sas3333M6MfSfM6M33YDY3333333333333333򙌙3333YDY~fSf@'@3333psasfSfٲ3333fSf~fSfp򙌙3333333333333333YDYfSf3333fSfsasp3333@'@ٲfSf~YDY3333pfSf~p3333333333M6MsasfSfM6M3333~psasٿ33333333333333̙333333̙333333333333fSf3333333333̙3333~psasٿ3333333333333333p򥚥fSf33YDYpfSf3333̙333333̙333333333333YDYfSfpfSfٲ333333333333fSf3333333333333333򥚥fSf~3333333333333333YDY򲨲333333333333噌33p򙌙fSfpfSf333333333333sassasM6MYDY򙌙fSfp33M6M33fSf333333fSf33@'@sasfSf3333fSf33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333332323333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333p333333@'@33333333ٍ~33fSf333333sas33333333岨333333333333333333sas3333@'@fSf33fSf333333fSf3333333333333333333333@'@33򲨲33~~33333333333333@'@ٿ@'@3333333333333333p3333p3333M6MM6M33@'@33333333fSf@'@3333333333333333psas3333333333M6MM6M3333p3333p33333333M6MfSf333333p333333333333333333ٙ3333sas3333@'@YDY333333333333̙333333̙333333333333fSf3333333333̙3333sas3333@'@YDY33333333333333sas3333@'@fSf333333333333̙333333̙333333333333333333M6M33333333333333fSf33333333333333fSf333333fSf33333333333333YDY򲨲33333333333333333333333333p33333333@'@333333333333̙333333333333@'@3333ٲ3333333333fSf333333fSf33~33333333@'@3333fSf333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333332252523233333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333fSf333333333333fSf33333333fSf33333333fSf3333pYDYM6M33333333333333fSf33333333fSf33fSf333333fSf33333333333333333333sas~33~333333fSf33333333333333333333@'@@'@33333333sas33333333M6M@'@333333p33333333333333fSf333333333333333333pp33333333p333333M6MM6M33333333p33fSf33333333sas333333333333333333̙33fSf33333333̙333333333333̙333333̙333333333333fSf3333333333̙33fSf33333333̙333333333333fSf33333333fSf33p@'@33333333̙333333̙333333333333̙3333@'@奚33333333333333fSf3333fSf333333M6MfSf3333fSf333333333333򲨲33333333333333333333333333fSf333333333333333333333333̙333333fSf333333333333@'@p33333333fSf333333fSf33̙33333333333333fSf333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333437283533333527331533333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333fSf333333333333fSf33333333fSf33333333fSf3333٥33ٙ33333333333333fSf33333333fSf33fSf333333fSf33333333333333333333fSf33fSf333333333333333333333333333333@'@@'@333333fSf33333333fSf33333333̙333333333333M6MYDY33fSfp33333333pp33333333333333fSf33̙333333fSf3333~3333YDYٲ333333333333333333̙33fSf33333333̙333333333333̙333333̙333333333333fSf3333333333̙33fSf33333333̙333333333333fSf33333333fSf3333̙3333̙333333̙33333333333333@'@ٲfSf33333333333333fSf3333fSf333333~̥3333333333333333333333333333333333333333fSf333333333333̙333333fSf33333333333333fSfYDY333333fSf333333fSf333333fSf333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333394733233333282723333116133333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333M6MM6M3333333333p33333333fSf333333@'@YDY33YDYM6M33p33333333333333M6MM6M333333fSf33fSf333333fSf33333333333333333333fSf33fSf33333333333333333333333333333333@'@ٿ333333fSf33333333fSf33333333̙3333pfSffSfp3333fSfp3333333333pYDY333333333333fSf33̙333333fSf3333YDY̥33333333333333333333̙33M6MM6M333333p333333333333̙333333̙333333333333fSf噌33M6MM6M333333p333333333333M6MM6M333333fSf333333M6MfSf3333̙333333̙333333333333@'@̙ٲ33fSf33333333333333fSf33fSf~33333333@'@fSf~333333333333YDY򲨲33333333333333333333333333M6M@'@333333̙333333333333̙333333p3333333333333333@'@3333fSf333333fSf33333333fSf3333fSf33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333343;53333333333:44233333333327333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333̿3333@'@p33@'@33YDYfSf33fSfsas33333333333333p33fSffSf333333̲3333@'@fSf33fSfp333333333333333333333333sas~33~333333fSf33333333333333333333333333YDYYDY3333fSf33333333fSf33333333̙3333̍~3333333333333333333333333333333333333333fSf33̙333333fSf3333fSf̀p~@'@333333333333333333̙3333̲3333p@'@33fSf3333̲3333M6M33@'@p333333333333fSf噌3333̲3333p@'@33fSffSf333333̲3333@'@fSf3333M6M3333333333M6M33@'@p33333333333333pٲ@'@M6M33333333333333fSf33̙33fSf3333M6M333333~3333fSffSf3333YDY򲨲33333333333333333333333333̲3333YDYYDY33fSf3333̲3333̙333333@'@3333~33333333333333@'@33fSfM6M33fSfYDY33333333pfSfM6M333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333<63333333333:4433333333333337343333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333@'@3333~3333fSffSf33@'@sas33333333̙333333@'@fSf33fSfp33fSf333333333333@'@33򿷿33~~333333333333333333333333ٙ3333ـp33333333@'@M6M333333sas3333̙3333333333333333333333333333333333sas3333sas333333@'@@'@33333333sas3333򙌙333333333333333333333333̙3333M6MfSf3333YDY3333̿@'@333333333333fSf3333333333̙3333M6MfSf3333̙333333@'@fSf3333YDY3333̿@'@333333333333M6Mp33333333333333333333fSffSf@'@33̙3333p3333̙333333YDY򲨲333333333333333333333333@'@~3333YDY33fSf3333fSf33򲨲333333pM6M3333~3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333:5533333333373843333333333333333833333435253423333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333YDYfSfM6M33333333M6MfSf@'@333333333333M6MfSf@'@3333333333333333333333333333333333333333333333YDYfSf33333333fSf33@'@fSfM6M333333333333333333333333sas3333M6MfSfM6M33YDY3333333333333333@'@33333333ٍ~3333333333p3333p3333M6MM6M3333̙33333333333333333333333333@'@333333sas3333M6MM6M3333p3333p3333333333sas333333333333333333333333̙33333333YDYfSf3333333333M6MfSf@'@333333333333YDYfSf3333333333333333fSf3333333333̙33333333YDYfSf33333333333333333333333333333333YDYfSf333333333333YDYfSffSf33333333333333YDYfSf3333333333333333fSf3333fSf333333333333333333fSf̲3333@'@333333M6MfSffSf@'@33333333333333333333333333333333333333333333333333333333YDYfSfM6M333333333333M6MfSf@'@333333̙3333333333M6MfSfYDY33333333333333333333333333fSfYDY3333333333@'@fSffSf3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333353;73333333322=5333333333333333333943273733333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333p33333333333333333333fSf3333333333333333333333333333333333psas3333M6M@'@3333333333333333sasfSfM6M3333M6M~fSf333333sassasfSf٥333333̲fSffSffSffSf@'@3333333333333333򙌙fSfsas奚333333fSfsassas333333ٲfSf~M6M3333pfSfsas33333333333333噌333333333333333333333333333333333333333333333333333333333333fSf3333333333̙33333333333333333333333333333333p333333333333333333333333333333333333333333333333333333333333333333p33333333333333333333fSfM6M3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333̙3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333=854333333336494333333333333333333:48343333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333fSfp33333333333333333333fSf33333333333333M6MYDY3333333333333333333333M6M~̲sas33333333333333333333M6M̲M6M33333333YDY̥@'@33333333sas̍~33333333YDY3333333333333333p̀p3333333333~̿sas33333333@'@̲YDY33333333sas̲fSf3333333333333333fSf333333333333333333333333333333333333333333333333333333333333M6M3333333333pfSf33333333333333333333333333333333fSfp333333333333333333333333333333333333333333333333333333333333333333M6M̲@'@333333333333333333M6Mp33333333@'@p333333333333333333333333333333333333333333333333333333fSfp3333333333333333333333333333333333333333333333YDYM6M333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333364:6:4957252333333333333>93333333333<653333333333333333333A!632333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333354333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333;8=8863233333353733233333375<83333333333>833333333333333333363>633333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333:876333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333365@<75333333333333333333333333;8863333333333@9333333333333333333<4=5333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333366<;;:333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333365A>4333333333333333333333333333>;553333333333A;333333333333333352>595333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333YDY?@44333333333333~333333333333333333333333333333fSf̍~3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333~33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333353C!@443333333333333333333333333333B >443333333333A<333333333333333373@953333333333333333333333333333333333333333333333333333333333375333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333fSf55? B343333333333M6MYDY3333333333333333333333333333p~fSfsasٿ3333333333333333333333333333333333333333333333333333fSffSfM6M3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333M6MYDY3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333355D!C66333333333333333333333333333333B @333333333333A<4333333333333333A8>7333333333333333333333333333333333333333333333333333333333333:83333333333333333333333333333333333333333333333333333333333333333333333YDYfSf@'@33333333M6MfSf@'@333333fSf33hShbJf333333333333333333333333333333333333333333333333M6MM6M333333333333333333333333fSffSf@'@33333333333333@'@̙fSf3333333333333333333333333333333333333333M6MfSf@'@333333333333YDYfSf333333333333YDYfSfYDY333333333333333333333333M6MfSffSf3333333333333333333333333333333333333333333333M6MfSffSf3333333333333333333333M6MfSffSf333333333333YDYfSf333333333333333333333333333333333333333333@'@fSffSf33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333388E!E7733333333333342213333333333333333B @643333333333>:8633333333333353L$?22333333333333333333333333333333333333333333333333333333333333:9333333333333333333333333333333333333333333333333333333333333333333@'@򲨲3333~3333fSf@'@33333333~@'@333333333333333333@'@~fSf33fSf333333fSf3333@'@̙333333333333@'@sas33333333@'@p3333333333333333333333p333333@'@YDY3333YDYYDY3333333333333333YDYM6M33̙333333̙33fSf33333333fSf3333YDY33333333333333YDYM6M33M6MfSf33333333~@'@333333fSf333333fSf333333p333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333>?E"F66326396;7;8976442433333333333333333@ ?873333333333:8?;333333333364@;A93333333333333333333333333333333333333333333333333333333333335597333333333333333333333333333333333333333333333333333333333333333333̿3333@'@p33@'@33YDYfSf33fSf@'@333433333333~333333333333333333̲@'@@'@fSf33fSf333333fSf3333~333333333333333333fSf33YDY̲fSf33YDY33333333333333pYDY333333333333~@'@33YDYYDY33333333~3333YDYp33333333333333333333@'@򲨲333333M6MfSf33̙333333̙33fSf33333333fSf3333@'@3333~333333333333@'@򲨲333333M6MfSf33̲3333p@'@333333~333333fSf333333fSf3333M6M3333M6Msas3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333A!D@ ?5384:57443435485>;A >> 93333333333333333====333333333343E!@4433333297C!>65A:33333333333333333333333333333333333333333333333333333333333344;:3333333333333333333333333333333333333333333333333333333333333333M6MM6M3333333333p33333333fSf333333U>]M6M3333M6M3333333333333333M6MM6M333333fSf33fSf333333fSf33333333333333333333M6M33YDYpfSf~33M6M3333333333333333pp3333333333̍~333333̙3333YDY333333fSf333333333333@'@YDY333333333333333333333333@'@33̙333333̙33fSf33333333fSf333333333333333333333333333333333333@'@M6MM6M333333p3333M6M333333fSf333333fSf3333p333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333343333333B!E? A51;3333333333333333333?:D!A8733333333333388D!D333333333333=;:94398C >@<5332>933333333333333333333333333333242333333333333333333333333333333=?3333333333333333333333333333333333333333333333333333333333333333fSf333333333333fSf33333333fSf3333339>fSf3333@'@sas33333333333333fSf33333333fSf33fSf333333fSf33333333333333333333~sas33p333333333333333333333333333333pp33333333fSf33333333fSf33333333̙33333333333333fSf333333333333~3333333333333333̙333333̙33fSf33333333fSf3333@'@p333333333333~33333333333333fSf33333333̙3333@'@sas3333fSf333333fSf3333p333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333435233? BA!E32913133333333333333333333;5E!C::333333333333F"F77333333333398J$EF"B?<863233:7F">>9333333333333333333333333316232333333333333333333333333333333=?3333333333333333333333333333333333333333333333333333333333333333fSf333333333333fSf33333333fSf33333359fSf33@'@p3333333333333333fSf33333333fSf33fSf333333fSf33333333333333333333fSf33fSf33333333333333333333333333333333psas333333fSf33333333fSf33333333̙333333333333@'@333333333333fSf3333333333333333̙333333̙33fSf33333333fSf3333噌fSf@'@33333333333333fSf33333333333333fSf33333333̙33@'@p333333fSf333333fSf33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333373:;J$EH#C333333;797C <=8=9433333333333333333333272313333333333333333333333333333333367<?3333333333333333333333333333333333333333333333333333333333333333p333333@'@33333333ٍ~33fSf333333fTh@'@33p3333M6MM6M33YDY3333333333sas333333fSf33fSf333333sas33333333333333333333~sas33p3333333333333333333333333333333333@'@3333fSf33333333fSf33333333̙3333sas33333333333333fSf3333333333333333̙333333ٙ33fSfsas333333fSf3333fSf333333@'@333333333333fSf3333333333333333sas3333@'@YDY33p3333M6MM6M33fSf333333sas33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333353J'K783343843333333333333333333333333295K%H6633333333E!EL%LH#H=86;9=;:8@=@<8633333285>8=785433333332252936331333333333333333333333333333333333333;?8;33333333333333333333333333333333333333333333333333333333333333ppfSf33YDYfSf@'@33fSf̀psas٩3333噌333333̲33333333ppfSffSf33fSfـpfSfٿ33M6M噌fSf3333333333M6M33YDYpfSf~33M6M333333333333333333333333p3333fSf33333333YDY33333333̍~3333̲fSffSf333333333333333333ٍ~3333333333333333򲨲fSf~YDY33fSfYDYfSf3333sasfSf333333333333ٍ~3333333333333333~psasٿ3333噌333333̲33fSfـpfSfٿ3333YDY򙌙fSfYDY33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333?"E?!D957294323333333333333333333333333333::J%G<6:57485F"BT(PL%GM%GK#GF"EE!DE"CC AK#FB>54333333333333334395;5<5<4:4935322333333333333333333333333333333333333333333= D9<33333333333333333333333333333333333333333333333333333333333333fSf̲fSf3333YDY̥@'@3333M6MM6M̚F2T33@'@M6M333333fSf~33fSfp@'@~33fSfp333333sas̍~M6M33fSfM6M̲@'@33M6M噌fSf333333333333fSf33YDY̲sas33YDY333333333333333333333333̙3333̙3333333333fSf333333fSf3333̙3333333333333333333333333333333333@'@33̙psas3333M6M33pM6MM6M333333~̥fSf333333333333333333333333@'@3333sas̍~3333@'@M6M333333fSf~33M6MM6M̲@'@333333M6M̿YDY3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333357E&O573383?653333333333333333333333333333333A!D<=6485?;D!A753333333333333376B @333333333333333333333333333333333333333333333333333333333333333333333333333333:A9"F33333333333333333333333333333333M6MYDY33333333333333333333fSf33333333333333333333333333333333@'@sas33333333@'@p3333333333333333sasfSf3333M6Msas3333p@'@33YDYM6M33333333~333333̙3333333333333333333333@'@򲨲333333M6MfSf33̙333333333333333333333333@'@fSf3333333333333333333333333333@'@򲨲333333M6MfSf333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333=!C>"F333394218493736262433333333333333333333366E%K4434E#H56333333333333333333F"D3333333333333333333333333333333333333333333333333333333333333333333333333333333369="H<#H8 A5:3533333333333333333333333333333333333333333333333333333333333333333333333333333333333333338!D7!C3333333333333333333333333333333333333333333333333333fSf33333333333333p33333333333333333333@'@̙fSf333333333333333333p򥚥33333333p333333@'@YDY333333YDY33333333333333M6MM6M33̙333333333333333333333333fSf333333333333333333333333333333M6MM6M333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333B%M7<333395333333221033333333333333333333333333@"E;>=?? A33333333333333333333D!C773333333333333333333333333333333333333333333333333333333333333333333333333333333333478@:#H<&N<)S<(O9$F5;33333333333333333333333333333333333333333333333333333333333333333333333333333333:'L5<33333333333333333333333333333333333333333333333333333333M6M33333333333333333333333333333333333333333333fSffSfM6M33333333333333333333333333fSffSfM6M333333333333M6MfSf@'@333333333333YDYfSf3333333333YDYfSffSffSffSffSf@'@333333333333333333@'@fSffSf33333333pfSf33333333333333333333333333333333333333333333333333333333333333@'@fSffSf33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333337:B'O343363633333333333333333333333333333333333338;B#HF$J5533333333333333333333A@;:33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333498#D=,S=-R7"A3333333333333333333333333333333333333333333333333333333333333333333333333335=,T3433333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333;!C?$K3333846333333333333333333333333333333333333344I(TC#H3333333333333333333333??==333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333477$B9&G:(K>/XC;gC;i<,T8"E6=3533333333333333333333333333333333333333333333333333333333333333337#C:(K3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333@&N<"E3333747433333333333333333333333333333333333333K+X@!F3333333333333333333333??>>333333333333333333333333333333333333333333333333333333333333333333333333333333333333478)G>4VA:^=/Q9'H7"B6=498'H?7^>2X9"E=%M<#I69333333333333333333333333333333333333333333333333333333333335>/U5;3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333@'P8?333343;833333333333333333333333333333333333333O,[>!C3333333333333333333333@ A=>3333333333333333333333333333333333333333333333333333333333333333333333333333333347:.L?;[>4U8&C3433333333333349=3T?6W4857;!E="F45333333333333333333333333333333333333333333333333333333;+L;*L333333333333333333333333333333333333333333333333333333333333339675633333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333@(Q6<333333?;32333333333333333333333333333333333333O._\>9W6">3333333333333333333334<2Q?:Y5:3368>#G68333333333333333333333333333333333333333333333333339'F=3V46333333333333333333333333333333333333333333333333333333333388:84333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333335A)U7=333333:886333333333333333333333333333333333346O/b; B3333333333333333333333E#I893333333333333333333333333333333333333333333333333333333333333333333333333347@@[??\8+G3333333333333333333333333333<6R?333333333333333333333333333333333379O/b9@3333333333333333333344H%L553333333333333333333333333333333333333333333333333333333333333333333333335";BIb>=W5 :33333333333333333333333333333334?;W463333= A67333333333333333333333333333333333333333335;0O@:\5;3333333333333333333333335332333333333333333333333333333333<;9833333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333336?(S6=3333333376A ?333333333333333333333333333333338;O2f8=333333333333333333338:G%L3333333333333333333333333333333333333333333333333333333333333333333333336$>CMf=;T35333333333333333333333333333333333336AD`=7R333333> A333333333333333333333333333333333333336%A?;Y?9Z48333333333333333333333333332194333333333333333333333333333366==33333333333333333333633333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333388>?G-[>!D:7:7643333<:@?3333333333333333333333333333336:O2h7:33333333333333333333@!DA"F33333333333333333333333333333333333333333333333333333333333333333333336%>DPg>=V35333333333333333333333333333333333333336#=DLf9.G3333<=E$H787833333333333333333333333333337%?>9U@A_;1M33333333333333333333333333333333843333633233333333333333333333@B4433333333333333333333853333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333;=B A44333333333333333333333333338>O4l5833333333333333333333A"H=@333333333333333333333333333333333333333333333333333333333333333333335";BOd?BY35333333333333333333333333333333333333333333:2KDNg6"<33<>A!D88;<>>?><;4433333333333333337'AAD^AD`<8S5!<3333333333333333333333333363739484B :8474433333333333333333333377>@33333333333333333333339733333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333344@ C:;333333<(Q9#H33333333333333<@333333333344<:97333333333359>;TCNg=;T5"=333333333333333333333333333333333333337533333333333333333333333333?A55333333333333333333336565333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333355@!F6733333333<(P<)R333333333333333356C"FC"F9;33333333333333333333@(RH.`?%K45697;:@< B=!C>!@>!B44F&NI'QA"F333333333333333333333333333333333333333333333333333333333333333333:5JDVi9.F3333333333333333333333333333333333333333333333339,EAJbD-L443333333333333355973333338+CAH_BKc7(A3333333333333333333333333333333333333333339633333333333333333333333333A"F3333333333333333333333<:333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333335333333333333333333333333333333333333333333333333333333333333344@#G6733333333338#F?-X343333333333333333339:B!EF%K@"E<@:=8;8;7:8;;@!D8<3333333333337 @>,U5;3333333333333333333333459;= A@"GD%MM)UP,YN+VI'QM.^P2eO.ZM,W? ?<8:5733333333334D$JI'Q> B:<> CB"GI&NG$K> A5633333333333333333333333333333333333333333333333333?FYCRc6$<3333333333333333333333333333333333333333333333333333B5OFTj6%=33333333333333333373<;PEWj=?U3433333333333333333333333333333333333333333333333387853333333333333333333333A#I33333333333333333355@?333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333373323333333333333333333333333333333333333333333333333333333369>#G3333333333333349?1[9%G3333333333333333333333333356BBE!D::433347=)U9"E8>79323333333333333333<?9<33333333339:A!CH$J@ A55333333333333333333333333333333333333333333335#;CTd?FX333333333333333333333333333333333333333333333333333333="@CQd;9N333333333333333333<=QF]m<;P333333333333333333333333333333333333333333333333333333<;7633333333333333333333A$J333333333333333355A A443333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333634233333333333333333333333333333333333333333333333333333333>#H683333333333333333<+R<+Q333333333333333333333333<>E#H9:333333339#H=*V478>>$I333333333333333333C#I;?3333333333333355@@H#H:9333333333333333333333333333333333333333333@GXG`l6%<333333333333333333333333333333333333333333333333333333<9AN`CSd3333333333333333<:OF]l=>R3333333333333333333333333333333333333333333333333333333333=<<<333333333333333333A%K33333333333333;=@ B44333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333328433333333333333333333333333333333333333333333333333333345@%L333333333333333333<*N@1[3633333333333333333333A!DB"E34333333335>3333333333333333333333333333333333333346BR`@JY3333333333333333333333333333333333333333333333333333333396:6KDYh7(?333333333333:1FCVd@I[3433333333333333333333333333333333333333333333333333333333333389@ C;=44333333333333>"F573333469<> BB"F:<333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333943333333333333333333333333333333333333333333333333333337>;"E3333333333333333336 >@2Z:&H333333333333333333B"F@ B333333333335>-W<)Q35338@<#J333333333333333334J'O663333333333333333333344C!A><333333333333333333333333333333333333:3GFaj;8K33333333333333333333333333333333333333333333333333333333:56&>DWf:7K33333333335!9BO]EZf5 93333333333333333333333333333333333333333333333333333333333333333339:? BB"F?!D< A; A333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333354=933333333333333333333333333333333333333333333333333<$K5;33333333333333333333;+MA6^7!?333333333333<@C$I343333333335<*P>.Y8$E333333<%M8 B333333333333333356H%L3333333333333333333333333344D B4433333333333333333333333333333333DW`DZc33333333333333333333333333333333333333333333333333333333334243@HXBR_343333339/CCXb?GV33333333333333333333333333333333333333333333333333333333333333333333333333333333333333: A5633333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333344@;763333333333333333333333333333333333333333333333=&O58333333333333333333336<>1V=1T333333333368E&O673333333346;+O@2\9%G33333334?*V6;333333333333333355G$J333333333333333333333333333398?<3333333333333333333333333333337(=Gch>FS33333333333333333333333333333333333333333333333333333333333333>CSFaj6'>333333ANYGbj7'=33333333333333333333333333333333333333333333333333333333333333333333333333333333333333<#G463333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333332<9@=55333333333333333333333333333333333333333333<'P383333333333333333333333=0SA9_6!?33333333B$J< A3333333348=.SA4^9%G333333337@=*V33333333333333333333I$J333333333333333333333333333333B >433333333333333333333333333333:4EE[c<;K3333333333333333333333333333333333333333333333333333333333333396HCWb8/C3333;8IGch=BQ3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333=%L3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333355B A663333333333333333333333333333333333333333<(Q4933333333333333333333335<>4Y?6Z34333382X:&H3333333333<'O8#H33333333333333333333H#I553333333333333333333333333333:8:73333333333333333333333333333@ITHeg8.A3333333333333333333333333333333333333333333333333333333333333390DGcj==N3333ANXF]d6%;3333333333333333333333333333333333333333333333333333333333333333333333333333333333333334=&M333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333344E!C5533333333333333333333333333333333333333;(P5<333333333333333333333333=1S@9]9)G3333?#I; C333335:*KA8^>2W9&F33333333334:=+U5;33333333333333333333E"D88333333333333333333333333333343?93333333333333333333333333333ALUF^b5!8333333333333333333333333333365333333333333333333333333333333336(=DYb>BO33:2DHfgBPX3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333:!D9!D33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333377D!D33333333333333333333333333333333333333:&K7!C33333333333333333333333348?9[A=`5 ;58B'O57336">?7[>4X@6[6 =333333333333;(M;(P3333333333333333333333A >><333333333333333333333333333333?93333333333333333333333333333HddHgf343333333333333333333333333333:9443333333333333333333333333333336#:HdiANY33@JSDY^9/B3333333333333333333333333333333333333333333333333333333333333333333333333333333333336<8AB+XA*V33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333>>?@3333333333333333333333333333333333339$G:'L33333333333333333333333333:+J>5V5 ;<'J?%K46=3S?9[A:_333333333333333333333387H#A333333333333333333333333333333>83333333333333333333333333346F\_EZ^33333333333333333333333333333355883333333333333333333333333333335"8F]aBNW6%;IggGac34333333333333333333333333333333333333333333333333333333333333333333333333333333339?>%L9 E6;8@8?7?33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333F#G6733333333333333333333333333333333335:@1[34333333333333333333333333337%BA<^MDtF?h6#?@9[@;]6#?3333333333333346>/X;)M33333333333333333333333333H"A753333333333333333333333333333>7333333333333333333333333337)=IieEZ\33333333333333333333333333333333::33334333333333333333333333333347HfgEX^;8FDY\>CN33333333333333333333333333333333333333333333333333333333335433333333333333333347>"H9@33333333339#I5;33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333378E#H443333333333333333333333333333333333>.T8#C33333333333333333333333334A<^C?dMEwC?d?8Z5 ;463333333333333334=.T=/T4733333333333333333333333333:9F!?3333333333333333333333333333;6333333333333333333333333338-@HdbCSW33333333333333333333333387;:;<>@B"E;=<<883333333333333333333333336%;F`bAMUDWZIie:4D333333333333333333333333333333333333333333333333333333333344:89733333333336:>!D=!D5633333333333346;'O33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333=?B"E33333333333333333333333333333333339&G=.R33333333333333333333333348B>aD@hKFvB>aA=`333333333333333333<-P>1W6 >333333333333333333333333333333I"B6433333333333333333333333333;53333333333333333333333333391AIgaDTV33333333333333333333333333333333883333333333333333333333333333337*>IggCV[DXXE\\453333333333333333333333333333333333333333333333333333333333333354::>>>?>@=?9<443333333333333333338$E6 ?33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333A D@"E3333333333333333333333333333333348>2W6!>333333333333333333337%B7$@?8YFClIGtB>a=4T3333333333333333;.P>2W8%E33333333333333333333333333333333;7D!>33333333333333333333333333:533333333333333333333333333:3BJkdDWX33333333333333333333333333333333:=33333333333333333333333333333391AE__EZ[JkdG_]3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333348;*O3333333333333333333333333333333333333333333333333333333333333333333333433333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333A!EB#G55333333333333333333333333333333;,M<0S333333333333333347:-MB>a@:\5E^[CVW33333333333333333333333333333333;?333333333333333333333333333333<9GIieGa^E[Z@HO3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333=.S343333333333333333333333333333333333333333333333333333333333333333334477333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333>!BD%L8<333333333333333333333333333348@8]8'E3333333333469(G@8]A:_=3U8&C33;$K;$J34;.M;,L<#I=%M8!C5:5!?>6W@9^8'F365=9'G>3U@:];/O5 <333333333333333333333364;7<9;9333333333261333333339433333333333333333333333333339/?JmcHc^333333333333333333333333333333338;583333333333333333333333333333@HOE]\Hc_Jmc?FM3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333;,N5;333333333333333333333333333333333333333333333333333333333333333333<<33333333323333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333339=D&M@#H8<333333333333333333333333339*GA<^4933335;;*L?3XA9_=2U:,L463333<%M:#I35F>hG;f583334;/N?9ZA<_6#?3333333333596XB>d:(K@2Z?1XA6^=0T:)J4733333333=)R<&M?#F8!A:*HB>`A=_8'D@9Z>6W4833333333333333335:=6T?>\9*E33333333333333339897333352?5>5> 551333322834233333333333333333333333333333346KnbKnb6%93333333333333333333333333333333336;"E3433333333333333333333335"8F`\DYXHg^Kna;7C3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333:,J7%B3333333333333333333333333333333333333333333333333333333333333378<>333333333333:83333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333459??$JD)UA)R>%M<$J<$I9!D8!C9"E7!D9#G<)P<+RA6aGGtHGu=-S:(K6!?33333333333333;&NF,[575:B?bB?bB?bB>`49333333333333333333333333:.I@A];3N33333333333333>;553333333321?494333353323333333333333333333333333333333333E\XG`Y91@333333333333333333333333333333333347:"H5<33333333333333333333;6DJmcGa]Ii_Knb91@3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333;-L8&D333333333333333333333333333333333333333333333333333333333345< A;>33333333333333657633333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333323333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333458>9 C;$I?(Q='P>(S?,Y=)T>,X=*R;&L:&I:,L@<^=6S333333333333333333D,Y>)R336">B?bB?bB?bB?b47333333333333333333333333338*E@B]<6P333333333333B@3333333333335381939272626242333333333333333333333333333333F]VKp`@HK333333333333333333333333333333333333336 B9%I333333333333333333@LPF\X>DKD[UGaX90?3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333<1P7$A33333333333333333333333333333333333333333333333333598?<"F<"E; B453333333333334386<<;<<<><?= B9>353333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333344:85433333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333:,H@?\>8T3333333333333357E,W>,V9+H47?8YB?bB?b=3R3333333333333333333333333333339,FAF_:1K3333333377@>3333333333333393335251303333333333333333333333333333333333AMNKp`CTQ33333333333333333333333333333333333333335=;)L3333333333333345JlaKnb:3AKn_Kp`:4A3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333=6S6$?33333333333333333333333333333333333333333333347!D:$L9!D5:33333333333333333376965444::333333333358< C: B3433333333333333333333333333333333333333333333333333333333333333333333333333333346:A>!F?!E> C> A>A>?>>==;;8633333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333:.JAC`??Z493333333333?"E>5XGKtBAb9(E348&C7%B;-L:,J333333333333333333333333333333<6OAG`7&@333333C @7633333333332252;4:452323333333333333333333333333333333333339/=GcVLq]5!733333333333333333333333333333333333333336!?:(I333333333333;6BF_YHe\34@ILALM7(:3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333>9V6#?3333333333333333333333333333333333333333335;;)P6 @33333333333333333333333333333333::3333333333333359<#H5833333333333333333333333333333333333333333333333333333333333333333333333358<#G<"H7;3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333338)DBGc8*D>9U>;W6#=8(C=:VMHkCGiGKu7$A33333334@9Z@:\59333333333333333333333333333333AG_@E]353399C C3333333333527363426233333333333333333333333333333333333333334 6Lr^Lr^<9B333333333333333333333333333333333333333333;+L6!?3333333333EZUKp`BOO7(:@ILAMN9/?3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333>:V6&@33333333333333333333333333333333333333336!@<,Q47333333333333333333333333333333333398333333333333333345;$J5:333333333333333333333333333333333333333333333333333333333333333333339"F<%L5933333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333336@A]CJfCJfBFb:0KBDaA0P6">7"C49333333334:@;^?6W3333333333333333333333333333336$=CUj;7N45F"G6633333333334333333395333333333333333333333333333333333333333333CRNF_SBSM33333333333333333333333333333333333333333336<3S333333336(:HeZKp`@GJKo_Kp`Kp`Kp`<;E33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333=:T8*D333333333333333333333333333333333333337"@=.R343333333333333333333333333333333333337433333333333333333335;%L483333333333333333333333333333333333333333333333333333333333333349<'O7 B333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333CIeCJfCJfCJf4:5577<*P?1[?1[8#E333333338(F?7Z:+K333333333333333333333333333333>?UBNcD%J::3333333333333333333395333333333333333333333333333333333333333333?FGLt\Lr[45333333333333333333333333333333333333333333;/N5">333333DVPLq]CTPE]VKp`Kp`Kp`Kp`Ij]33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333<7Q:1K33333333333333333333333333333333333349=3V4733333333333333333333333333333333333333333333333333333333333349:'M3333333333333333333333333333333333333333333333333333333333334;<*R5<33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333=7RCJfCJf?=Y33777=?1[?1[?1[?/Y3333333333=0R>5Y7"@33333333333333333333333333337(@RTtB5Q3333333333333333333333:63333333333333333333333333333333333333333337+;Lq[GcT<:A3333333333333333333333333333333333333333337%A;/L33336&8Kn\Lr^>AFHf[Kp`Kp`Kp`Kp`Kp`45333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333<5N>;U333333333333333333333333333333333333>4U6!>33333333333333333333333333333333333333333333333333333333333333337#E7"C333333333333333333333333333333333333333333333333333333348%F=,S4:3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333337(B8*D3433:75:?1[?1[?1[>.V8#D9%G35333334?3W?4Y5<3333333333333333333333338:D#JKSjCRd3333333333333333333333;833333333333333333333333333333333333333333333DXNMu[HdS33333333333333333333333333333333333333333335?=Z3333F\QIjWF_T45CQPKp`Kp`Kp`Kp`G`X7+<;6B33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333338)CCKc33333333333333333333333333333333338&C<2Q33333333333333333333333333333333333333333333333333333333333333333334<-R34333333333333333333333333333333333333333333333333347#B=/U;)K4633333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333348??Y5!;33338 >5;9%G?0[>.X6><*Q>.X?.Y:&K7 @3446>1U?2X5;33333333333333333368A!ED$K8:;7MCTd7(@333333333333335677:9=:33333333333333333333333333333333333333333333?EFMu[Mu[7)9333333333333333333333333333333333333333333>>Z4791=Lt\QfQg;6A5"8GaYKp`Kp`Ih\7+;F_WKp`BQP5"833333333333333333333333333333333333333333333333333333333333333333333333333333333333333333347<7O7%?33333333333333333333333333333333>9W6"=33333333333333333333333333333333333333333333333333333333333333333333:&H7#C333333333333333333333333333333333333333333335:9)G=3V=/R6 >33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333335"/V;)N33333333335;;&K=)R>,X>*W;%K:#H?0Y?2[5<33333333458<< BA$JE%M= B44336$?G#D?=@>A?<;433333333333333333333333333333333333336$7E[NIhSF^N333333333333333333333333333333333333333333=:T8,BKu[SgQgLs^>BG33349/>:2@4546EYTKp`F]XJk`=AI3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333>;TERjERi6$>33333333333333333333333333337&@>:W333333333333333333333333333333333333333333333333333333333333333333333349333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333353323333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333338)BDPh4959>1X<-R3433333333333333335;9#H<%M?)TB,ZF7hI;pC.\@%N@&NB(PE)TC'N?"F9=4433333333CWdCTb3356>!ED%K;?45333377;:33333365>;86333333333333333333333333333333333333DUKMwXMwX7*:3333333333333333333333333333333333333333<9QJoaUhYpLu]6(:333333333333333380>Hc\KnbE]YGb]<:F343333333333333333333333333333333333333333333333333333433333333333333333333333333333@C[ERjERj;4M<7O5";333333333333333333333333<6R:,H333333333333333333333333333333333333333333333333333333333333333333333333>4X34333333333333333333333333333333333336<2OA?`:.M493333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333352633333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333337'?CMe5"=?2X>0T3533333333333333333333333333597==*SE5e?(Q8>7;573333333333333333?EVBTa;"AC%L:>3333333366A ?333333333333859733333333333333333333333333333333337+:MtWGbPE\L3333333333333333333333333333333333333333JofWuWjN{]443333333333333333333334<;EHd^JmcE\ZHe`=?I6';33333333333333333333333333333333333333333333333344::<<;=<><@< A9<3433333333339/G7(@@AZ=9Q7&@>>WDMf@D^;5O7'B353333333333333333AEa59333333333333333333333333333333333333333333333333333333333333333333333333<2R5 <333333333333333333333333333333337'BAC`>:X5!;33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333;73333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333336%?BKc@;^>3W5933333333333333333333333333333333336 @?-X;'O48333333333333333333<=NNavC5W563333333377B A433333333333333375733333333333333333333333333333333333AKENyWNyW<9?333333333333333333333333333333333333E]MZ}WrO_4!53333333333333333333333333346==HDZYLibEZ[Iie?GO7*>33333333333333333333333333333333333333333333333333333333337:; B;"G5:33339/G@J_5!:33333333358(B:1L>:W@>\<1N5 ;33333333337%?BGa33333333333333333333333333333333333333333333333333333333333333333333333333<1P7%A333333333333333333333333333335<5OBGc:0K34333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333343<933333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333335#*V:#G4833333333333333C7WLVo:3G33333333>?B B43333333333333333333:533333333333333333333333333333333337(8MxVNyWF^L5"633333333333333333333333333333333DXJTaY~Tm:3=3333333333333333333333333333333342;.??GOIfdF\_Igg>CN5#9333333333333597>8 A8A6?4:3433333333333333333333333333333333349!D:"G6&?BQc7'@333333333333333333478)G>7Y;.M363333339-G??Y33333333333333333333333333333333333333333333333333333333333333333333333333<2Q8(E3333333333333333333333333348>>WBHb6$?333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333365>;443333333333333333333359:A<#H=&N?)R?)U>*V?-Z=+T;(O8%G5>34333333333333333333333333333333333333333333333333333333333333333333333333336#@Jd~BFc333333333333333333333333333333333333333333336>;%L?)S=%L9B69333333<#IB4UGbj>AQ3379? BD#G9:333333333333333333333353523333333333333333333333333333333333?GCGbLN{UEZI333333333333333333333333333333?JDYfYfUz?EL3333333333333333333333332273754332:5223346==KE^`F`cGbe91C333357=!E>#I=U33333333333333333333333333333333333333333333333333333333333333333333333333<4P9*E3333333333333333333333336"<@C\AG`4 :3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333344=<>>7733333333347;< B@%L=#H: B7<57343333355;7!B:'K>.V>0W;*K483333333333333333333333333333333333333333333333333333333333333333333333@9[Jd~=?U333333333333333333333333333333333333333333333333588 A=$JA(QC)TA'NB'SH._A,ONXoLEaD$K@!E9:333333333333333333333333333372333333333333333333333333333333333344KqQN|UN|U;7<33333333333333333333333333?HCV_U`VbLxp5":33333333333333333333333333333295<7633333333334>BODX^Gch?DS=#D= D5733333490==>DDXQCUQKm`G_`NotLcsMnqF_^JkdF`_F__Gac@IS>AN7)>333333333333>@RAJ^;'N343333333333333333333333333349=U33333333333333333333333343863333333333333333333333333333333333333333333333=8T8(C33333333333333333333335!:AG`AH`483333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333344;;@ B@ CA!DA"F?!E< B8:343333333333333333333333346"@=-QA9_;.O5;3333333333333333333333333333333333333333333333333333333333333333;-K?9\EVjCRd33333333333333333333333333333333333333333333333333333333456;C,[<"G;'DKbmBLZ333333333333333333333333333333333333333333333333333333333333333333333333;8>LtSGcKNzQ90:333333333333333333333384;YbZdV^CXOCSc3333333333333333333333332233333333<7753233333333336%;DW`LSjDTa5 85"6==BE\PF`SLt\G`TLr^G`VIj]BRQBQQ>BNBJ^DKeAHY=?K?EOCRYCTZHfgEZbCV^?HV6)>33335":DWc6(>6>:(L333333333333333333333333333336<,P6 ?:4K?CZ333333333333333333333333:8333333333333333333333333333333333333333333333333>=Y7%@3333333333333333333346AJ_AMb4833333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333336!==3U?8Z;.N46333333333333333333333333333333333333333333333333333333333336>7X@9Z;9NBSd5":33334333333333333333333333333333333333333333333333333333:#G<%M336&N@HX33333333333333333333333352927322:53343:7333333333356?!BAHWHiiOqNz]HcRMu[GbSHdU?EG92?5!633333333335<>4U=3T5:33335!8:2E=BQE]fDYe@L[91F=AP?HW3333:'J7"A333333333333333333333333333335<*P;5PCQe333333333333333333333344;9333333333333333333333333333333333333333333333334@D_4933333333333333333333@H]BPd6%=33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333338%B?7Y@;\5 =33333333333333333333333333333333333333333333333333333333:-KBAc8(D8,CF^m:3I33336321333333333333333333333333333333333333333333333347=)T5=337*?HfgAMV3333333333333333333333333333333333333333333333333333333333333333333333333333IhLN}RHeJIkK4 533333333333333<==TYZ`Y^FcI44CVb:5H333333333333333333333333333354?76433337664333355<<<=9/:JkQQgS|SuF^R>BD6%83333333333333333333334;/N?9Z8&B33333333339/D?HWE_jLx{;;M3333353YDTj4733333333333333333344>>3333333333333333333333333333333333333333333333337'A@C]33333333333333333333;8MAPb:3J3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333348=4TBAb7&A333333333333333333333333333333333333333333333333333333>9V?;[3434CR`CSa3333436333333333333333333333333333333333333333333333339"F;'O333381CE[_=AN33333333333333333333333333333333333333333333333333333333333333333333333333336%7DZFO~QOQGdI333333333333E[FPRVZW\N|R448-BE]e363333333333333333333333333333439584623333G#A76::887(7GdMMxTIkQNxWE_WIioAM]35333333333333333333333333339)F@>]9.J333333333333=?OMy{DWh<;Q35339*I8$C33333333333333333333333333333349HTu8+D333333333333333378?@44333333333333333333333333333333333333333333333333<8Q=8R3333333333333333336$BSCUb6&=3311933333333333333333333333333333333333333333333334=)R7!B3333<9HIgg?DO333333333333333333333333333333333333333333333333333333333333333333333333333333909N|POQIkK5!533333333F_GOQY\X[SV3333@LW>DR333333333333333333333333333333923333636396533344BPDJoNLuSN|UCTG6&733;8LDWg?DW33333333333333333333333333337%AAA_;1M3333333333BQY@IT8.DBOc?EZ4 95<<0R33333333333333333333333367<;6533DViB?_3333333333339;>B;=3333333333333333333333333333333333333333333333333347BLc7(A333333333333333333AL^F\l4":3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333334<4PBGd8*E333333333333333333333333333333333333333333333333;2M@@]7&A33337*@Faj?EU333395333333333333333333333333333333333333333333336=?.Y463333=@KD[\;9G33333333333333333333333333333333333333333333333333333333333333333333333333333333=>>F^G44ANBLsMMzOHhJ:4:9/9TVXYSU:4;338+?DX_7*>33333333333333333333333333333372333333:485337(7CUDN}RN}RF`J;6=33333333?EXBQb91G33333333333333333333333333337&@AEa:/J33333334E[_:4E3348?DZ?E\59?8Y353333333333333333333379:;333333>BSGSk693346:A?#G> D9;333333333333333333333333333333333333333333333333333333;6MALa3333333333333333339/EDXe<;O33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333334>9UBEa8)D3333333333333333333333333333333333333333333333@@\CGd46333333@KXDYc6%<31:633333333333333333333333333333333333333333333;(M;*O333333BNTIie;7E333333333333333333333333333333333333333333333333333333333333333333333333333333333333F^GOQOQOQOQO~Q===SSTTHdH3333AMVAMV33333333333333333333333333333352223333536343:5;MzOO~QIkLCUF45333333333334CRcAN`5 933333333333333333333333333338+EAHc8+E33336(7V6">33333333333333333346<?333333338.CCVdB0T: B>#I6:333333333333333333333333333333333333333333333333333333333346DUh90G333333333333333333@JYE\h4 83333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333346@A]@A\6#=3333333333333333333333333333333333333333335:BFb>;V33333333:2FGcj?GU548533333333333333333333333333333333333333333333=-T8$E333333CTWDYZ7)<333333333333333333333333333333333333333333333333333333333333333333333333333333333391:OQOQOQOQOQOQQQLpKQP:2:33:4DHfe7(=333333333333333333333333333333433233332233@F?JlJMyON}P=@>33333333333333335#;DVj>AW333333333333333333333333333333<6PBHa6"<33;7FIhd3433333333??XCKh8)E333333333333333333<A33333333336;IXmLFk<"E33333333333333333333333333333333333333333333433333333333333333=>SAL^35333333333333333390EFaj=@Q3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333334!;CKe?@Y3533333333333333333333333333333333333333338(BCIe<5P3333333333?HUHdhB5H423333333333333333333333333333333333333333335;?/X6<333334JkdJkd4 73333333333333333333333333333333333333333333333333333333333333333333333333333333333?E@OQOQOQOQOQPQ]]UPH]F335 7Hdb?FO333333333333333333333333333333333333333333?E>QPQPIhI8.933333333333333333333;7NBPd6$=333333333333333333333333333335@C\?@Y34@HODZY333333333346EOk?>Z333333333333333344;@33333333=!D8-B?ET5":333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333338,FCNg=:S3333333333333333333333333333333333333353;3MBGa9-G33333333337(=F]cKT_5"9333333333363333333333333333333333333333333:(K@3[3333339.?F]ZCUV333333333333333333333333333333333333333333333333333333333333333333333333333333333333>A>OQOQOQOQOQUV]]UP??>33DUWDXY5 73333333333333333333333333333333333333333EOBQwMMqKNwM8-8333333333333333333333336ALb=;S3333333333333333333333333333338)BDOg8-E@JOAOR333333333333<7RFSo34333333333333338=69333379@"F7:335!9DW`FGa58333333333333333333333333333377;:3333333333:833333333333333@IYAN_3433333333333334AM[FajFaj>BS333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333>>WAIa8)C33333333333333333333333333333333333342@;RDMg8)C333333333333?=LNcgBPX343333335342333333333333333333333333333334>2X:(I333333?FMJmcBQS3333333333333333333333333333333333333333333333333333333333333333333333333333333333445"5N{POQOQOQOQ\[USMiI33@GME\Z:4C3333333333333333333333333333333333333333@@=VQVQOsL6%633333333333333333333333333:2JCPg48333333333333333333333333333333?E[CPeF\ZCSU333333333333=.KDPn9*F33333376;9;:;;A"H=>=@>B;?33333333>DRFVa=*I333333333333333333333333338:8833333333333398445465543333:6IF^j7)@333333346%<90D8+@8-BFajFajFajFaj5"933333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333336"UFG]6%?333333333333<;BMWF_a@JS333333:53333333333333333333333333333338$C?3X6=333333DWUF^Z<;F33333333333333333333333333333333333333333333333333333333333333333333334352433333:4;MxO;7<;89X33333333333333<<;765533336&;H#B6#;GbcF^`>FO33:653333333333333333333333333333333>3W?3X3333338->KnbKnb5 6333333333333333333333333333333333333333333333333333333333333333333333332228395<8BNTEZ]GddE[`>EQ;6G6$;3534BP]FajFaj?FU3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333348BOd@H^353333333333333333333333333333333333?AYAJb5"<33333333333365987)=G__HhdCCO653333333333333333333333333333338&D?8]7#@333333@ILHf]E[W333333333333333333333333333333333333333333333333333333333333333333333333333333@JBQrQNlNOQJlK6$633335 5]QYNX\ZnWe<;<3333333333333333333333333333333333333344RjIPjIZQEK@33333333333333333333333333333333336'AAF`47333333333333333333333333333333=?SQGb\333333333333>?X9.H9*I>)K=A;@7;68697=<$J>&N:!E<#G9B583333333334MScE^_8-?333333333333333333788;33333344>A34333333:8333335CT]E[bF]^E\[Iie@KR90B333333333333347+@7*?>CT?FV33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333>?UEYl;5L3333333333333333333333333333333333CLdERj6$=33333333333333=;33;1CNZ`Kc`BPT343333333333333333333333333346>5W>3V3433335"7Ko`Jl^92@333333333333333333333333333333333333333333333333333333333333333333333333335!5DZGN}RN}RMeMHVF44333333CD?]Q^\YhVbMuNQwMBG@333333333333333333333333333333333333M\E]Q]QJYD33333333333333333333333333333333333334CIf8(C3333333333333333333333333333336)@MvsIkc333333333335AI`6'?6">;.O33447;9?8?6=8?9 B333333333333333333A+GHfcDVX6&:3333333333333333< B34333344= C3333333333763334BQYLvrMvlGa^CRU6%:3333333333333333333333BQ^DZe8*A3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333374954333333333333333333333333333333333333333333333333333333333333333333333333333335";BPcAL_3333333333333333333333333333333333?CZAJa6%=3333333333333387F"C:9:/@IicGa^CWV5!7333333333333553333333333a7#@333333?DHKo_Jk^34333333333333333333333333333333333333333333333333333333333333333333333333=?@LuSJnPLuPN}RBPD=:55333333GMAVV_hH`R:7;OqKVQVQDLA53323333333333333333333333333333=39SnJ]Q[O8&633333333333333333333333333333333333333>1U333333333333359!D333333333333333333>@8-?JjcE\[5!733333333333333<"E333333; C4533333333333345CW[S|IqhG`\8.>333333333333333333333333334"9EYfEYf36333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333286:73333333333333333333333333333333333333333333333333333333333333333333333333333AM_F]m8+B33333333333333333333333333333333BNcDVj7)B333333333344<:;8><43338-?F]ZJmcF\Z:3A3333333333;:333333339*HA?b;,K3333336&9Lq]HeX<BW?EZ3333=0U333333333333477 B333333333333333333=>33<=HF`\F_[46333333333333;!F3333599@3333333333336$:Gb`S{N|lBOQ34333333333333333333333333333333:2GCScAL]34333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333355=;3333333333333333333333333333333333333333333333333333333333333333333333333392GCSc>CV33333333333333333333333333333333>BXAMb7+C628594:6;8:6433354;:33337(;F]ZG`[Knb?GK5 6333333658833337&B@=^>6W35333333AOLLr^Jl[4533333333333333333333333333333333333333333333333333333333333333333345>BBMwVNyWGdNMyTCSG45333333?>54339.9cafi_wT<:99449+8QnJZQ]ONdEA==333333333333333333333333LTCbRbRXqK333333333333333333333333333333333333333333;1N;1N33333333333333333333333333333333DY^Qx::B3333334 9DWh8,D3333=-R3433333333336 @6=3333333333333333::553333AKPF_[F_Z6$93333333333;#G3333;"E343333333333<9FLsiTyOk==F333333333333333333333333333333333333=?SCTe<33333345DUTKnaE^WIj];7B333333;>337%@?;ZA?a5;333333;7@KqZE]S==D333333333333333333333333333333333333333333333333333333333333333334>ACLqVLtWIiQNyWIhP6'73333333333::;;33OjQ]bYSIQB3365>=@@9%8RoKVjK[O]QKXD44333333333333333333;,8\vLVnJaQ:+8333333333333333333333333333333333333333333;/M=3R33333333333333333333333333333333AMVVDXS333333=?SAM_343333;)N343333333333:&K353333333333333343<:33333333@IMKnbEYU9/?33333334:"G3345:"F333333338+=BORO~mTtLuc;7A3333333333333333333333333333333333333333?EYDXi:5L333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333??44333333333333333333333333333333333333333333333333333333333333333333333333@HZCWe9.D333333333333333333333333336333>?UCTg=5">AB`BDb5!=33333345HfVLt\IhW3433333333333333333333333333333333333333333333333333333333333333DGGKlWGbQMwXMwXDXK=<@3333333333333355@@<9?VWeaeSKOB33333344@ A> >LOC]Q]QSkI]}N?6;3333333333333333WlJfSfSLRB33333333333333333333333333333333333333333333;.LFKo`Jl^<;C333333;$K336>8?33337*@VEXl;6L333333333333333333333333333333333333333333333333457;< A< B= A:<563333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333366==333333333333333333333333333333333333333333333333333333333333333333333333==PG`l?CU333333333333333333333333337352:4JEZjBQc333333333333333333@@3333333333335#8AMMJl[Lr^GcVE[QC6PCFc@@\8(D33333333DVMIgTGaS;6@33333333333333333333333333333333333333333333333333333333336):BPLKnYGdSQr[NlXF[M==A33333333333333333333B"CIjQ]`eVfSB;<3333333332D"B;?A>=SnJ^PbRbROZD#H9>57443567;<>?77333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333@ B3333333333333333333333333333333333333333333333333333333333333333333333335#:80D7+@5!:33333333333333333333333332:790FF]mEZj333333333333333333?B3333333333333333:5@HeWGbTMwhW{H`l:0I33333333:4>Mu[Mu[DUM3333333333333333333333333333333333333333333333333333459/>>DHIgYIhYLr[Lt\E[PGaR;7@;78533333333333333333333NKSKpQTyQYoJ^{N9(633333333=:53;?<?8'6WpKbRYsKdQfSR_F3333<-8DA>>2:6 4OZEKPB3333333333333333333333333333333333333333333333=0R7$B3333333333333333333333333333333391CKuiLv_92<=@QF`i6'=333333489#G3333333333:*J49333333333333333344333333333333333390>IiY92>F]TLr^Mml=?H?CHKoXKpX?EF33333333333333333333333333333333333333333333333333339/GDPh@D]8*D333333333333333333333333333333333347;$J<"G573333333333333333::::3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333@ C3433333333333333333333333333333333333333333333333333333333333333333333336%:3AALOE[WGbXKp`F_WLr^Lr^EZQBPL8-<333333:787333333333333333344Uc]NzUbQjSjS<.8333343?=853333?!E6833IMAVjIfSfSUgH6"5WlJfSfSfS[sL8&6333333333333333333333333333333333333333333333333>3V4:33333333333333333333333333334364;3FMwpRiFcZF`h;7J333333338 B5:3333333333<0P3533333333333333333333333333333333333334BNLLr^Lr^NphMqh=9QKnbCQN:2@33BRIIhUG`R343333333333333333333333333333333333337533333333333333335";>>WAHa??Y5#=33333333333333333333333333479#G;&N593333333333333333333333549733333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333=?573333333333333333333333333333333333333333333333333333333333333333333333AM]G`lG`lG`lG`l7(?333333333333333333333333>=E[jF_m:3I3333333333333334@!D33333333333333336$>?>XDMgJNoGa[Mu[JlW5#7EYNMu[Mu[KnX;6?45333333333333333333333333336%;8/B=@M>CODV[BQVHdbDYZJkdF`]JmcJlcHf]KnbF\WKp`DXSAKK92?34333333333333:8<;33333333333333>C@[wbBSEfQjSjS7#544;;B @5533333356A#I33337"5R_FdR9'7UfHfSfSfSfSfSZsL333333333333333333333333333333333333333333333348?3X3333333333333333333333487(?9.C:4G<5G<1ECDSOaiQ~lQs?ET3333333333<#J333333333333>4U3333333333333333333333333333333333333333F_ULr^Lr^Lq_Prt?>Q7%@3333>ACMwXLrV5$733333333333333333333333333333333333333:7333333333333333333337&@=;VCJf>34333333333333487"B;'M<)Q7 A34333333333333333333333333336554333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333;?8:3333333333333333333333333333333333333333333333333333333333333333333333EYfG`lG`lG`lG`l:3H6&=8,A3433333333333333333344KKbCRc=?R33333333333333;?9<33333333333347<6ODOhCNgA?]:&H33>AD:5?BQKMu[Mu[Mu[Mu[LrY6&83333333333333333337*@;8JBP\CS]HdiCV^HfgDX]IggDZ]IieE\]JkdF^\Hf_F_[?DK>AI8.>5 6333333333333333333333375@>=<5533333333E[GXv_@6C]mMbuQh{WB!BC C:9333333333333=!D7;3333337"57$6fSfSfSfSfSfSfS;-8333333333333333333333333333333333333333333337$C;*K33333333333333336'?=>SCRbDXeBSaAR^DXbEZaDW^KpnV]`BNP8+=3433338@7=333333333333=6U3333333333333333333333333333333333333333AJKLr^Lr^Lr^Nrk<6T8%E335"6GaMJlS@GE3333333333333333333333333333333333333333::3333333333333333333333335"<;1L>8U@>]@@a@9Z=2R<0Q1X=/U9&I6<3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333338;;?3333333333333333333333333333333333333333333333333333333333333333333333@GXG`lG`lG`lG_k6#;?ETFajAP\=@P363333333333333333@@SR^rJXj33333333333334B#I33333333335 :<8ODOfERjAF^<7S;%K33333333KpXMu[Mu[Mu[Mu[Mu[>AD3333333333335";<;NCS`F`jDYdGcjBR\BOY<>L<9I8-@7(=5"8473545333333333333333333333333333333333333333377??D DB C@ CH9KYz]\gbG&Juau_r\8!6333333333333333369>"G33333333=19fSfSfSfSfSfSfSB<<33333333333333333333333333333333333333333333<,Q6 =333333333336:3KAKaAOc=?R8-D383333333333DX\P|RyQgX~qIhaDYW@IM7$<9V363333333333333333333333333333333333333345DUPLq]JjZ;8C>4Z=/R33DVJNyWJkQ333333333333333333333333333333333333333333<<333333333333333333333333333333345:8%B7&C7%B6"@5<4633333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333344?"F33333333333333333333333333333333333333333333333333333333333333333333=>Q7+BAL\G`kE[h:3G337)?=@QE^fE\eF_e>CQ4733333333333390EF_kM_oB)I>?8:555568B$J9<3333337*B>?UDTiDVjAG_AG_6$?;$K5933333333KpYMu[Mu[Mu[Mu[Mu[>BD333333335 9==QF^mCUcDWe<>O8+A4 83333333333333333333333333333333333333333333333333333333333333333333455CMCMuNJNM;":oUoUoU54333333333333333333A&N3333333354eSfSfSfSfSfSfS:*7>2:33333333333333333333333333333333333333335<<+Q33333333339.G@G`=9R6$=3333333333333333<;HPwS>DIN}RMjRA6KAMPJgaPgiANN8-<333333333333<5Q6$>3333333333333333333333333333333333333333333333336!=EGp91@GbMKpS<:?333333333333333333333333333333333333333333>>333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333@$I453333333333333333333333333333333333333333333333333333333333333333;9LG`lEZg3535333333333346;7IF^dCV^Gad:7G3333333333468-C5!94767<>>!B?!D<AH(S=$D7-C?DWBPbEYlEYlAKaAJ_7)A33:%L5:3333333333CSLMu[Mu[Mu[Mu[LsZ6'9343334;7NCSdDXi?GZ6(?333333333333333333333333333333333333333333333333333333333333333333333333333344P~OP|O<*>?'@mToUoU33333333333333333333>#J5833333333OZEfSfSfSfSfSUfH9(7eR]yM@7;333333333333333333333333333333333333;)P5<3333479,H??Z<6P38333333333333333346?GOIieO~rE\^5"8DYFLwNEBJ<?=(D@LNGaVLr^AMK7(933333333:/J9-H3333333333333333333333333333333333333333@JIIgV453333=5XPqtN|YGdL33333333333333333333333333333333333333333333D!D::33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333339>; B33333333333333333333333333333333333333333333333333333333333333;7LE[jBRa9/E33333333333333333335>COHegDX]DW\6$:33333347AKZG`lG`lBO^5!:4690E>ATAI\K]tBPbF]mF]lANb@G\6'@33339$F6 B3333333333334 5F\PMu[Mu[KqY<9A33E[MEZQ@FYEXk>CX6&>33333333333333333333333333333333333333333333333333333333333333333333333333333333;6;NvMLpK44@"FeyMhOlQ>/9333333333333333333;"E7?3333333343OXDeSfSeSR`G54UgIfSfS[xMMWD8%6333333333333333333348?9!E9#H:&K:'J<*R=.W8'E9+J=4T=7V9,H4733333333333333333391AEZYJkdBPTIlfHcb33>A>P}TQaVC$I33336%8@KKLt\GcT?EF3333336%?=;U3333333333333333333333333333333333333333@KIIjX333333<:GMpnRq<9A33333333333333475<6<6>5;363333333333333333<=9977<;;::9964433333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333@%L463333333333333333333333333333333333333333333333333333333333:4JCRcF^m:1G3333333333333333333333336&G`lG`lCQbH]oKWqAJ^;7L483333335:;)N333333333333@GGHdS8+:7(990=453391<;@Q}SXYOzR@KCMTVlYoYpWD?=3333333333333333339 D9 B3333338%6543354;-8543333FE?aPeRXrKbRaQGM@7#5333333333333:@;!C5:3333335<<*V6 ?6"?5;46333333333333333333336':AKNJmcF^[>?J=0T<,O:&H7"D7!C8!D9"F;$I<#H: C8>8<9=<@<?4533333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333337<>%K3433333333333333333333333333333333333333333333333333333393IF]mDXi7,C333333333333333333333333333335@GPIieHba=?K35G`lG`lG`lG`lG`lG`l6%;F\iE[g=?R:5J:$D="F3433333333;)M5;33333333337(9LsZMu[GcS33333333;3MG\iO|rMzZHeO443333333333333333333333333333333333333333333333333333333333333333333345<9A@JHJlWGbQMwXHeP[b\_RYHiMRzYifj_l\YTJjILeHDNB;0944333333339 C9!D333333YkIfQJKA33333333333354ED>aQbR^OZO]QOaG;19333334< B563333333357=&N4733333333333333333333333490>CTQIi_ImaCST8+=33EXYNvfGZORcOXwTSR]\TUXz\GhKN}RIiMN|UHjOSaWeVdIjTMu[OzpMwhKo\GbWGbY=AH9/?3333333333333333333333333333@JGHfS5"6339/9JmMO^DQ_>;X9-H359+I?8Z;-L6!=34333333333333333346597967333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333;!D<$I3333333333333333333333333333333333333333333333333333<;QEYl@K^8+B333333333333333333333333333333478-DEYaO~T@NSGalG`lG`lG`lG`lG`l6$;5!9333333336;>&L6<333347<.R333333333333CVNF`QLrY7+:33336%?AC]@E_;4M<:@MwVHeOHeM5!533333333333333333333333333333333333333333333333333333333333333:3@AMMKo\JjWJmYIiUBPJ@IFAJCYUS|O;9=:6<=>?_r`aWdV]VKmJVQRyMYPZQKZEGNA9+7339!E9!D3333=/9jSjSUaG33333333333333338'6NYEPcG`S]QSoJZQV{NDJ@A.C33333333337=>%L4633333333333333333345;8A@JJJm[GcYKp`CUS=DHF_WGc[He]Gb]<BELt\Lt\;WCJf<8R6"<333393CCHeP91;6%6O~QOQ@JA?;YCEdHXu<6Q333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333339!E<'Q6<33333333333333333333333333333333333333338)BBJbBNc@H]363333367&A<4N?>X@B[DNgBIaERjAH_DVjBMbEYlDUiEYjF]mBNaF_mBQa?FWAMXKpfJpfIjmG`lG`lCSa6$;333333333333333333479"FB;i<-U9%G7#B6!?6 =9/DHc^KmdLji?:YA>]?;Y;2M5 ;3333333333<@KF__Gdd?HR90C35333333333333?DCNyW=?AH^FVPXWYiZUc[`~sanYwlhShQ[kJb}N_vMYiIQ^FQ^FLQB@:;>4:6"533333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333336==*T:&L48333333333333333333333333333333335#8Y5;7"C:&I;*M=2SMloPvtLjm=8R7&D49333333333333333333=A?N}RN}RAOC333333333333333333333333333333333333333333338.4>MLOHPGOwPQPHfIOQJoLN}RN}RHfMN|UIiONyWNyWHeQIhR?FE<9@4 6333354HF?dPhRWoJ]~OQv\KobF]X3333?>333333?;.X;)M6 ?3433333333333333333333369,G>;U485;:0LBDb@@]CHe?>Z=8T8-H7&@4 946333333333333333333333333333333AKNKnbF^X>EM?FV91E3333333333333333333348>6W33333333CRQE\UKq]92?33333333333333333333333333ANDHgJM|OALB3333333333333333333333333333333333336&9@HIIgVIiWRkTuPgBPI>BB93;8-:5%64544445$59.9<8;[Q_T]RZQWwM]QZyM{^|^zgPMX483333333333336>D><<=ALCALC=A@@HC;:>;6=7(8333333333333@4:dOjS\sLdROZE:3?F_XGd\:4B3333;944333333L\E`~TZqQB!@<;;;453333335 5JnNHfJDYJDUb:5I3333333333333333468.B>BRK]^Wtjnxwvh}jl|gklfsXxVexMsUpd_|kqoUaxMjSjSb~NfSfS_~ObRbR[zM]Q]QUsKYPW~ODM@<4:3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333346:&H=/V>1W<,O:)I7$B5!>5 ;7#?7%A9*G=5R?;XBEbCIe??[<5O495 ;;0NBAc?=\A@^:.J6"<33333333333333333333333333333333333333333333ALOJm_OqImqAM[333333333333333333335#><5T333333>DIKp`Kp`;7B333333333333333333333333333333IiKOQMzO9/93333333333333333333333333333337,=DXSF`VLr^E[RIkbImh;8F:7333333333333333333339(7bRbR>3:7%6DE?N`FWsK|^|]_nbWdcPTU9&933333333:(L9&I33IG?{[^sVoUhQ>093333333333333333476$=8,D8/F;7L93I;6K8-C6'=;<3333333333333333333333333333333343RWD^rKiSjSWhI:+733GaXKp`DXS3333336576333333;28aT_{S?7;3334:<<>3433337(7N|POQ?IJCUa91D33333333333333:%5aaG}SXhpJXZZgtKq`nbo\p]oRi|OSVCSWDNOCL[jKbp?2:=-8<,8>2:?39>3:D@=ED?HMAP^FP_FWvM]QSpJZQZQNhIVQPrL<:;44333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333345 =9'H>2V?6Z?8Z@:\B?b@;\@=]A@^<5Q;1M6"<3346\lJoUoU]qKII@333334>CIJl^8-=333333438633333333OYF_wQZwM33333356> C443333>B>JjJMuL=AMCU_9.B33333343OD?u{Ot{NWXXwQWWWkwLcZca^VNmJ33333333335'AI_{7'B33333333333333333333336#5<3:GRCUwMQuMVQS|ONuMOyN?B>443333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333548593633333333337#A=4V@=`<0Q6!<333333333333333333333333333333333333333333333333333333336':IgYRvQ|AMY3333333333333333337(C=7S338.?Ii_KnbBOQ333333333333333333333333333333333333<>BKGd_F^Z>@H3433>CRE[b6%;66983333333333333333333333B=<[vLZuL4333333333XYDhrKo~MtS_wMjS\qOlekmT\WGA`@2\;(L54tTxVoQ44OSCiOsUsUYdKA;J>:4H;;MAN\BT_GcjCV`Gch?FR;7G4 73333333333336 4bsLsUhOkShQA5;34ALMJl^Jl^ALM4!633333333536533333333F;>bRbR@8;33333334=!D333333LoKQPBNB>APDV^:5F53RE?zQYYYt~OXXXjsK]^FI==74HcIWVPtKCK@333333333334EYm@@a4833333333333333333333333333337&6ERCJeHQPQPHdHLtN<<=33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333334<-O>4X?7Z6">33333333333333333333333333333333333333333333333333333333333333>BFNyeNsIki8-A33333333333333338(B?=Y:3BIjbF^ZCQR3433333333333333333333333333333333333333F\FKlJQvLAD?33333333333333336&;CSWIga>CL463333:6IF^g6&<33==333333333333333333333333JNBfSeR3333333333YXDWWW:%6>09XeGoUnTd{Vnu]jk<-NJEOtftc[dT7%B8'DIHShjemouovNW\7&A34333333333333333333333333347*?=APEYaF_bHfgE]`E[_?GP=>J80A7)=43333333O{O_][TBE?333333333333EYh>=U=.T6 =33333333333333333333333333333333=<333333333333333333333333GF?[tL\tL3333333333H<3333?2:WaGrUpceyamTfuTgw[fz`HDU2:333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333335=-R>3Y6!@333333333333333333333333333333333333333333333333333333333333333333333390=N{cSwJqi<9I33333333333333;;HQKoi?EL3433333333333333333333333333333333333333333333??=VQMhIK^E3333333333<:JE[_@IS3433333333AL\>@R333345;=333333333333333333333333NSCjSjS33553333337!5WzSq~OabG33333333GBBg~qi~QxV_[~V7!53333333354]dHmPxT}VROB333333333333333333333333333333333333335#9;8FBKQgenrjlnvafLqbGb[Kp`Kp`8-=Ii]Kp`Kp`Kp`Kp`Ii]333333333333333333333354bPZrKKOA3333333348:"F3333GC=vY_~QX\j~xhdPQI333333333333333333XS_ZWO54333333333333AM\<=O33335=:&M9#H6=3433333368<?=?8:5533333333333333>B@MxQGfLN|UF_K443333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333;*N?1Z5<33333333333333333333333333333333333333333333333333333333333333333333333333AMJQmV}Ihg463333333346BPUIieKlsCT_33333333333333333333333333333333333333333333333333I\EZQZQ@?=333333=?ODYa<8H33333333338/ECUe46333358:;333333333347474833333333NSCjShR999933333333ZXDTXW9"53333338#D<-PalJ{W__\B3:333333333333^cG}V}VqPSLA333333333333333333333333333333333333338"5gsL}V}VmQNQE6&:7)<7':7*<7);34@GKKp`Kp`Kp`Kp`@GK333333333333333333333333UdGjSgQ4333333333<$K53SD>Z``^x{NYTXZIGa\E]YAMO3433333333333333[UaZ]S33333333333333DXd>CS33333333477@:#G<#GBY33333333333333333333333333333333333333333333333333:-8ZQZQMaF4433=?PDXb8/C4!;8*C:.H90I9/I9-HDZo<8P48333378:=376 >8$F:&L;%M9"F8 B9 B;!E<"F< B:?K@GcmUfuV<):3333333333VPBXXXQI@333333<)P6 @33\aG[][qPK@=333333333333^dHtRvQWXUC3333333333333333333333333333333333:$6uQo|NyTzUJ@=3333333333333334?FJIg[Hf[?FJ34333333333333333333333333FB>jSjS?5:33333333L;JZXP]^_TVKA433334?HMHe\EZT5#8333333333333bYf\YP33333333333333DXb<;L33333333333333333333333333333333333333333333333333;@X=8R;4N>B\G\s=8V?:[@;]?8[?4YE6_;,P9'I6 ?343333333333333344E>>oUoUB9;3333333333<'6XXXjpK333349<*T3533`cGX_Yo}NW[ZE333333333333_aGWWVF8;33333333333333333333333333333353vQWWn|N?.833333333333333333333333333@HI=>E333333333333333333333354_vLc|NU]F333333meH`j[PZ`x\NSB3333333333;8CJl^F\T8+;33333333;.8g\f[N`E33333333333335DYc;8I33333333333333333333333333333333333333333333333333337)8HgPIhRLtW:3=333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333335>,V:%I33333333333333333333333333333333333333333333333333333333333333333333333333333333339/;QiW|RuHfgHfgEX^337'<333333AK`<S8+C4733333333?CY9/H3333333333?"E333333333333333333333333A5;oUnTGB>333333333333ntLntLs{NWG6;33:$J8"E3333o{NWWhrKWWWRJ@333333333343gnJVoxMWE5:3333333333333333333333333364s}OhoJWUG:<333333333333333333333333338.=Lr^Jn[8,;3333333333333333333333d|OoUgP33B-8RwsL[o][vtL^xMToJKUB3333333333338/=Kn\F^S:1>333333GL@l]j[MXC3333333333337'=Hdi:4F33333333333333333333333333333333333333333333333333333344GaOMtWE^O:4>33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333:%K<)Q34333333333333333333333333333333333333333333333333333333333333333333333333333333333333PnVzRuIjhHfgHfg5"9333333339.EEZk4833333333333333333333333333333333333333333333333346Pp`\uZPwn3533333333333347BKc353333333333="F33333333333333333333333343dwMlQ]iI333333333333PE?YYYjkJ5:='Q353333msLr}NsO;&6ekIWksKXbbG333333333343ltKXXU<(7333333333333333333333343ovMXXnxME7;333333333333333333333333333333>CFGbUKoZ7(933333333333333333333SZEiQ`rL^UBZ\UUbmO?)7IMAbR`Q443333333333337);IlYJkX7,;3333N^Ei[l]B?=333333333333:5FDX_6'<3333333333333333333333333333333333333333333333333333333344BNIMu[KqY6%833333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333335;>*V5;3333333333333333333333333333333333333333333333333333333333333333333333333333333333335 8He`VzW{O~pHfgHeg463333333334@K]>FY33333333333333333333333333333333333333333333338+@CU`F`f]kbz^S6!53333333333339+E=:T3333333333339?8>333333333333333333333333kQsUhO33333333333374WYYW@*P7=333333WXX6433[ZDXXXZUC3333333333?,8VXt~OkmJ4333333333333333333333YRC|RXXXRC3333333333333333333333333333333333DWOKoZGbS9.<333333333333333333G@>pSZ]\\\OX[SW8#C33:+8bR\}N=49333333333333337*;HgTKpY6&833cRm[gV7%5333333333333?DPHdf34333333333333333333333333333333333333333333333333333333333333DYNFaSJjX5 633333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333;$L:$I33333333333333333333333333333333333333333333333333333333333333333333333333333333337+>DX^DV]91BWzW{UxHfg?FR3333333333338.DCTc90E333333333333333333333333333333333333333333<333333333333<7Q8+E33333333333334>#I333333333333333333333333]iIh~OeyN9%7343333333333klJYXuy^^US333333<'6XXU333353nuLX|R~QZSC3333333333I;.8]^[\\\V=&635=0S6"?33YpJdQP[E3333333333333333;7@HeSHdQ7&6lYp]kY33333333333333G`bAOV3333333333333333333333333333333333333333333333333333333333333333F_SLs\@KJ33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333347?)S5933333333333333333333333333333333333333333333333333333333333333333333333333333347AJVCT\HfgHfg8-@D[QOiQl@JO7)>5 8333333333333@HYBQ^5":33333333333333333333333333333333333333@GRCV]AKW3536F[gYxOWnK[sL333333333333?>Z48333333333333339@9 B3333333333333333333369NGMyfyeUKP= B>!B>@=?9933D2:mnK}[jW8 53333=(6pvMszNouL33333353hkITYYQF?3333333333jlJYYYC2933333333333333@,8XYYu}O333333333333333333333333333333333333333334EYOGaQMwX?FE333333333333:"5Q``X[\yN9!5333347=3U8(FVhIfS^zN333333333333333333BNHMvXG]JfUmZ`Q33333333333334?GQ<;I33333333333333333333333333333333333333333333333333333333333333336$8E\RLr^<;C33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333338@=%M3333333333333333333333333333333333333333333333333333333333333333333333333333338.CAMYHdiHdiALV8+?33<BNE[_@HS33338+D>AWaPfSfS=193333333333@?\333333333333333333<$K4:333333333333336;=%L;"G@0@wVxV`jJ3333333389>>55{~WkZY^WD3333E5:YYU33333333;%6TYYpsLI8;3333333364~RVtxMU:#5333333333364}PqtLYV<'733333333333333333333333333333333333333333333CSJMwXGbOF_M4 533333343U]abcP_QB333333333346=3TLVY[sMZnK54333333333333333333E\LY^rbt\WlI33333333339.AEY]EZ^9/B333333333333333333333333333333333333333333333333333333333333333333:3?JlZEYS5"733333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333<#I9 B3333333333333333333333333333333333333333333333333333333333333333333333333333:6IGcjGaiCT^:3E33333344MxTN|UKr]HfgE[a5&<3333333333336'=Gbi?FT34333333333333333333333333333333<:HHdeAMU333333;5N:0JNVDfSfSJOB3333333347>8V33333333333333333347<&P4833333333349#G;$K473333i|NgvL_gH333333333333=>[HWZYYT7433J<=YYS3333333333?,8VswMYV?*733333333A.8SYYuwM3333333333mlJYYyOH9;333333333333333333333333333333333333333333333333<;?MwVNyWF_L;7=33;#5TwlI]`bbsoK3333333333333333ILSgthc>4;3333333333333333338,:_^mes]OVC3333333335HcdIggIggHdd45333333333333333333333333333333333333333333333333333333333333333333@ILKp`BNN33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333@'P6:33333333333333333333333333333333333333333333333333333333333333333333333335@IXE^hDXb@JW353333333333DYGHiLLwQBQXF`eBQ[3333333333333394FF`e?HT343333333333333333333333333391BIieBPV34333333=:T6&?;+7[qK^uLeP4333333347<3R333333333333333333335:<(Q49333335;'M8!E33333333qQ}V}V643333333333?!G<=TWvxMSrpK33D29rvMx~OswM333333333333G6:YYYR4333333333fbGYYVH7:333333E39YYYppK3333333333333333333333333333333333333333333333333333;5=GbNLvSN|UGWFV^\{N^`|TH?<3333333333333333:)7hXfmN`h<5P7(A3633333333333333f\lgm`E?=33357,@@HR92CIggIggIggIgg5"933333333333333333333333333333333333333333333333333333333333333333346E]WF`Y7':333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333345D)T33333333333333333333333333333333333333333333333333333333333333333333333347AM\CWcF`i93G33333333333333CTEN}RN}R>FHHdiF^e6&=33333333333333< D33K9?U;6M:3I:3I<7GogkrfrNh\CU^F\aE[`Igg==KBOWIggIggBPW3333333333333333333333333333333333333333333333333333333333333333333333<;FKnb@IM333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333369A&N33333333333333333333333333333333333333333333333333333333333333333333335!9AL[G`lCSa7)?3333333333333333<;=N}RMxQ>C@>DSE]eBP\3333333333333333=>LCW\EZ^5"833333333333333333333AMRHga:2B3333337433?;W4833QZEjSjSOUC33333334=1R3333338453333333333333335::(M?0[8#D333333333333RNAlyMitLJ@=33333333?!D573333S[[[yyNB/9YYY6433333333333333ljIR[ZJ9;33333333L<L:4E5 7333491B91C4 7DWZ9.@33333333333333333333333333333333333333333333333333333333333333333334DUUIia5#8333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333337;?$J333333333333333333333333333333333333333333333333333333333333333333334 9DVfEZi@M]5!93333333333333333337+7JmKLsMGaH6%29]rKavLiQ43333333;.O3333:733333333333333333333=,T?1[9%H333333333333TPBWW]]F33333333A!E333333O?=[[ZQibFYWV9"533333333333333C/9Y[[T4333333333P[[SB-8X[[zzN333333333333333333333333333333333333333333333333333333333333qL_{O^cchTTQjYkR`iH333333333333333333bxMiQ_rJORCRXDPWDVcGMRBScGP[EEE>EE?cRy]v\h]SR6&63333333333333334BQUEYY5#9333333333333333333333333333333333333333333333333333333333333333333<;FHe_=?I333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333337;?#H3333333333333333333333333333333333333333333333333333333333333333335!:BRcCTdAL^35333333333333333333335 5OQOQLtN33>ETDZd>CS3333333333333333338+>Gb`E\[CQU5 7333333333345E\XF]Y5!8333333339733:-K6#@3354mToUoUA6;3333338%D:)J<9333333333333333333336 >6 ?7"B:'J8#E3333333333I==WWhpK33333345?A33333333P}~O~~O[ZVWZO?=3333333333333333^SC[U~}OpiI33333333D09X||NUXPQX='73333333333333333333333333333333333333333333333333333333333o]F___R[jPIgHTQs_v^p\H[ECF?6"5339$6D7;W[EesL^jI^_wYoUoUb~NjS]uLfSfSXqKhUmXs^jX[UYYEZD5 4333333333333335"8Ga^BOR33333333333333333333333333333333333333333333333333333333333333333334F_]Hea3433333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333369@#H333333333333333333333333333333333333333333333333333333333333333347?FYF]m>DW34333333333333333333333333LuNOQLuN448-BFajDWc3333333333333333333336CTVF`]Ig`=?I46333333;7CKnbAKO3333333333;8337$@9+I3333\lJoUoURWD333333@5\F7`<(J9%F5<3333333333333335=-R353334:'L9%K35333333B09rOmvL][E33333378;<3333333374U[[[`[[XKA333333333333333333okJW[[K9;33333333~}N[]b[[bWD3333333333333333333333333333333333333333333333333333333333]IA_____sL3344AJ@v[u_s^QpJdVgWrXzZjPwUxVfwM^_{ZoUoU^uLdOYkJ\vM_~OVmJs[v]t^kXbW`[[WUPFTC<8;333333333333:3AJmc<:E333333333333333333333333333333333333333333333333333333333333333333=?IEZ[91A33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333345C%K3333333333333333333333333333333333333333333333333333333333333333@G\EYl=@T3433333333333333333333333333HcGKoKNwM7'733AN]DYe8,B3333333333333333333333:4BIg`E]YJi_90?9.>AMO?EK:3@5!73333333333<;3335=1S3333JH?avM`qKW_E33337"A9(ID*Q487!A:&I;(O9#F3533333333;,M7"B333333336 A=&O9!C3533H9ASG`l=>P33333333333333333333333346?DKIg^94AKnaKnbKnbG_Y333333333333>;3333:+L5;33HB>sUsUnS334;=-R69;:333333336>:%M6<33339)I;,N333333333333348A=$J>$KG6FXXzQ33333366;;333333333333P[VW`UjbG33333333333333333333mfH[T|wLWG?33333343W^Z_jbG3333333333333333333333333333333333333333333333333333333384W_RW_[D,83333J<=^ZDaa_|TZ|[t\t\kVgTdS]O|^~_y\ePb~O\oKYhH\lJXdH>08qT~]}\qVoUoUlYfXJbGBNAOzNJkJOQGdI>D@3333336$9F^XBQP333333333333333333333333333333333333333333333333333333333333333333@KTE^`34333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333? C8:33333333333333333333333333333333333333333333333333333333336$>BOdCQe48333333333333333333333333333333G`GQPQP===336)@CUd@HZ333333333333333333333333333334ALOKnbKnbKnbKnb7)<3333333333<;653347;+N33;(7sUsUsU<+9<*Q47>>553333333333339"G7>9*H<2S3533333333333333333334F4Dy~atxVegH33333333?>333333333333A,8yvLS`bbS3333333333333333333374OY\V53333333Uaca`SB33333333333333333333333333333333333333333333333333333333zO___YSO9<53M?=TYT`aaoyMhpKSNA:(6A?=GL@\{NbRWoJ}_~_vZjSjShRiQoUoUZfH}[_yZoUoUoUnYm^TyNNPBbxM^OYTWUZYQuNOaHKPBC@=OlVPz`>=A6#533333333333333333333333333333333333333333333333333333333333333<:IE]`6)=3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333338:?!C3333333333333333333333333333333333333333333333333333333334BJbCOf6&?33333333333333335633333333333333GZEMmJLgI;393335F^mE[j333333333333333333333333333333?DJKnbKnbKnbKna8->92@3333333333A@33337"C8"C33g~OdxM`nKF=33333333333333`SC\_bb_3333333333333333333333unJ\\\`RC3333I5;\cc`T333333333333333333333333333333333333333333333333333333lXE_____pL[RBU~PXYX[ZT:$63333333333338&6B?=3333@J\BRc4 9333333333333333333333333333346F]XKnbKnb>AICQRKnbAMP7*<3333339:;=33338$F5>oQxVvYTTY33<>9;3333333333336"=?:X<1O="F463333333333333333333333ULAYYvzP@!D55333355;833333333333333P^ca]S74333333333333333333=&6Z\VulJ4333`RBR`c\zNC.833333333333333333333333333333333333333333333333333G.9zgI[__^ZpnJYYYxOYv}OZYX3333333333333333?.8}V}VeoK54<,8>19GC>ORBzXxVzYsWoUoUoUoUnUq^\R]uLoUoUZlIjSiR^Te`ee]\bTb_[b]V]QQkIZQZQMhHUPNjJ?C>:193333333333333333333333333333333333333333333333CT\?DQ33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333;<<=333333333333333333333333333333333333333333333333333346AG`BIb343333333333333333338;45333333333333LgIVQVQ?@>3333@H[F]m7'?33333333333333333333333333338-=457(;5!73390?CVTIhaIiaAMR8+=3333=?:<33337!CcnYwVtb]eP68A!D33333333336"<<6Q?@\9+F3335< B3333333333333333333333RH@TVnrL44@ B343333:833333333333333<%6Y^_c_{N33333333333333333333i^EOX][JA64Z\SZU]tiI33333333333333333333333333333333333333333333333353W`SU`b\WSYYhfG<&6@,8YYX3333333333333333D7;}V}V`fH33333364cmJrSxVcsLkRoUoUoUoUoUdTRmJGJ@F@>JH@FB=QXDPVDHG?HKBS|UR}VU\OiMVcUXVtLPgHZQZQPqKVQRzNOzNQPG`FBRD6&63333333333333333333333333333333333333333BNYDU^3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333C!E4533333333333333333333333333333333333333333333333333<5OCKe7(B333333333333333333338;55333333333333><=BH@BG@8*73333;9PBPc7)A3333333333333333333333333345Jk]DVR3333333333:2AANRJkdE\\EY[;9G7'<=?> A337"5\jOxgwoiTej\bvOYeHhQlZ^u`gqdqXg\Z^JROBB29;&6< A3333333333333333333333L==VXU3345=>333332;732333333333333K8;`cc`]ocH333333333333333333J5;]]]U\LA]]]_]]X433333333333333333333333333333333333333333333333xdI```_Z][[{~OstLD193333E5:}RzQu{N3333333333333333RM@n}NitLNG?333333ckJ}VrQamJ8"5A5;fPoUoUnUYeHWxM]QFKA3333333333333333>BCJmTHeSHhUKpX343354<4:?@>I^FJdHQPQPHiJOQN}PANC8+8333333333333333333333333333333333333<;KF`h343333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333399>>33333333333333333333333333333333333333333333333336@A\>>X3333333333333333333333:?343333333333338)7AD??@>7&63333<9PEYl9.F33333333333333333333333333=?EGaW91?333333333333338,>?ENHcbIgcMrfVn\ja|qgpmitmwvlunyevo}l~gotevXrQ}V}VuQWZ`\J\YEH;<6433333333333333K<33333333333333333333333333333333333333333333Q9<```ccaQ[SO?=33333333^VDYY}P3333333333333333diIWWMD?3333SMA{U}V|VB3:333343A6;E?=9&633RiI]QIRB333333333333333333:5?LtZMy]KpX9/;3333333333335"5?D?DWEO}PIkKN}RN}RAND7+93333333333333333333333333333333380ECV`4 83333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333C!C3333333333333333333333333333333333333333333333338+FCJf7&A3333333333333333333333: B333333333333GVDVQVQVQUPCKA3390HBOc8,D33333333333333333333333333EZQIfX3333333333333333;39JZEMaG][^`]hbm\sh~oyzuyftbiZt[dZbwPhzNvUvUzU}VvSVWWYXXnrKrxMXPB<&633333333F4:YYY333366883333333333333333333333j_FX`aQZ^R7433333333333333Q?=\QQ\}NWSM9<\R}OpbG33333333333333333333333333333333333333333343s]G_aacc\TWJA333333333333heHYYtvM3333333333333333o{NWWB2:33RKAWo}NuRPK@3333333333333333RfH\|NLUC3333333333333333333391=O~aVjBRI3333333333333333336$6>C@LtPLtOKsRN{U@KD6&833333333333333333333333333337+AFaj6&=333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333398;;3333333333333333333333333333333333333333333333AA^><=:2JDUi9.F3333333333333333333333338,;Lt\?GG33333333337)7CLARzNNkIZQUyM]Q\QReGRcGGI@FE?Z]N}i|e}V4333333333333343C5:JB>PL@jsLwQvQ]XWTYYoqKwzNSG?64337 4ssK|OSL;<3333;93333333333333333333333`PB]a`\^^^R7433333333333333Q^`d^]iZD33U^^Z433333333333333333333333333333333333333333iQD_Zbca^SG4:33333333333333poJYYjgI333333333333339#5xPoyMipJ74H;JnPLxSIjQMuU=?A333333333333333333333333336&CHeU8.<33333392:F[EQPLjIVQPpKPjICG?<194433333333H>=ozYkqYgqK8"5333333333333333333333333:"8TKCgjIpwMYYYRYYstL`WD74W[[^TC3333:83333333333333333333333D.9]]`a^^^]rLC,8333333333333sfH^bda^O;<33P^^^S?=33333333333333333333333333333333333333<"6^acba_f\E433333333333333364ZU|}OL<<33333333333333K?=XXwPND?VmuLWmxM4333333333dwMsUnS3333QaFWoKIOA333333333333333333333333Q`Vj@IL33333333333333333333333333;9>JkQNxWHdPGaO6%733333333333333333333336'>CTc4":33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333343?<5433333333333333333333333333333333337'79,8><=FSQLbkK^INcGNdHJVDOcGNaGEH?JOBEF?A;<7$56 @7?333333333344VQVQVQVQVQVQVQSzN:1JBJb7&?333333333333333333333333F]PMuZ45339/:D[FOQIiIQPEZE@A>443333333333333333PI@ccW>+8333333333333333333333333::333353I:ABMtWMwXE[N<9A333333333333333333338+BF]l473333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333343<:6533333333333333333333336'7=?>DWEEYDP}OQPJdHVQXkQsfZQZQYQUuK]Q]QQgHbRbRbRWkQba\wMOYEC;<8$6333333S{NVQVQVQVQVQVQOnK<6ODPh5";333333333333333333333333GbPDYM6'7APDN}RHhKMzO@JA7(73333333333333333333333LB>]gZB2933333333333333333333333355333333333364TH@x{NUX[[X_VrnJ333333333333333333333333333333h[E|NU^Q]sL___\N9<3333333333R_^czN33339 5TPSW333333333333333333333333333333333333`MBddddcU33333333333333333333\QB[[Y4333333333333333pvLs{NTV|RX|S:$63333333333G==xVxVQOB3333`OfSOXD333333333333333333333333DYIM}VLraF]X3433333333333333333333333333337)9DULMu[Mu[<=B33333333333333333390GDXh3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333395853333333333334494;DYGLuPHgJOQOQHgIQPQPKiIVQYpQs\ZQZQZQWyM]Q]QTlJbRbR`V\w`dSfSXnJjSiRdS]TEF>FTCVQVQVQVQVQVQ@A>=8RLdfCF?33333333333333333333337*:MxXJlSMxTJmOMwP?FA5 533333333333333333333333333H;=3343ePb~NII?333333333333333333333333?GBHgL@MIHe^>@I33333333333333333333333333333333@JHGbSLs\BNK3333333333333333;5L?G[3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333364:7957473433333333333333333333333333333333333333333333333333333333385433333528)7CSFMwSFbKN}RN}RHgJOQOQIiJQPOyNH_FOoUQomEQHJYEGQBDJ@JVCN_FNaGO`F^PaT^~fcSfSfSYoJiSjYk]eYn\jSbUZSVQVQVQGUD33CLb[qZQSrKIRB8&63333333333333333;<>R]Q\JpQAME443333333333333333333333333333339#5LB>J=IJ9L=#;3333333333333333333333333333333333333333333333H5;plI]bb`\PC-833333333333333333333333384]^^Y33rbH___[T_Q843333[ddd\533333}nK___n\F333333333333333333333333333333=%6[e¼c`baycJ33333333333333333333@*7[[[`TC33333333333333PF?^_aYU?,833333333333343iwMgwMk~O8"5338$6jSjSJJ@333333333333333333333333?GAN}RALC@LPDYY4633333333333333333333333333333333:3?Lq[E]SAKK33333333333333>?U<;Q333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333365=:6533333333333333333333333333333333333333333333333333333333333333333311<694@4=IbMF\IPySN|UHgMN}RNzRDZFDXE=@>7+75#53333<3S=3T333333333333333333:,J9+?HH@P[EXpJ_Sh]hZk]gZn^nVnT]wLlVZyMA<<3348HZfYcZQPkI]Q]QM[DGJ@6"5333333336%8Q]WdMyV6)8333333333333333333333333333333333333F9;RMAWQYD+D33333333333333333333333333333333333333333333333343aVCab`]\[ZJA643333333333333333333333Q^VR^J@33jXE_\{O___VA)7=%6Ycdÿc|OE.83333WB?___zkJ333333333333333333333333333384Udeed]sO7433333333333333333333_TC[[[A+833333333333343U__VU@,833333333333333G<<}V}VfpK3333=/8_uL_uLC;<333333333333333333333333<<=HiK@JA5"8He`<9G33333333333333333333333333333333338,;Kn\Lr^;7A333333333333AKa90H3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333387=:333333333333333333333333333333333333333333333333333333333333333333337493B1>DUKLtUNyWLrTLtRLuSAMD<;=443333333333335;@8\6"?333333333333333359;/O3333>C?FaGTQYU_XdWkYnUoUiQkPsUsUsULI@@9HAFa9-@HTCTqK]Q]QVqJbRaQSbFNVD>3:7*:F_PR_R\:2;3333333333333333333333333333333333;&6qOWWZ|j^`N34333336363333333333333333333333333333333333333333xsKUa`\SYVL8;33333333333333333333O;OQE[F33@IQG`_333333333333333333333333333333333333:3?E]UKo`91?333333335!:EQi4733333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333332533333333333333366?>33333333333333333333333333333333333333333333333333333333333333333322829$7@JFLuVQtXFbNNyWEZK:4<34333333333333333333<.P<0Q333333333333333333;.M6$=;9$I="D6933333333333333333333333333333333P\]_[R]]]aRC43333333333333333353[___J4:3333M6;[___ZX¶aŻcadùb_S333353]___?'7333333333333333333333333xhJ_dƼceŵbĬb_:!533333333333333333333WG@\\TTD>3333333333I8;W]_a`C083333333333333333;&6yRkwLjwM8"53333NPBoUoU;*7333333333333333333333333<;BCLrYIiUKsWQtVANH8+933333333333333333333337!@?4X5;33333333333333336'7G]cLuPN}RIiJOQOQDYE<:<3333333333IC>iPsUsUaqKv[qvtfsTVUC<)73333<09NYEQcGfSdV`gfigYf[b[lVgPW_FYbGNMAB7:D8;;)743;'69$664<*7I==MD?QI@33OF?WWWWW`{r|a8#533SK@nuLmsL]XDggLhbS]LQYLEL==B.8433333333233333333333333lbG\\\`SB]]]YSR=%63333333333333333|mK___{lJ333333@(7V_]yO`ƺcdǾcda_^643333T___\G@3333333333333333333333cPC_abdŵbĬbĬboVG3333333333333333333333P\\[<%6333333:#5vqKT[_`[R333333333333333333XVCWWgoJ333333ZeHcwM]lI44333333333333333333333333@G@QPG]F3333BOW>CP33333333333333333333333333333333333333=@HKnbCUS343333@AZ8,E333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333354653333338633333333333333<<;:3333333333333333333333333333333333333333333333333333333333534233338,;HfUF\QMu[Mu[AMI;,:33333333333333333333333348=/U9'G3333333333337(8=@@JlPN}\LpdN}RM~UJl[M{cE[_@L_DXhBSdCScF\iAP]@JX@HV;7HCCFZeHpRtiqvwXbmK}V|V]bG9$6333333@>?XdY_iYjSb[gamWoUdxMsUsUdvLxVxVvUyT}V}Vm|NWWW43ekIWWWWWa[WH;<33bbGXXqxNYYxQac_wsNPrlJXGCG.<43333333333333SB>YQQfXDI4:U]P^^ZQ==33333333333333H2:_TQZI2:33333384}PzgJ``ǽcdddƼc^SI1:3333{iJ___saH33333333333333333333N7;rL^de·btP][5333333333333333333333B,7T\\{N333343O>=V[RXc_UL<<33333333333333339"5p|NWWH<<333333lRsUg|N33333333333333333333333333@E>MtLCSC3333<9HDW^3433333333333333333333333333333333333333BPQGd^=?I338(C??Z34333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333:6443354:733333333333333C!D33333333333333333333333333333333333333333333333333333333333333:633=@EIiWLt\JnZF]P9/<3373333333333333333333333334<+P<+O33345!690<@GEDUKJmRNyWIjQN|UOfNvlRnOztF[e=FUDYcE[cDZaHdfNc]erjuUnP}V}V}Vl}NKA>335#8HdYF`V8.=7#5FB>TxNd[lWkRjPsUsUbqKxVxVoQ}V}V}VitLWWW8"5chIWWWWW{iWWK@=33deHXXs{NYYyPYW\Zb]wuM[WyvLK8;7433333343P]]V3353k^E]^^^tLcPC33333333333333saG^__uN3333333333fPC_`ĵaĶbµaaŷbǷbĵbvaI3333_JAR~PQu`H333333333333333333<$6Z_VdeƫbǪc^kPE3333333333333333333333wM\P}NQ?=33SB>UR[[[U^[Y743333333333333333`^FVpyMekI333333:&6oSsU[gH33333333333333333333333333FUDVQGXD333347Hdi7*?333333333333333333333333333333333333335 7Ig`DWW5#:@>[7'A3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333<:77<:3333333333333377?@3333333333333333333333333333333333333333333333333333333333333387DUQLr^GbUJmY<:B333333423333333333336':80?>BH>EIDXRJdiIYfIfWGaSMu[Mu[GdQMwXMwXHfPNyWLuZKpbP{~Gak:1H4833333333333333333333334 890C@JTJesNp~Rug__{Z}V}V}VbiHWmzOKbWIg[9/>333333F`HOQ?A>@3:PQB\hIg~O_lIxVxVgwM}V}V}VdmIWWW<(7SMAWWWWZ{kWV8!533B19NC>PF?QG?a^FffHecGTXWZ[[~O[[ZSZ{NUD?4333wM]]]D.93333j[E^^S\_xhJ433333333333YC?___^>&63333333333M5;ZɻdɻdŶbʼdʻdʻdʻd`\C@95fPC```U333333333333333343S__ǼcȻcƮbǪcǪcƩcJ/:33333333333333333333=%6\]]X[L@P\\TW[TRV[qnK33333333333333338!5VXXPF?333333TUDuThzME;;33333333333333333333333333H[EVQERC333333BP[;6H3333333333333333333333333333333333993333:6DJkdEVd;3O33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333D!A9833333333333333<>9;3333333333333333333333333333333333333333333333333333333333335!7F]WN[ZLp\DUP4 6333333333333348,>@HNF]ZE^XKnbE\WKp`He[OnoPpsGaWLt\IiWPqZMu[F^RNwcNvgH\_J_gERb:3L?A[6$>3333333333333333333333333333337%B@:\=9NDWZF^\\lsd{XoP}TW_ssUaM33333333@J@JmJ?G@33333333337!5@09@29G<333333=CR<>N333333333333333333333333333333333344==5533E[cLiv49333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333:94497;8333333333333A!E5533333333333333333333333333333333333333333333333333333333336$9DZTKp`Kj^GAL33333333333390A>CMIgbHfaHf_JmcF`ZKnbE\WHa]IWhGQ`@JL?DGALJ>EGCEODJ]@?X<2L7&D6$?6%<5$87):@G\8-A343333333333333333333333333359>5X;-M333391AEYYJj`^imP|ezi_Z__FjnJ743333AKAQPFZE3333333333333333333333333333333333=)7wQW\znWflJ43333333333333333333333333333333>(7YLAupK~N\\\O]]]WPV]9!5333333H2:Z___wNU;#533333333hSDXxO[`N6<3333333333O7<`aȺdȹcʻdʻdʻd`íaĬbìaȹd³b``84333333333333S<=`~QY`^ũbǪcǪcǪcR8=33333333333333333333?'7WX^c]]QZ\ysL=&6D/9[[[xuL3333333333333333F6;YWpvMK@=333333;'7hxMoRlP3333333333333333333333333333TuLZQBB>333333;:L>DT3333337633333333333333333333333333333399@(KLOnMfl?7L9?; C<#H;#H:$J;&M;'M7#E5:333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333>;333343969553333333D$I33333333333333333333333333333333333333333333333333333333335#8Hd\Gb[Hg[;5A65@?553334;8GAPVIieHfcHe`Gb^@GN<:F7*<5 89!D=(R7!C33333336:'L?*L8.B?DLAJNHd\E^WKp`F`ULr^LtoMzfGaRLrYEZNEZMAKF92<6#733333333333347>1T=1S3433333334?CK?FMUq]pttvtvlVVX{RB0933;6;KjIIaG33333333333333333333333333333333333343J?@\dcXWJA093333333333333333333333333333333333333333;#5^OBPXY]]Y]da_fVD33333333?(7V_{N__XA)733333343S```S3333333333J1:rN{PT[ŴbƵb^dzcƯbĬb¬`ȷdIJb`YM2;3333333333<"5[``Y~P<$6H-9pPæbW3333333333333333333333TddaZ]]]eYDJ7;3364}yMV[[D093333333333333333xPYY{Q33333333VUC}V{UNJ@333333333333333333333333336"5TrKQkI:/8333333:6I@IY333333987633333333333333333333333333338'F=3T4 :EV]FW_473333333333346 ?;)M<-R7$B3433333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333339977333333333233333333D$J333333333333333333333333333333333333333333333333333333335!8BQSJmaIi_7*<333333??F;SGV_HbdIggDVY>@K6&:333347:!C?'P;#G473333334:A?\?GUIfaLZ\JmcF_ZJmaEYUG`XCUPF^TJnkMwgGbSMu[HeSMwXJmTMwVNyWE]JDXI;:=6$63346=/S=1S3633333333333345JmcLqdbnqutfXXXWG9;8*7VQUP43333333333333333333333333333333333335A:VC8HD5:E7;3333333333333333333333333333333333333333333333?(6|sL[]Q_ddcZ643333333384ziJ____V9 4333333eOC````Q9<33333333W??aaa_XȵdƳcʷdDZcĬbĬbʷddzcʶdʶdũcwRN3<333333}Q`aĴbôbqN<"63333A'7J0:333333333333333333R==TadddR\zqKC-8333333laG\XyuLleG3333333333333333lkJzPUYH9<33333333nO}V}VA1933333333333333333333333333>6;]Q]Q54333333:5JAL]33333333;<55333333333333333333333348:-P:+L3533>CNDY^5"9333333333333333347:*L=1T5:33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333=>33333333333333333333E%L33333333333333333333333333333333333333333333333333333334E[YJmcEYX8+=3333337)>DU^EYaPcmLKbF5S@!E>!E>!E?#I@&N?$J: B463333338-@?ESLasF^aGcaEZZFBP;5D6$93433333333<8O<:Q446%891<@GEBPHLsTNxWJoPN|UHeLN}RIjOCH[>3R353333333333333333Hf_JmcJmcYjfaXXzQw~OXQBNmJOnJ<49333333333333333333333333333333335:>7X`iXWW}T33333333333333333333333333333333333333333333333333:!5eWDW^cd^b[YE?333333339 5S__]uNY>%6333343Y``TU>$6333333\D@aaa]~hKaıbɵdȴcĬbĬbɵdɵdʶdʶdǫcǪcħb?$633V=>VǶcʻdʻdɵdǪcahM=#6333333333333333333>&6zO_a_ddbwM>'633333333B,8[\\Y;#633333333333333N?=YYTZTB33333333F8;m{NkyMoP3333333333333333333333333333GLAVsLToK33333333:4I>CV3333333333;<9<3333333333333333369&H<+P5;3333337(=Hfg<;J33333333336%7:3;:6AD;8A7+;333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333=@33333333333333333333C$K353333333333333333333333333333333333333333333333333333@GNDYXIia7)<333333=>OCS^Hdi?IU7*>33333456573533333333337)>AKVHdfJYmCOZ:4D4 73333?>44333354323391GAL^3333333333336'7?FBF_KHiMN{XPokQ|eN|QANB:2:3333333333333392AHf_JlcCTUOWLtu|l[szMYYjTZQIWD3333333333333333333333333333339+F?333333333333BQZ@KW33:3:>A>GcIMwOHgKN}RHhLN|UN|UIkQNy]MqoNyaHeQMu[IiVLs\Lr\HeXF]T=?F90?3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333= A33333333333333333333?"F8;333333333333333333333333333333333333333333333333339/AJkdJjc8.>333347?GVF_gEZc80C333333333333333333333346AKXCV_F^e=;N;$F333333333355A@443342:7335!:EYi353333333333333334;*JEG`GYSN~QOQKnJQPJhI;4:33333333==HGa]7*<45336%9I]Wnmlqj^Y\qZPhH333333333333333333333333337(B>!D33333333333333333333:@BK33336#;@L[Faj>ET4733333333333333333333337)?E\fCU`;;L46<"E3433333333333344AB9;33;93333CQ`8-C3333333333469"F>*V:&K48337*8@LAQPQPKhIVQNmJ9-83345DYXIha5!833333333<7Cvj{z}urdoYnX?9;3333333333333333336"<;2L?@Z@C]9,G333333J?=kwMiuLhsK7!43333333333333333333333333333333333333333333333333333333333n\Fadd]___R533333<"5W``_nLzQ4333E,9`aaaS3333J0:VY[^U;=ĬbĬbĬbĬbR9=F-9]_ƭcʱdǪc}T33I0:ʶdʶdʶdʶdɴdƪbǪcǪcǪcǪcǪcǪc]B@33333363Q___Zdþb`_D-83333333333G2:\]]]A*733333333333333spK[[ZUI@3333333333msLwPktLekI3333333333333333333333333333P[EbPVjI5433333333@D\5#<3333333333333333333333333333333333333354DI@RoKMgHW\[{MuTQPP|OGbHBQC:5:5#63333333333338)E?>[47333333348*;=?FAMNIh^F`[JmcDZXAJP6$93333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333>!D3333333333333333333357A&M333333333333333333333333333333333333333333333333AKSIieDVY33335$@R3333578A<%L?(S9"F3733333333335"5AKAPsLVQUPPlJIWDBOQJkd:7D3333333333338!5tXk|znrtzwzhe;7I8,B7'?7)?8-D91G;9N?DYCQfBLc>>W8,F3433333333H>=}V}V}V:&6333333333333333333333333333333333333333333333333333333333384\VYȿcĺb__xNYP8<3333=$6Y_yPaajL3333zcJaavPTV=>33M4;ĬbĬbĬbĬbL2;ĬbĬbĬbĬbgNDK2;ĬbĬbŭbƮcZT9=33YȰcʵdʶdʶdǬcǪcǪcǪcǪcǪcǪcǪcwR3333I1:YqL___ȿdXV_qL3333333333?'7zN[]]qfH33333333333333pjIR[[P4333333333A/9XXX@-83333333333333333333333333333aPfSUeH3333333348@E]3333333333333333333333333333333333338&6JWDPhHZQZQRrKVSXsHfW=;<5!53333333333333333333333<8S<8R33333333333333337*=@HNDWXJkdEZ[BOU5$9333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333;?7:33333333333333333333@%L7<33333333333333333333333333333333333333333333@HRHgfBPV4 7335";EZiCRb90E333333333333333333333334=>RE[k<;N333333679<3333333333333333333333:;C"G@!GE6WMUn@'N@&N>%K:!D6<333333333333333333337%6HYEOmJZQ[]WlG_W333333333333333353loK~Sak{zy|cqFajCUcDYfF_mBPb@H[>?U8-D4733333333333333G<<}V}V}V;(7333333333333333333333333333333333333333333333333333333333333O9<[_aȿd`ZY``oYF4333?'7RaaaanWF3374SUĬbĬbW43F,9ĬbĬbĬbĬbQ7<]ĬbĬbĬb{bJN5<ĬbĬbĬbĬbH.:33]C@ȰdʲdɯcɲdȱcǪcǪcǪcǪcǪcǪcǪcǪc_33]F@^`_R^aa_[{jJ?'73333333343R^TSV64333333333333iaG[XvtLV=&63333333333eeGXXovM3333333333333333333333333333GD>]uLZqKB;<333333339-G;5O333333333333333333333333333333338&6MXDVuL]Q]QSrKYPMbG:19@N[=BS3333333333333333333333333347AE^7)C333333333333333333339/@BPUF^^Hff>DO5#:3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333357< B333333333333333333339??%L333333333333333333333333333333333333333333;8HDW]Gbc6'<335!:CUeBQb7*A333333333333333333333334=@TDWh8-D333333338;67333333333333333333333367::3334DXb:2F33333333333333333333333333333333>8;WU]nZn]TGNA333333333333333333}PYY`_^LGE6%<6$;47333333333333333333333333D6;tRsQqQ;'733333333333333333333333333333333333333333333333333333333333333U__`_T````nXF7433]EAaaaawPP7<33qOĬbĬbĬbĬbY@?>$6ĬbĬbĬbĬbX??VĬbĬb]y`JQ7<ĬbĬbĬbĬbE,964[ȰdʲdʲdʲdǪcǪcǪcǪcǪcǪcǪcǪcǪc^YB?````ZT`___aLB3333333333m^F^^^X@*7333333333333YK@[[[Y=(63333333333RG@YxPpxME5:3333333333333333333333333333_wMjSeP3333333333>;V5#=333333333333333333333333333354HK@aQbRTkI]Q[PEI@543333?DUCSa3333333333333333333333333333:0I@B\3433333333333333333333335%:AMUE\`F`c:5G33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333>$J4533333333333333333333@(Q8>3333333333333333333333333333333333333381CGbeHdf6(=3336@H\CTf7)@333333333333333333333333<;QCTg6(?33333333338;5633333333333333333333338;673333>AOCT^3333333333333333333333333333333333CTXTo]W]QZOIOA4333333333333333=(7TY\^wWQD193333333333333333333333333333;)7xVwVtT=+833333333333333333333333333333333333333333333333333333333333333O8<__ZS]```U\W?%633nVFaatO_^@&7D*8aĬbĬbĬbW64rOuPyRTrWGjNUW\uR`EA~TyRtPpO<"6mTFĬbȰdʲdʲdɯdǪcǪcǪcǪcǪcǪcǪcǪcƪba`vOa``VUW__S4333333333iWES^^^iZE333333333333fZEYO[[RB>333333333354TYYnqL3333333333333333333333333333E>=`xMjSNTC333333336!<>:V3333333333333333333333333333DA>aPWmJbRbR]~NEI@543333333394ICSc333333333333333333333333333335CLd8,D333333333333333333333333336&;@IUHdi>ES4733333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333336<:!E333333333333333333338?>'P463333333333333333333333333333333333:4FGchCT]90C3333=33333333333357893333333333333333333333>@33333347F`b;6F333333333333333333333333333333<9IG`d;;IFLA\QUnJbRUlJ6 533333333333333?*7UZ|\`^U:#533333333333333333333333333>-8xVxVxV;)73333333333333333333333333333333333333333333333333333333333333333qMqMY``}Q`\Waa[K2:33}fK|RĬbĬbĬbW53oNĬbĬb~SmNI/:YǪcǪcǪcVUǪcǪcǪcYgMǪcǪcǪca33jNnNaʲd˲eƪbǪcǪcǪcǪcǪcǪcǪcƪbɳdƳca^ɶdȸcRY`\uN[E-833333333[G@_]zN]Q333333333333_QB\\ZyuL^RC333333333333mmI|QYX>*73333333333333333333333333343gPoU]nJ7"533333333=6S6#>33333333333333333333333354JL@fSfSfSXqKMXD7$63333333333338-DCSd333333333333333333333333333333<9P@G]333333333333333333333333333333:6GF`hAN[6$;3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333;#H6=33333333333333333333=%L<$J33333333333333333333333333333333=>NE\dDY`8.B33338-FDVj92J3333333333333333333333336$>DPg6)A3333333333333333;<3333333333333333333345> C33333333=>LE]_463333333333333333333333333347CS]BRZ3333>6:aQbRbRO\E7$633333333333333A-8{}O_`_[P53333333333333333333333333@29xVxVxV9$6333333333333333333333333333333333333333333333333333333333333333333W```__JATaaaaUB(8<"6]ĬbĬbĬbĬbfLC)8VTŧcǪclOvRǪcǪcǪc]rQǪcǪcǪc]tQǪcǪcǪc]]CAǪcǪcXĩbȭcǪcǪcǪcǪcǪcǪcǪcƪbǰcʶdïbaƳcʵdǯbɴdȹdôba`W@>33333333K5;]___xiI=%63333333333gYET\\\j_F333333333333XNBYYqsKZTC3333333333333333333333333333LKAoUoUPUC333333338&C;0N333333333333333333333333>19b~OjSYoKfS^zN>2:33333333333333338+CF]m3533333333333333333333333333335">?><;9963333333333333>!D563333333346CVZ?HQ33333333333333333333333333<:KGch7'=333333?7;_PUkIfS_}O9'733333333333333lgI[aa_[_UD333333333333333333333333;)7exMbsL_mJ53333333333333333333333333333333333333333333333333333333333333333333L4;_``]zQ_HA]aa]|R]H.:Q7>+V483333333333333333333333;/HHQkK^xGMl=+R;'O:&M9%HABbCIg8&E8$D9)H;.M=4UA=_A>_;2O7&B343333339,F@B\34333333333333333333=<663333758633333333:>:@333333333333;7FE]]92B333333333333333333333335F_g?FT3333333333;,7cQfSfSUgH;*733333333333353P_a_yPOG4:3333333333333333333333?19sUsUsU3333333333333333333333333333333333333333333333333333333333333333333333r]G`TVaXG.9Y`TĬbĬb]H.:lREĬbUZǪc[uZHǪcǪcǪcǪcuQǪcǪcǪc_|`J[WzSnOYǪcǪcǪcWǪcǪcǪcǪcU^CAæbǪcǪcǪcǪcƪbʰdʲdǯcYZaǬcȯcʶdɴcɵdƷcʺdìa]{bJB)8YC?__QZ^R==3333333353l_F]]]Xg\E3333333333338 4Sy{NWXB/93333333333333333==3333333343f{NsUsUGA>33333349<0R48333333333333333333>/9QUCnToUd|NfQhRFC>33333333333333333333336(AAMb33333333333333333333333333333333;9N@K]33333333333333333333333333333333335!9BPa@M^35333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333335:=*R7 A333333333333333333;&O:%M33333333333333333372:cQ\uLfQeP;*7333333333333:#5V^\`[T6433333333333333333333E<33B(8hMaǪcǪcȮcȰdƮcĬbĬbZTǬcʶdʶdʶdɵd^ůbĬbĬbìa\a`__QZF@3333333374QSZ]]~uM43333333333333tqL[[RVJ@3333333333333333337999333333[aGh{NiP`oK3333337"B<+N463333333333333343?19^kJsUcwMoUoUoUNQB:)73333333333333333333333338+D@G]333333333333333333333333333333338,CF^m5!933333333333333333333333333333333335";BRc=AU333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333335;)O;*N5:333333333333335;?-Y5;33333333333336C8WKToDVh?FX5!:3333333333;4NAD^33333333333333333336:-H>;V>;VCJfCJf9+F333333333333333354983333333333333333: B=#H34333333333333333346F^ZF^[5"8333333333333333333@JYAM[3333333333333333;-7cOjSjSb|N7#5333333333333G5:Uaa^[pjI33333333333333333333C:[ǴcʶdʶdƳcưcĬbĬbìaǴc_ȽdɿdǼcakVE333333339!5S^^QZ~uM43333333333333^SCZ[[}~O433333333333333333339;=>;<:=F:?wVxVoQ8#5367@:'L6!@333333333333338#5STCpRewMsUsUsU^pKfPD;<3333333333333333333333333333:2K@BZ3333333333333333333333333333333336E[h:3H3333333333333333333333333333333333336(?CTg9/G3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333337"B=/U;+N6<333333333333;(P9'K333333335%>=;SMTqDOfBPb7*A33333333333334BHd9,G333333333333333333333333@B^CJfCJf;3N7'A33333333333333863333333333333349=%L9 B33333333333333333333337)?aYXïbƳc[ìaĬbìaȶcɻdǸcƸbȽcɿdĴbRuO^GA84P:;T<7P3333333333333333333333333333333333BO]<;N33333333333333333333333333333333333333:2IBPe5 :333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333358&F>3V>4W;.M9)G6"=49378&H?4[6&A8,F=:TBIaBH`NSq=:S7*B33333333333333337%@@C_463333333333333333333333338(CBEa@A]8*DCIe>=Y8*F46333333333333333333335;9$I;%M593333333333333333333333333390?E[VIh\7);333333333333:4ICTd4633333333333333333333A6;`vMoUoUe}O7!53333333333=&6XaaaVg\E4333333333337 4PG?\ZD[a`YYYz}N[[YX[[P\\\T]]W^^^T___U^__X^H@J2:33333333333333gODVTĬbĬbĬbzaJL2;xRŧcǪcǪcǪc~T[]uRǦd̪fȦd̪f̪f̪fŤc̪f̪f̪fʨe̪f̪f̪fɧd̪f̪f̪fǦd̪f̪f̪f̪fƤd̪fyUF+933uZHǪcǪcǪcǪc~TfMCQ7<`ĬbĬb[}RWE,9{bJ^ǴcʻdƷcɻdʻdƶbóba{P```þc_Q^^viI33333333333333Q@=[[[RF2:33333333333333333355873333:&6vS}VpQWZE33333333333333=*7XUChoJyT}V}VguLxVxVxVX_FMKA433333333333333333333333333333333333@C\7(A3333333333333333333333333333333333AO\?HW3333333333333333333333333333333333333333=>U?AY3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333335 =:+I>6W@=^@>]@@^CFeLVCHgAF_AE^;5N>+I79333333333333333333335!<:.J33333333333333333333333333@@\7'B333349<3O?=[?=[=4R:+I7"?4947496=8"C:&I<*R;'M5=333333333333333333333333333333338-=E\UKm\<=D3333333333=@T?FX333333333333333333333333KJ@oUoUcyN[fH543333333333TE?]`X_]cVD333353OF?[ZDWXTZ_`VYYy}NTzzNicHnhHmfHe\E]QBofHmcGkaGocG~uMxM{qKZ^^T___R___Y[`Y{fJ?&63333333333cJCĬbĬbĬbĬbĬboUFqVGǪcǪcǪcǪc¤beLa̪f̪f̪fâc̪f̪f̪f̪f̪fbYXjOgNgNXW`̪fʨe̪f̪f̪fţc̪f̪f̪fǦd}_J\ǪcǪcǪcǪcwR[@?^ĬbĬbĬbĬb{S9533dLC`\aŶbʻdɺdñaa^X`øbddĿcb]RK3:433333333333h\ESX[[XK@33333333333333333333333333:$6elI{U}VoO543333339#5QH@jnJgmJWWWl{N}V}VwSmPboKD9<3333333333333333333333333333333333333348@C_353333333333333333333333333333333333?HUDVa333333333333333333333333333333333333333359AE_8)B33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333335485 :9'G:)L6>336=C'K:(H;,M=1S;/N;.M8U:,H3333333333333333333333337&@@A^4933333333335">9+I=1R@9[?7[?5Y>1U<,P9'I7!@46333333333333333333333333333333333333336%8F^THfVEZP6$7333333ANa;7L33333333333333333333333333ORCbyMmRsU]jI333333333333ohIUbbbYB09PK@|TWzSUXX~X`~Z`fGQE?;%63333333333333333333333333333333343=$6Q<$653~gKaaaS]`\aaxP`ǽcŻbddcd___xNzjJbOBJ4:63h\E\\QUjbG3333333333333333333333333364rOWnzMoPC39A/9XQBosLsyNXXXq{MWWWgpK}VtRWWD8"53333333333333333333333333333333333333333339,H<7S333333333333333333333333333333333333>@PBQ\333333333333333333333333333333333333333333:1J??X333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333359@2\@2\@2\59@1[C/X;,N;+L;.N;/N<1Q@9Z@=^@=\CEd8*FCEdCEdCEd8'B3333333333333333333333>9V<4P3333333333333333333333333333333333333333333333333333333333333333333333333334CRMGaSLsZ?FF5"647EYl7'@3333333333333333333333333333\hIsUsUsUIE?3333333333Q@=\`aab^{UvQWWsOzQ][EiQkTjS>19333333333333333333333333333333333333333333333333K4:ucHT^S```V_aaWW>>533333vQĬbmN¤bǪcǪcVsQ^V̪f̪fʨe̪f̪f̪fţc}VF+9333333333333333333333333333333;!5gN`̪f̪f̪fģc̪f̪f\XZjNǪcǪcǪcoO`]B)8N43533333333338(D@@^4833333333333333333333333333333333333333333333333333333333333333333333333333333391=IfTIiSLsWCUPF_j36333333333333333333333333333354f{NsU`nJrRC7;3333333333Q^cdccYhrKrORKA8"43333b~NjSjS5433333333333333333333333333333333333333333333333333333364kVDW``RaaaayQ\oVG8453hNCaǪcǪcǪcǪczSX̪f̪f̪f̪fɧe̪fuSC(83333333333333333333333333333333333333384~`LƤdɧe̪f̪f̪f̪f_jMǪcǪcǪcǪcǪcx^IH.9mSFaĬbS`aaxQ843333D+8RW`¸bǽcdW____P___cbacc`U]]]OUWXUSW[[S`a_^[YYu{NYYYnuLXXzRQJ@D6;33333333333333333333333333333333333333333333333333335!<>9X33333333333333333333333333333333333333?FQDW^33333333333333333333333333333333333333333333:/J<5P3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333336!A;(O>/Z?0X7!@=,R@2\=,R34656633455657463333333335@>\CEdA@^4:<2O<4R@;\B?b?8Y<0P7$B333348?<]8'D333333333333333333333333333333333333333333333333333333333333333333333333333333333333>BCF^NO~cQuKtRCTG>C@6&73333333333333333333333338$6ctLxVxVqS8#68#5GA>QUCoSwV_bdb_^TQA3333333354eS^|NTeG7 4H6;[OB]SCoiI|yNQohHUWXzMZZZQYWT|mKwNyjJm\FC,784333333333333D,8q\GZaaaVaĬbĬb_hOD3333335;;(L57>?D"FA!E? C= C?"E@"GA$K@&L<7;9+85"4333333333333QSCyWyX}[lSb{NoUkSmRsUWaX[abWNE?333333GB=qW{[\srL[[WV[[|N\\\P]]]V^^[Y___S_YQaKAYB?<#6333333B)8|eK^a{RĬbĬbĬbĬbpO`x]IkNǪc`uR̪f̪f̪fʨe̪f[C(83333333333333333333333333333333333333333333333333364rR̪f̪fȧd̪f̪fZ[ǪcWsWG¤bwQĬbĬbĬbĬb\I0:3333U=>kK````tM]ePC33333353P95V4933333333333333333333333333333333333333F^`DV[3333333333333333333333333333333333333333333333>8U6#>3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333346;$K>+W9#F4633333333338=I3`@#G6654333333333333347=<#H?'QECh=6T333333333333333337;+MFEpB?f47333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333;2K??X44:5;T333333336$6:5;CQBDUDQtLUPTwMZQRlJ]QVuLbRbRWoJgSy[^]zWJF?8#5333333R]]]_a_`\[^z[^YT[YRzxMPzwMjaF{N|vMxqKpfHPPPRXZU___X___]Z```wPaa\iLH.:: 5rYG]ĬbxQǪcǪcǪcǪcqQ^Ƥd̪f̪f̪fY7433333333333333R7=Xʨe̪f̪f̪f̪f̪f̪f̪f̪f̪f̪f]gJD4333333333333333dM̪f̪f̪f̪f^~UǪcǪcǪcǪc\X~eK53D*8qXF^aaa}R_`zfJ633333333333B*8R]W^^^vL=%633338 4@)7O<z~O[xOYYVMB33333333333333333333333333333333333333333333333333333333333333333333333333333333336!?:+L333333333333333333333333333333333333337*>Iie>@L33333333333333333333333333333333333333333333336#@;/O33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333339 BA)T8?3333333333333375:7339$G<)P333333333333333333333339@;\7&E<'P:%J34333333337"A?2W9%E33338$E=-V6 ?333333333333333333333333333333333333333333333333333333333333333333333333333333333333338+E=9T333333333333333333337$6;09<39A?=@<49>2:X\E}V}V}VOI@33333333Q>=]\^`bba[aay[z[]UCB/9@+84333333333333333333333333333333353G19S>=_KAkXEW^_V````UaaazQªb\fLO5%6kMaaWaaaaydJS;=3333333333@(7iWE]__S[^wjJ53333333333333333333333333O@>z}OYYWorLNB>3333333333333333333333333333333333333333333333333333333333333333333333333333333333338&G7#B33333333333333333333333333333333333333=?IF]\8-?333333333333333333333333333333333333333333333349=2S33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333: C@'P483333333333333333;733335==+U36333333333333333333336!=B?b5;35;(O8"D9$G6<5<<*P<+P5;333333336=>-V5>3333333333333333333333333333333333333333333333333333333333333333333333333333333333336$?>]^_aamiIV\x\^ZmkJ:$533333333333333333333333333333333333333333333333333333333B)7YC?S_aaWĬbĬbĬb[]Ǫc]~cKmN]̪f̪f̪f̪f{^K333333333333dHCɧeʨenB fU3Ĥb̪fiO433333333333V:>̪f̪f̪f̪fǥd~bKjNYǪcŧcWĬbĬbĬbĬboMTF-933333343S;=wdI[___Q__qL9 5333333333333333333333374iaG}~O[[[rqKqrK743333333333333333333333333333333333333333333333333333333333333333333333333333333333333346;)O3333333333333333333333333333333333333345JkbCTT33333333333333333333333333333333333333333333333336<.Q333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333358B'O583333333333333333338433333333:#H;'O333333333333333333335;?7[373333;'M@/[>,V333333333333333333337@='P353333333333333333333333333333333333333333333333333333333333333333333333333333333333>8V5"?3333333333333333333333333333333333333333@09|V}V}V}V}V}VepK74Ya_]^P;&6rYy]_YWTokJ;$6333333333333333333333333333333333333333333333333333333333353O633333333333333333333333333333336@*V5<33333333333333333348?8\5;3333489#G463333333333333333333333:"G:"G33333333333333333333333333333333333333333333333333333333333333333333333333333333339*H:-L3333333333333333333333333333333333333333l|N}V}V}V}V}V}V}VG<)733333333333333333333333333333333333333333333333333333333333333333333333333333333333333333347:%L3333333333333333333333333333333333333333EYVKnb7(;3333333333333333333333333333333333333333333333336 >8%G333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333337:A#I3333333333333333333333333333333333:"E>'O33333333333333333333A7]7#A33337!B:&K33333333333333333333333334>&O6:3333333333333333333333333333333333333333333333333333333333333333333333333333333347?7X3533333333333333333333333333333333333364|V}V}V}V}V}V}V}VZ]FXE?^^^^^rSZQZQ=08]TCU[[TXZrmJ>)633333333333333333333333333333333333333333333333333333333333333>%6}TǩcǪcǪcVǥd̪f̪f̪f_433333333343Z̪flZ69/ʨeĢcA&73333333333wS̪f̪f̪f̪fpPǪcǪcǪcWO5<53O5<{bJsP^aaa|Q```]zOr_G7433333333333333333333I5:wmJT\\WV[TO>=3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333;$K48333333333333333333333333333333333333338+'O9 B333333333333333333<,O9'I3333:$I7!D333333333333333333333333337==$J3333333333333333333333333333333333333333333333333333333333333333333333333333333333:,J9(G3333333333333333333333333333333333339#5}V}V}V}V}V}V}V}V_fH43Y^^^XnVZQRqK3333>)7trLZ{{N[[[PQQ?=33333333333333333343D,8I2:\G@hTDtaHlXEuO~RTV{eJVVVyaI}StPmN~eKZ??_DA_DAnO`jN̪f̪f̪f̪fbL3333333333iME̪fXoB̪fqR3333333333Z>@̪f̪f̪f̪fxS`|TjNDx\Iy_I]ĬbĬbaYaaaT_`WcLB53333333333333333333?(7[I@S]]P\\\ytKaVD433333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333:!E6=3333333333333333333333333333333333333333CTRKp`=2U38333333333333333333333333333333336433uS}V}V}V}V}V}V}VPKA33qcG^RuMYaUpK>:;33333333A,8{xM[[R[\\OvMR?>33=%6VC?oaGl]EW^_}O___W_```RaaazQĬbĬbĬbĬbuQǪcǪcǪc_vS^ɧd̪f̪fI-:33333333:5`̪fB7! âa˩eQ5=3333333343`̪f̪f`\xS`ǪcǪc~TĬbĬbĬbĬbvPaaa_pZGS<=433333333333333333<$5[I@Q^R]]]SYZndG9!5333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333: C7=333333333333333333333333333333333333333392?HfXEZT343333333333333333333333333333333333333333333333336?7 A33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333<?<?33333333333333333333333333333333333333338>B'Q693333333333333359>0X4846>(S333333333333333333333333333333: A9?33333333333333333333333333333333333333333333333333333333333333333333333333333333336 ><,Q343333333333333333333333333343VUCxT<)7PKA}V}V}V}V}V}VsR6433Q<E33333333333333333333333333333333333333333333333346;$K3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333B"F463333333333333333333333333333333333333333338=B&N7;33333333333333<+P8#E8 B;#G33333333333333333333333333333368="F3333333333333333333333333333333333333333333333333333333333333333333333333333333333338#D:(L343333333333333333333333:&6oP}V}VjwM33Z\E}V}V}V}VrQ@093333<$6___aaW333333333333333333P>=T`__ccbcdd`a`_[____Z```TaaaTĬbĬbĬbĬbXǪcǪcǪcW̪f̪f̪f̪frR3333333333oQ̪fYJ,&̪f^3333333333kNE̪f̪f̪f̪fuRǪcǪcǪcǪcyRĬbaUiODC)8333333333333A(7O8;tbHT_V___P^^^zNRYH@43333333333333333333333333333333333333333333333333333333333333333333333333333333333333333399886778;=< A:?34333333333333333333333333333333333333333333>BEJmYDVO33333333333333333333333333333333333333333333333334;#I473333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333B"G33333333333333333333333333333333333333333333337;B&N< B3333333333337!@<,T>&O5833333333333333333333333333333334@#I333333333333333333333333333333333333333333333333333333333333333333333333333333333333336"B:&L46333333333333333333UWDsTiwM}V}V}VE9;33?/9SPBY[ELD?54F9&63333333333<%6aWDSzuL\\^_ccabddcbdc\]YSzhJwbHnYEeOC^GAaJBr[Gr[Gr[GmUE{SUXZ]ǪcǪcǪcV̪f̪f̪f̪fvYI3333333333_̪f#]̪fD)833333333P4<̪f̪f̪f̪fnPǪcǪcǪc^nSEcJB;!533333394P7!EC$K:=3333333333A/\@(R3333333333333333333333333333333333A$I33333333333333333333333333333333333333333333333333333333333333333333333333333333333333334;;&N6>33333333333343dqLxVxVnQxTuRH==333333333343`fH}V}VjwM33iWE`bb__iWE333343RC?njIX[[P\\\O^`\aa`Q^__R___U``ZRyQwP}gKnWF`HAlREaHBW>?J0:dJClQEuYH~cKmNáb̪f̪f̪f`CB33333333G,9̪f[nB̪fmPF3333333374ʨe̪f̪fǥdsR|TeMkPDgLDY??mTFiL~SqO[aaaX```}P___R__[yjJQ==433333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333GaRLsZALI33333333333333333333333333333333333333333333338:=!E4533333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333C D333333333333333333333333333333333333333333333333333366?!DC$J=A443345B)U=*V3433333333333333333333333333333333A"F333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333338 C<$J8>353333=-8iPbkMz\{[xYPL@6433333333333333dnJ}V}V}VLD?A19ccaShVD=%69"5SF?U[[~O[[ZW[Q`SBWE?:"533L7;sfHVR___|O___Q```Z`aaaSĬbĬbĬbXǪcǪcǪcǪcyT̪f̪f̪f̪fS8=33333333X=A8;333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333BB3333333333333333333333333333333333333333333333333333333334:"G7<:$J:#H33333333333333333333333333333333A!F3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333337<: B.93333333333333333339$6xT|VdpKkOEWEmZdW@8<33:#5faGWTV[[Q[Te[EL9;743333333333333333>&6bOBxNYQ___yO```TaaaaTĬbĬbĬbUǪcǪcǪcǪcvS̪f̪f̪f̪fJ/:33333333X&633333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333;:@MwXLtV91=33333333333333333333333333333333333333333345333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333B B33333333333333333333333333333333333333333333333333333333333333E%LH&P4433<%N9"F333333333333333333333333333368=?3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333D;?5733333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333?2:lSnT_pKsUMLA3333333333333333333333333333^gIwVm_laPvPOD>]ccbcc^ncH43333333333333333333333333333333333333333333333333B*8YB?W?>xaIqNSVT`ĬbĬbuQǪcǪcǪcǪcpQ̪f̪f̪f̪fR7=33333333X=#63333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333;:=LsTNyWCUI34333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333387;933333333333333333333333333333333333333333333333333333357A"F:<333377A@3334;"F>$L563333333333333333333344@ B:7:7958433333333333333333333333333333333333333333333333333333333333333333333333333333333333333333354eOoUoUkRB6:3333333333333333333333333333338%6m`ibcX\_bccba___uM43333333333333333333333333333333333333333333333333333333333333333353?&7A'7N3<]C@|aJ|TiMb̪f̪f̪f`CA33333333G,9̪f[nB̪fnQF3333333374ʨe̪f̪fţcrRWmOdIBG,9: 54333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333>AAN|UHgNE]L4433333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333?=333333333333333333333333333333333388><@>A@C BC C<>677878@ D453333333376@>44336;@%L<44333333333333333333333333333333333333333333333333333333333333333333333333345%;:2D:5F>BN=@LAMT?ENALQ>BK>@I??F]zQa|NgPmT@4:33333333333333333333333333333333@IDUWkdbccbca^_____jXE3333333333333333333333333333333333333333333333333333333333333333B)8qXGmSE]ǪcǪcǪcqP̪f̪f̪f̪fuXI3333333333_̪f!\̪fE*933333333O3<̪f̪f̪f̪foPǪcǪcǪc^jODu\HC)83333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333344E[HHhMN|UHfN44333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333375:8333333333333333333333333333375=:7633333333449:=?K'OB"E3333333333333344=;<954329=?!EA!G> @8;7768::??G"G<<33333333333333333333333333333333333333333333333333333333333333333333478.B?ET@KWGchCV^HfgDX]IggDY]IieE\\JkdF`^Kpcbqgmgq__JZO7+<333333333333333333333333333333@IENyW_Za`dca^_______]B*833333333333333333333333333333333333333333333333333333333H/9cJBXĬbĬbZ]ǪcǪcǪcV̪f̪f̪f̪fqR3333333333pQ̪fXI,%̪f^3333333333iME̪f̪f̪f̪ftQǪcǪcǪcǪcsPĬbĬbWlRE953333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333337*8F_HN}RMzQBPE4533333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333<842333333333333333333333333:674333333333333333333@ B:;3333333333333333334386:69585448:;=<?<>99<:983333333333333333333333333333333333333333333333333333333333333333348-C?EVF_iDWbGcjDXbEZa@HT@GR<;J=IAIL^e\gfqgrS{_Kp`GaXJjZBOM7+;3333333333333333333333>CCIfP^^xaWcba`_________p_G3333333333333333333333333333333333333333333333333395iQDVaqNĬbĬbĬbĬb~TǪcǪcǪc``̪f̪f̪fa3333333333eIC̪fMhV4̪fmP3333333333X̪f̪f̪f̪fWǪcǪcǪc^]ĬbĬbĬbU_S]EA533333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333<==N{PJqMLvPBRE33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333343:633333333333333333333338453333333333333333333339:=?33333333333333333333333333333333333375=:6533333333333333333333333333333333333333333333333333333333333333349/FDUeCTcG`k@JX;8J7+@3433333333333333339)7aPfSeSVjKIRH@JLIg[F_VLr^Kp]HfVJjX=BE6&83333333333333390>94F,9x^InM`aaa|Q```^|jJV@>33333333333333333333333333339 4F09S@>R@=fZEndGvnJbVDPPQ|zNzzNRQPc^Fx{NmlJc^FK>==)733333333333333333333333333333333333333333333333333333333333333333333<3:GUCUPVQKiIQPBOB333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333353323333333333333333333333333333333333333333333333B B3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333337'A@F\DTi;5L353333333333333333333333338'6SlJZO[zNbRVnJ7#5333333333333333333337'9ALI<;ABOJMu[Mu[Mu[Nx[bepexVhzNC8@;0O?6Wlbbbb_____ckfraH333353\___^sNyP\E@633333333343XB?X__zO````TUeNC843343aHBY_VǪcǪcǪcǩcV̪f̪f̪fʨekNE3333333333T8>ʨeʨe\M.1)¢a̪fx[J3333333333C(8ȧdʨe̪f̪fa]ǪcǪcǪc`X_fLA(733=$6pYGY]]```zO__SN7;3333333333338 4O:>3333C)8lWE[`_U___SwNB+874T?>ueIvfI\^^^{N]]]]~N\\\P[[[WW[[[RYYYzQYYYwPXXVmwM`cGSNA@/943333333333333333333333333333333333353?6;MXDObF]Q]QQlIZQZQHVC=9<333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333429373737333333333333333333333333333333333333333333333?=333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333338+EAG`=;T3533333333333333333333333344OgHZQUwMY~NWvM<0933333333333333333333333333333333>@CMu[Mu[Zbkkkkc]EHW?=Z493333;"5[`aa`______wgI68:>33saH__^avP````YZ^a`XZ__]ubHYB?43333333\D@ZX\ĬbĬbĬb^]Ǫc^hMsP]̪f̪f̪f̪fy[J333333333333gJDʨeʨej@ bR1âa̪flP433333333333T8>̪f̪f̪f̪fǦcmNx\IZǪcǩcUĬbĬbĬbaxPaSI0:333353cMBmL____P`aa__\U^^^S]]]]~O\\\R[[[XX[[[VYYXVYYSWXXtOWWWkxM}VuShtKW[ERRCNI@>09=,8>.8:(6:(7>09>29?3:HE?JLAQ]F^zN[vLbRbRXtK]Q]QUuLL`F<3:3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333823233334373333333333333333333333333333333333333333376973333333333333333333333333333333333333333333333333333333333333333333333333333333333333333337%@AE`<6P33333333333333333333333354DNAS|OPoJZQZQCF?44333333333333333333333333333333333333F\PT_bfghjgGR^=:U3433Q<=4333WC?]bbb_____T53338::C/9F3:G5:I8;74A-8K;;U3433ZF@_Q7433C+8]bb___]n\F4333333356;;D!D7784YC?X```abdŽcddc^VW>?43333384|gJW[aaa]]`gL?%674ZǪcǪcǪcaW̪f̪fƤd̪f^=#6333333333333C(8uS̪f̪f`vGXI," J>%k@[̪f̪f[S8=33333333333333xT̪fɧeʨe̪faYǪcǪcǪcǩct[HB(7bIBXĬbWaaa`|Q^mXF43A(7wbIrM_addþbcddcR^^\U`QBWF?J6;=&6333333333333333333333333333333333333333333339#5NC>UOAtPVWl{N}V}VjxMxVxVxVdvMsUsU`rKoUoUd{NjSjSjS\wMfSbQKQBEE?7$6333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333343;8333333333333333333333333333333333333333333333333333333333333333333333333333333333333333335=:W>;W343333333333333333338,8BQCHgIQPQPLjIQvM@C>33333333333333333333333333333333333333333333NSCbzMlaZnG[h4733P:<^__U;#533OZDeOrRQvgI^JA?'733333333333333??33333343M5;nL]cdddƿcd|PĬbĬbĬbXaHBYB?[``SűcdzcƳc]nUF=#6333333mOǪcǪcǪcǪcW^Ƥc̪f̪f̪fX7433333333333333U9>Y˩e̪f̪f̪f̪f̪f̪f̪f̪f̪f̪f^jME4333333333333333~`L̪f̪f̪f˩e^dLǪcǪcǪcǪcWĬbëbUgNDO5;qZG^aa|Q``a__`rM___ccbdddZ}tLD.8333333333333333333333333333333333333333333333333333333333333333343=)7E8;QMA[]FTTCizNmQrS`oJsUsU^nJnTiR^pK[nJXgHOUC@8;;,8333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333332<7333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333:,I@@^36333333333333334 4?E@GcJKqMOQJlKQPLoK<9<3333333333333333333333333333333333333333333333@4:jSiS]kT~CVT33G19\____XA)7@8;bRbRNZE33333333333333333333==33333333D.9VWXcddµa_WĬbĬbĬbĭbóbU`aƷcʻdȴcʶdưcìaax^I533333<"6_ǪcǪc^mNjN̪f̪f̪f̪f̪fZ843333333333333333>#6eICpQ^____yUoRGG,9333333333333333333eM˩e̪f̪f̪f̪f|U}T]ǪcǪcǪcwQĬbĬbĬbëb~Rw`IX??lL]Y³bĵbɻdǹcƻcķbY[____^a`]R]O:"5333333333333333333333333333333333333333333333333333333333333333333333333333333335454433333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333343:6433333333333333333333333333333333333333333333333333333333333333333333345465!84634333333333337@?a6#?333333336%7<9??FCIhNKpQN|RN}RHeJN|PE\G8,833333333333333333333333333333333333333333333333343R_EjShTQvLxlALI53W______iWE8'6bRbRVlJ33333333333333333333:9433333O<CI?EHAJZGVc?CFALIBQKF^NKqVHgPNyWHfON|UN|UHfKGaI;9<443333333333333333333333333333333333333333333333333333EC>fS\vLNcYJqpLv^IfUxNRZ____}nK3333SjITlIPeH33333333333333333333449733`SC~xMZ]][^NA533364u]HªbìaIJaʿdɿd`_]ʻdȶcĭbĬbĬbĬbĬbĬbĬbĬbsZH333343I/9rQǪcǪcǪc^Yɧeģc̪f̪f̪f`gKD3333333333333333333333333333333333333333333333K/:[̪f̪f̪fʨeb`XǪcǪcǪcX=#6K1:YĬbĬbĬbtOaaïbǴcɺdʻdʻdʻd_dddd]R=%633333333B+8vlJ]]]{tL[^OB333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333346<;L@MXHdiE\aEZ`EY]?IRALS?GOAMRBQRCSTHf]Gc[Kp`GdZLr`PrxLtbKp[KpXMu[HfRMwXFaNKqTCUIANE;8>343333333333333333333333333333333333333333333333333333333333\uLfS^TBRcE[\Mt\th^^QX__|O433333RiI]Q]Q433333333333333333333396dXD\\~O\XI4:3333333333O7<^ǾcȻcĹb_aȹcůbĬbĬbĬbĬbĬbĬbĬbĬbĬba;!53384t[H`ǪcǪcǪcǪcUX̪f̪f̪f̪fɧe˩erRA'73333333333333333333333333333333333333384{]Kţcɧe̪f̪f̪f̪f_iMǪcǪcǪcǪcǪcy^IB(833J1:fL[}R®bƳcƳcŲcʻdʻdʻdʻd`ddd`\aYK6:<#684333333[J@[Q[\\mcG33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333336&==@QF_iD[d@LY<;K5%;333333333333333333349/>:5ABJUDPb?JI@GH?DE?EF94=9/;4 5333333333333333333333333333333333333333333333333333333333333333333A;'63333333333J3:Z_`\]_TìaĬbĬbĬbĬbĬbĬbĬbĬbĬbĬbĬbZA@95VĬbrPåbǪcǪcXWWV̪f̪fʨe̪f̪f̪fĢczUC(8333333333333333333333333333333: 5eM`̪f̪f̪fţc̪f̪f]oP`oPǪcǪcǪcpO`[?&7333343mM­bɵdʶd[ʻdʻdʻdȹcɾdùbŻbd`dddb_^ZVWX}N_ba^ZVf\EK;;C/933333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333334 9@J\CUcCTb==O4!9333333333333333333333333333333;,N9&E33333333333333333333333333333333333333333333333333333333333333333333333333333333SeHbRZzRG_k:4HqtRss_^^^ylJ9 533333333CF?RpKPlJ9+7333333333333333333cXD[{wL\\riI333333333333\I@~pK____rMN7;{RĬbĬbĬbĬbĬbĬbĬbĬbĬbĬbĬbĬb}eKWĬbĬbĬbtPƩc}T}aJǪcǪc`xS̪fa̪f̪f̪f̪f̪f˩eXsUHG+9333333333333333333$6<"5XĬbĬbĬbĭbYijbɺdʻd`a__[addd`daY\]]P\_cZbb_T[Xg`GfcGK;<433333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333334:4JEZkAL]90F343333333333333333333333333333333333>1U4:3333333333333333333333333333333333333333333333333333333333333333333333333333335 4SjHYvLMaUCUb_RD[mn_^^W?(73333333333CE?ZQZQ=4:3333333333333333_TC[[[}NndH333333333333ZG@^[R__ueH4333TĬbĬbĬbĬbĬbĬbĬbĬbĬbĬbĬbĬbVĬbĬbĬbĬbĬbiODV;>ƨcǪcǪcǪcǪccKa̪f̪f̪fâc̪f̪f̪f̪f̪faXVgNcMcMW}V_˩eʨe̪f̪f̪fŤc̪f̪f̪fȦd~aK^ǪcǪcǪcǪcrWH\A@_ĬbĬbĬbŭbZYUĬbĬbĬbĬbĬbTXiRDR<=rMT[T^½bdacdd]\]]R\\]^bba^[[vxMYYPmpKRH@543333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333335!:>CYDUi:3J3433333333333333333333333333333333333335>0W33333333333333333333333333333333333333333333333333333333333333333333333333333333BA>]Q]QBOYkf]_zprb^W?(7333333333333BC>ZQYQ=5:33333333333333\QBupK[[[ZMA333333333333VC?]^^\UdQC333333x_IĬbĬbĬbĬbĬbĬbĬbĬbĬbĬbìaɵd]SĬbĬbëbiPEA'7fLǪcǪcǪcǪcsQaUuRɧe̪fȦd̪f̪f̪fƤd̪f̪f̪fʨe̪f̪f̪fɧd̪f̪f̪fǦd̪f̪f̪f̪fƤc̪f|VH-:33bGBǪcǪcǪcǪcXC*8U;>aĬbŭcaɱdʵdrPaĬbĬbĬbĬbpN33333333333384U@>aNByNYabb`WSRulJunJ{uL}OxtK^a[ba[RYYv{MYYVYTCA/93333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333337(AAI`?DZ4833333333333333333333333333333333333333334;<,Q33333333333333333333333333333333333333333333333333333333333333333333333333333333ITC[ORoNtym]`utn[W?(733333333333333<4:RyNQuM;3:333333333333O?=ZZ||N[]QB333333333333Q>=~uL[^^XA*733333333T;>ĬbĬbĬbĬbĬbĬbĬbĬbĬbìaȴcʶd¯b^VëbeKC33T_nO`Ǫc[hMǪcǪcǪcXzTʨe̪f̪f̪fb̪f̪f̪fáb̪f̪f̪fǥd̪f̪f̪f̪f̪f̪f̪f̪f}V\@@33333333rQǪcƨcsQYZ53X??ībǯcɴdʶdʶdɱduPĬbĬb\\B@3333333333333333333333<#6U^[}O]wmJ333333333333D09}|NY[\Uc]EQY{QYYu}OXXovM>,73333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333338)CBKc:3K333333333333333333333333333333333333333333335=:(L33333333333333333333333333333333333333333333333333333333333333333333333333333343YPXOg|X|b]^srniK?(73333333333333333>;333333333333G19Z]PZYC,8333333333333yRĬbĬbĬbĬbĬbĬbĬbìaưbʷdŲcaaZV<>33]DAĬbĬbĬbYXT:=aǪcǪcǪc_|T|TsQ\̪fʨe̪f̪f̪f_̪f̪f̪fţc̪f̪f̪f̪fb`vS~U[43333333N4?3384jNƩcǪcƪb˲eʲdʲdɱdaA(795^˶eʶdʶdʶdíaqZG3333333333333333333333333333333333nbG]]]OXH@333333333333;$6T{~NXY\SC33333364E6:ntLXp{NWWkwLgsL>,83333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333==9933333333333333333333333354;855333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333347@B^7*D33333333333333333333333333333333333333333333333359:&M333333333333333333333333333333333333333333333333333333333333333333333333333333TcH]^wuO]`}lJ`Y33333333333333333333=;3333]EA\ĬbĬbĬbkMA'7WnNYǪc`pTFǪcǪcǪcǪc}aKǪcǪcæbYdK[WxSlOXǩcǪcǪcUǪcǪcǪcǪcyS74ZǪcǪcǪcǪcȭcʲdʲdʲdʲdfK33V;>Ƭcʶdɴc^a]D+83333333333333333333333333333333333zqK]}NZ[M:<3333333333338 4RYYX?*73333333333>*7\\EUWnO}V|VOK@643333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333344>A44333333333333333333333333333333:97633333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333<5Q<4P3333333333333333333333333333333333333333333333333334<'P3333333333333333333333333333333333333333333333333333333333333333333333333333P>=_a^vpRS}VLodIg`33333333333333333333?D?QPQP6#5333333G6;XYYppK33333333333333|vM\[|NZF09333333333333333333333333L2;mSFnNxQ`a``[V>=3333G.9aXxQ`^;!5v]IĬbĬbaVjODUǪcǪcǪc¤b}bKǪcǪcǪcǪcjMǪcǪcǪcaVǪcǪcǪcXWǪcǪcǪcŧckNǪcǪcǪcǪcǪcƪbʰdʲdȰcɲdɵd`GA33jN`\```W643333333333333333333333333333333343i]F\\\XA+8333333333333?+8WVqtLS743333333333339$5TOBwS}VwSmQoQB5:333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333>@553333333333333333333333333333333333>=4433333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333336!<@>\343333333333333333333333333333333333333333333333333333<'O34333333333333333333333333333333333333333333333333333333333333333333333343jaGV}Z_^}o\\MA91@F`\CTU33333333333333333333=@>IjJHdH333333;%6Vw~OST7 4333333333333_QB\\\YB,8333333333333333333333333333333?'7yfI[```dNC333333uOaaaYX>>43[ĬbĬbĬbY:!5nNVŨcǪczT~UǪcǪcǪc]rQǪcǪcǪc]sQǪcǪcǪc]fKDǪcǪcYWƪcǪcǪcǪcǪcǪcǪcǫcɲdʶdʶdʶd]3384B(8kL````gQD333333333333333333333333333333333333~O\\RxtL:"5333333333333M>=|QYYijJ33333333333333337!5]bGgwLxVxVi}NRTC3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333368;>33333333333333333333333333333333333344>@3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333;1P8(E333333333333333333333333333333333333333333333333333333;"G5:33333333333333333333333333333333333333333333333333333333333333333333B-8R[[q\}`_vi_QB33<RQ\\RA>333333333333333333333333333333V=>W·a\_a~jK333333E,9aaaaoN33T:=ĬbĬbĬbĬboVFbHBĬbªbW{SY??[ǪcǪcǪcxS~UǪcǪcǪcYdLǪcǪcǪcåb74mOrP`ǯcɰdǪcǪcǪcǪcǪcǪcǪcȯcʶdʶdʶdȴdX@?333363V`\Q^N7<333333333333333333333333333333333384TQW[zvM33333333333333^YEYYUC3:333333333333333333:&6euMuUg}OsU`pK643333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333>!D4433333333333333333333333333333333333333>@3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333347>8X343333333333333333333333333333333333333333333333333333336;;"F333333333333333333333333333333333333333333333333333333333333333333N=AK33333333333333333333BSDKqLGdI3333L@=yPYYULA333333333333;#5W[YOg[E33333333333333333333333333333333_ʿdʿdʿdʾdR53333333fOC\aaaC*833pXFrO\Ĭba<"6sPĬbĬbĬb]4333G-9gLDkNeJCiMVX]vR]C@}SxQuQtP=#6qOĬbĬbȰdʲdǫcǪcǪcǪcǪcǪcǪcƪbʵdʶdʶdʶdu^G333333C*8RS__[C+833333333333333333333333333333333339!5R[[[XJ@33333333333343zQu}O}S~S6433333333333333333333H@=nSsUhP]mJ9'633333333333333333333333333333333333333333333333333333333333333333333333333333333333333333334>!E3333333333333333333333333333333333333333:<783333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333338(G9)I3333333333333333333333333333333333333333333333333333333333>$K4633333333333333333333333333333333333333333333333333333333333374haGUU[[]|b__YGLmdAJP3333EY[Gba7+=33333333333333333333HeKN|RAOD339#5VVs|NnsL33333333333333snJ[[[h_F3333333333333333333333333333333384öbʿdʿdʿdɺdpWG333333B)7`XzQ[rO3384`a^TyaI43]ĬbĬbĬbsP333333333333WĬbëb]v]IK2;ĬbĬbĬbĬbK1:F-9ªbĬbȰdʲdʰdǪcǪcǪcǪcǪcǪcǪcȯcʵdȲcǴc`V?>333333ZE?____U633333333333333333333333333333333333B-8Y[RzyN>)73333333333339"5UXX``F3333333333333333333333<*7dyNfPoUgP9%6333333333333333333333333333333333333333333333333333333333333333333333333333333333333333369:@333333333333333333333333333333333333333379;>333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333=0S4833333333333333333333333333333333333333333333333333333333336:="F3333333333333333333333333333333333333333333333333333333333SD?V[[xwMZ[\_\vN46F^\@IO3335GbaIgd3533333333333333333333NzQN}R>D@33dfHXX~S64333333333333\RCQP[R4333333333333333333333333333333343S^ȻcʿdʾdĮb}dK333333xcI```Y<#533]E@aaaaA(7B)8^ĬbĬbĬbbHB333333333333]ĬbĬbĬby`JD*8ĬbĬbĬbĬbR9=33rPĬbǯcȯcɱdƫbǪcǪcǪcǪcǪcǪcƪbɵdʻdȸc`|Q33333333tbH__ZTzO433333333333333333333333333333333333\PB~~OX[zzN33333333333333TMAXVjpK@.9333333333333333333333333ZgIoUbyN]rK8%6333333333333333333333333333333333333333333333333333333333333333333333333333333333333338=7<333333333333333333333333333333333333333357;?333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333=0T33333333333333333333333333333333333333333333333333333333333333:@:>333333333333333333333333333333333333333333333333333354`XD[[[[ZrnJ[}VTTCUF33JkbF]Z33:2DHee?HQ333333333333333333336&7JmOGdL6)8B2:ipK|RXNC>3333333333339"5W[Z{zNA,833333333333333333333333333333333\H@_þcdȻdƳbĬbqO333353[```xdI3333sOaaaX33t]HZ}R|Q\wPVW{bJR8=3353ëbĬbĬbĬbgND<"6ĬbĬbĬbĬbZA@33I/9Y~SʶdʶdɲdǪcǪcǪcǪcǪcǪcǪcȯcʻdŶc``>%633333343uNVU__qL433333333333333333333333333333333333njJ[[[RD?33333333333333fiIuPWmxM33333333333333333333333333RYEgQjS_wM443333333333333333333333333333333333333333333333333333333333333333333333333333333333339A7<333333333333333333333333333333333333333357; A333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333347;+P3333333333333333333333333333333333333333333333333333333333333333<A;?333333333333333333333333333333333333333333333353[SCVXS[[[[P[OB;7;IjMAMD33CVUE[X33?EPHee;8H33333333333333333333>CAN|ULuS33irKWU`bF33333333333333gaG[[[M==3333333333333333333333333333333374Y_bd^TvQmTE3333M6:V```B*83364jL[aaxaI33TaİbɵdDzcĬbĬbĬbĬbĬboNH/9ĬbĬbĬbĬbU<>53`][X[A?qPY{eJadzcʶdʶdǬcǪcǪcǪcǪcǪcǪcƪbɸda`[[D?3333333363qL____fTD33333333333333333333333333333333338 5W[{{NvxM9!5333333333333;&6UWWI==33333333333333333333333333S^FjSZmJR_F33333333333333333333333333333333333333333333347+==>H>DMDTVDVYCUYG`bBPXDW]>DQ<;K8.B353333333333339 B6=33333333333333333333333333333333333333338;9>333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333348;(L333333333333333333333333333333333333333333333333333333333333333333:=UYYYtuLZ[[SJ8;33;9>N|UCSG33DVTKnb6)`\TSH/:53_ðbʶdʷdůbĬbĬbĬbĬbĬbĬbWYSuOoN@&633V___`ǪcǪcfL_¯bɶdʶdʴdǪcǪcǪcǪcǪcǪcǪcSU}PXY33333333339 5U__S[YG@3333333333333333333333333333333333O?=~PYYd_F33333333333333YXD~UhsKkzM4333333333333333333333333333OYDfSfSHJ@33333333333333333333333333333333333334;6B@ILJj`E\YJmcF^\JjcDWYBRWCRY@JTDU\CT]EZaGcjBS_?FU8-C333333338@8 A3333333333333333333333333333333333333333; C68333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333347:&J3333333333333333333333333333333333333333333333333333333333333333333334<=>@==88556596333333333333333333333333MA>xPxPYYYYXsrKX^TC4333337,9HiOANE33=>GF^XANRE\aALV3333333333333333333334LsUNyW<;@_fHiuLsPbfH33333333333333rrLYY}P>)733333333333333333333333333333333<#6\^QYĶbaaaY33<$6____B*73333t_H```T33P7<®bɵdʷdʷdĭbĬbĬbĬbĬbĬbĬbŮbŲcaaa8433X®adzcʶdȯcǪcǪcŧcoNaïb`ɶdǬcǪcǪcǪcǪc_bGB63]___O9<3333333333<#6WP[^^aPB3333333333333333333333333333333333kiIYYW9"533333333333354grK}V}VPKA3333333333333333333333333344]yMaPUkI<093333333333333333333333333333335!7@HIDXRKp`GaYIh_?HN;8E6$933333333333333348,A<%J34333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333335:&K33333333333333333333333333333333333333333333333333333333333333333333333333336686653333333333333333333333K>=~RYYYtwLYYYY_WD;%6333333336#7NyWG`M3390?Kp`N|rHdh6%;333333333333333333339/?EWBRc@J\7'@46;&N3333333333333333333333333333333333333357<$I33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333;%M3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333343PG?s}OrzNYYYYrxMXYy}OH6;33333333333344HgQCUI3334E_XPvCV^3333333333333333333333CSJMwXBNGOK@}V}V]bG33333333333333ffHrvMQV643333333333333333333333333333333384Z^^^YD?aaaa]33o\F[__r_G333343U```W?>33TƷcʻdʻdŲbĬbĬbĬbĬbĬbĬbĬbȳcʷdðbaxQ43v]IɵdʷdǴcɶdǮcǪcǪcǪcZnWF````oYF33333333L1;ZȰcʿda]uM43333333333333C,8X^[R\cUC33333333333333333333333333333333XNAVYW7433333333333333akIhyMuUOMA3333333333333333333333333333A<@VCRf<;R<)R47333333333333333333333333333333333333;#G6<33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333;#I343333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333343TOAUXXV}RYYYY`ZDI9<333333333333333333MuWHfR3333HebXKXc<>;=;<7733333333333333GdQMwX;6>qSk~OhvL>,8333333333333:$6XYYNA=3333333333333333333333333333333333}tLRP\xNB)8aaa`[<#6_YRRE-83333F.9\TQSeLC33[ȹdʻdʻdůbĬbĬbĬbĬbĬbĬbĬbdzcǴcY\u^HyRĬbǴcȶcǴc[ƬbǪcƨc~bK7453V```W;"53343w\IæbǪcƪbȸdƷcX_Q<=33333333333333>&6U~vL]]]wmJ33333333333333333333333333333374WYY[UD33333333333333<+8xVxVlP333333333333333333333333333333HQB]Q\P8&63333333333333333:2=E[MLsZMu[BQL8+;33333333333333333333333333333333333333333333336(@@H]DJk9'I333333333333333333333333333333333348<&N33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333337>7?3333333333333333333333333333333333333333333333333333333333333333333333333333333333333354LA>flJ~UozMXXXXilJYYrwMG7;3333333333333333333333GbQCUK6;<"FHWeQwIhY33333366883333333333<9@Mu[E\OG>=xVxV`jJ33333333333333\VDYYU4333333333333333333333333333333333>'6\]]R@(743TWUTR]I@___|O333333dPBaĹbǽcȹcĬbB*7`ǸcʻdʻdĭbĬbĬbĬbĬbĬbĬbĬbʺdʻdôb\}eJĬbĬbɸdʻdʻdʻdY[Q6<333333I1:``{P[wN3333}TǪcǪcǪcȶdec_zkJ333333333333333353T]]]PxpK8 53333333333333333333333333333a^FVrxMovL4333333333333333fvMsSbqK>0833333333333333333333333333335 4Z~OVvLHUC33333333333333>BBMuXMwXE]O;8@333333333333333333333333333333333333333333333333333335=9UIRx3533333333333333344636343333333333;'N5=333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333;#G3333333333333333333333333333333333333333333333333333333333333333333333333333333364F97;YPZQ<3:3333333344HcONyWHdPDUK5!63333333333333333333333333333333333333333333333333333333333;-P@?`CJd>:T5 :;2L=9T>;W@@\CEd@>_@;\?:[?8Z>3W=/Q9%E9&I:%K333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333339@6:33333333333333333333333333333333333333333333333333333333333333333333338#6E:DWdBSXFaRJlW45333333333333337(9Ls\GbT7'7rTrU^kI33333333333333E6;XXU633333333333333333333333333333333364zsLU][:!53333]```_}oKY`aZaaaµbƼcʿdʿdűbĬbV_aʿdƷbĬbĬbĬbĬbĬbĬbĬbƲbʻdȺdɺdȸcaZWɹdʻdǸcaO8<33333333333363V___\?&633fKDǪcǪcǪc`ľcdS@)733333333333333333333]LAU\\\~ObXD53333333333333333333333333_]FXXs}O3333333333333333kQsUmR33333333333333333333333333333333PjIUzMHZE3333337(8JkOHeNMwV>CB333333333333333333333333333333333333333333333333333333333333337%@KW}EOkDMg:1KBGa<6Q9-I7'B6"=473636485 <8$C=.TC;l=.U8$F3533333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333335#68-9=@?@MDGHPEZGGaHBPCG^FFZECPBCKACI@@B>:19:.86"5333333333333333333333333333333333354;,7KG?SVDZeH]iHxVxVxVfuL}V}V}VvSwRWWW]YIND?4333333333333333333333333333333333;-MMqbAMJ3380EE[g90EHfTMu[?EE33333333333333?FHKnZBOLJE?sUsUOOB33333333333333aaGXXhlJ3333333333333333333333333333333333\NA\ZPh[E333333_```^\ccY`aa`ǿc\ǼcǻcĭbĬb`__źcǶcĬbĬbĬbĬbĬbĬbĬbųbȷcǷbʻdƵcaaY`\~PyOA(733333333333333H0:^_^RtcH3333zT_vQaƿcdcn_F3333333333333333333333TC>X\QZ[UM;<3333333333333333333333<'6UoxMp|N@.933333333333333QTCatL`tL?2:3333333333333333333333333333338(7S|NVQ=8;337(7IjON|UKsQ91;333333333333333333333333333333333333333333333333333333333333333348FQoKZ}DMh6"<333333333333333333336 >=.U5:468#E=*S8!D3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333335!6=?A@HDKpQN|UFbKN}RN}RIdLVy^O}QIhJQPQPMtLUPVQVQPlJZQZQOfHWvMQfHJWDIMAGJ@B>=A;@TF_m4791=FaPMvX8-:33333333335"7Ko\IgY5#7T\E`qKhP:'733333333333333hpJnvMyQK?=3333333333333333333333333333333333R\\Z:"5333333``a³bƺcdddbUaaadĿceȾdĬba]`_`]ĬbĬbĬbĬbĬbĬbĬbɼdǽcǽcƸcƳb®aa[Z___H1:3333333333333333kXEXP__`MB33=#6uPĬbįbeeeV333333333333333333333333;#5voKP[[[PspK?*733333333333333333333^`FWW_`G33333333333333<,8oUoURXE33333333333333333333333333333333HYERyMGZE8+8LuPIlMKoQ9/:333333333333333333333333333333333333333333333333333333333333333333338+ECEeA>`473333333333333333338%E>2W5<333333349"F<%L353333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333334<CHHfXBPM43lSoU\kJ33333333333333?-8WWwR3333333333333333333333333333333333>(6Y\\zsL33333333S^ĺb\addda|Qaa²adccZY@?84mZFUY]dOCjMaĬbĬbĬbĬb\ȾddŻbdɲcʲd\B*8^___74333333333333333343rL___^O9<33G-9aĬbdeec6433333333333333333333333333VH@V[O[[Z\SB533333333333333333A19WWzS3333333333333333gPnTXdG333333333333333333333333333333335!4NwMRQJlKN}RNzQ8/93333333333333333333333333333333333333333333333333333333333333333333346CLf8*D:.L>5W5 ;333333333333482V383333333333335==&M46333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333335#7ALIE[MMwXMwXHdONyWNxWHfMF_K?FB?GA;9=8-9:4;9/9;-FFAED@BGWDI^FLfHSrKZQZQRmJ]Q]QTqKbRbRbRVjIfSfSfS_wLjSjS`yNnToUoU`uMsUsUsUg~OmPfwMZ`GNJ@8$53333333333777733333333333333333333333333333333338$D8#CEYTIi]3333@I\CUf33336%8E[LMxVDVJ3333336&9Kn_Ij]4!6<+8mToUNOB33333333333333SNAWWchI3333333333333333333333333333333333oiIT}OTK8;3333<$6pLŸfƶhǽddabcd`Z`[R`__|mK3333T_^]?'63384Y??sZHcJC|fJadɿddɻdʲdɱd`[C?___Z33333333333333333333A)7[__X~O8 433hLĬbǾdeƾc[hRC333333333333333333333333333374g^F~O[[XUVb\E:$633333333333333isKjwMn~OKB>33333333333333KMAdPjS9%633333333333333333333333333333333DVCXWTVHhK:3;33333333333333333333333333333333333333333333333333333333333333333333338)D@C^4633;-K?:Z8'C3434335;;.M@;]:,K3533333333333333336;=$I33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333336%8@IIJmWMu[HfTMwXLsWBNG=?A5!633333333333333333333333333333333337&6>9;GOBM^FJWC\{NaQbRSdGfSfSfS]rKjSjSa{NavMavM\lJPUCPPBJE?B6;9&6333333333333333333338;453333333333333333333333333333333333=/S5!9FaZ?EJ3333?CX@G[333333<;@NyWJlQ>EB3333BPQF]W>BH33JI@dO`wM<,733333333333333Y\EiuLn}NKB=3333333333333333333333333333333343W[[~O33<#6uM\wMdǽdĴkƼdddda}QU>>G/943^KAQRRZG@3333U___<#633333333^IA^¸aŻbɾcdʷdǯcŭcĬb_TRU~Q3333333333333333333333N8<^TW^S84:!5^±abaca>$6333333333333333333333333333333=&6okJZvvMYYYu{NedHE5:3333333333JA>}V}VclJ33333333333333@6;jSjSD==33333333333333333333333333333333AP@Y[[]CUD333333333333333333333333333333333333333333333333333333333333333333333333;2M=:V3333338'D9+IA@aA?`9*GA@a=2R5;33333333333333333333338?; B333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333345==DLq[Lt\GaRMu[F]P;9?453333333333333333333333333333333333333333333333333333336!5547"58$68&6545433333333333333333333333333333333333333338;56333333333333333333333333333333335;<.Q;7CIi_8,=3333?DY?F[33333333?GCLvSN{U;9>94AKmaG`Z3433UaGjSgR3333333333333333tR}V|V4333333333333333333333333333333333QA>[[[XJ@bOB[__Sȿddȿdlca`vjJ33333333sfH^^^P;<3333V___:!5333384tM_~PdddɼdDZbŭcĬbĬbUc`_vgI333333333333333333333333Q<>3333489.E;7N<9P<9Q<7P:1K7(C3633333333333333333333333333333333333333333333333333>:V;0L33333333<2QBAcBAc:,J483333333333333333333333333333="F453333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333338,3333333333333333333333333333333333333333333333AB`8'B333333337#?A?aA>_5;33333333333333333333333333333368= C3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333?DIF]VLq]Lr^@JJ6&93333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333334T90EF`\:5C333333==T>@X33333333335#6FdJUjVn@JK333333dRfSLRB33333333333333@19fvMhwMXZE3333333333333333333333333333333364Y[^^^zN____c_S]a}OP3333333333vM^^^B+83333S\]Z33\H@Y___ccĿcbbPBW>?a~S^Ƽcddd]IA3333333333333333333333333333ugI^yM]]|sLE,8bbbbakM33333333333333333333333333333333333333339"5VMBv|OnrKXX}SVWV}W`^oQTUCF<=A5:6 4333333UfHfSZrL3333333333333333333333333333OnKQxMLmJ=@EQjPq?LY:3H4633333333333333334 ;<1P;/N35333333333333333333333333333333333333333334A=^5 ;33333333337%A333333333333333333333333333333333333?!E33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333345@ILKp`Kp`DXR90>3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333;T@F^333333333334CWTXtO_LwO91:339'7fSeSD?>3533333333356:NFGx[wYOLA33333333333333333333333333333333M==[ac^^WZ__T`_`ce_`RC3333333333pdHRSR533333U^^\Q_P___caZ\7433J0:XaĺbŽbƾcdW333333333333333333333333333333_NA]]]]k_EWccc~QxcIJ2:33333333333333333333333333333333333333333333;'6VPBlrKioJWWsO~V`\[xVgyMsUsU[gI]nKNOBLVD[yMVnJ33333333333333333333333333AE?VQVWOzcGagLyeN\90;3333333333333333333333337#@;/Q593333333333333333333333333333333333333335@;]383333333349@?\333333333333333333333333333333333333:>79333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333335"8G`ZJl`GaYBPO34333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333699 B333333333333333333333333333348BHaHec:3C33333333:/ICMf3433333334AMTIieAQOMxOOQLvN:5=54333333333333333333336"5StLQ{[WoDVZ6'AF`5!;333346BUZF_a?EN33:4;MvOKiXS|gOcS`SaQ3333338"E9#G<@9=33SVDf{NeyM:&6333333333333333333333333333374{rLac\`^^ZYG@4333U_^aa^~w[333333333333O]]Z333333zN\^b___WV`^^^G1933333333ZD?ddd\``pM333333333333333333333333333333nbGQW\^acc``^: 53333333333333333333333333333333333333333333333333333333333UZEsUvWONAG?=QRC\hIXdGkSiRkUqZiUfSdRLSCC?=3333333333333333K^G]j]pH^S33339.;NyWDVJ333333333333333333333333333348:(M33333333333333333333333333333333333333@:[4:33333335@B^7&A33333333333333333333333333333333333333=>33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333336&:F`[JmcDZX8+=3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333338:33333333333333333345;%L34333333333333333333333333>DTLmy5#:333333333334AE_9-G336&K33336 >A>VQ{\PPXQ^RSiH33349'K5=333356=?_mJsUrU3333333333333333333333333333;$5S\bbbT^}O<$6333333|OT]ca}{RN;K333333333333|sLXWU3333cRCbjmolkibjWHU^^~O3333333333aPB`cca```iSD333333333333333333333333333333aTC\\\^bb```kVE3333333333333333333333333333333333333333333333333333333333G@=g~O`rKC9;3333333333;+8RcFlZjYfSdR]~ObRRgHGNA54333333335!7Se]nVV3333335 5IgPBRI3333333333333333333333333333336?7!B333333333333333333333333333333333333?7[6 =333333:.H@B\3333333333333333333333333333333333333333<>333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333336%:He`F_\E\Y5"83333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333346683333333333333333335::&M35333333333333333333337(=F^hEUi33333333333333=9T>=X<;KG`fCS[9.A33339)H3333333344ciRpTmR33333333333333333333333333WG?ZvmJ]cbbRWD?3333333353\^``][9"C333333333333yrLX[S74yQkrke`__wgI: 6[dxRSI4:3333333333aSBRRb`````I1:333333333333333333333333333333]NA[Wacd```W33333333333333333333333333333333333333333333333333333333337!5oUoURWD333333333333A==ZNXzN>2:HL@XsLbRUpK]QUrK3333CE?NhJVhLo^<8@;2933333333LrVIiS333333333333333333333333333333337!C333333333333333333333333333333333333^^ac^`XO6?333333333333yN\\\dffaccc~oKK4;33i\E]]^wT433333333333R]]]_```qMTA)7333333333333333333333333333333M;<~}Nbbdb]tN{OM6;3333333333333333333333333333333333333333333333333333333333nToUWbG333333333333>9?W??W3333333333333333333333333333333333333333:965333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333CTXIieBRV4 733333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333:?453333333333333333333347;+P:(K46333333333334AN[@KX36DNg5";333333337)@@IYD]gI`s??W333333;/O<1Q3333333333PmJ`V[T[jYRFMA5 433333333iQoU\lJ3333333333333333333343^QA\\\\^a\caG333333333333zmK^aca~N>+L47333333333333voK^dsi^P_aaW7 43374U]]]H39=944333333;$5]]]Ru`H`^uN^_T43333333333333333333333333333333I7;]``_bb_oL3333333333333333333333333333333333333333333333333333333333YiH]rLPXD333333333333BD?ZQSsL33333333337#543?:/W33:0HBPe4 93333333333333333333333333333333333333333<:333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333=@LDX\E^^5!8333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333334: B3333333333333333333333337"A>2U:+K5;333346AN]@KZ4733@C[9.G335";<:O@M^CVeCSb8.D7&B?<\4833:-I=5T343333333333TtLZQTuZZ_QkI]QY|N?:<433333[lJ`wMS[E33333333333333333353|yNVP\\\[YYXPB333333333333T^ccbokJ<)O33333333339!5dXDZ_th]]{N_`\\:"533sjIX|N\wmJ3333;7333333S@>V]]fXD33kKT____ubH33333333333333333333333333333364[_`ccca^5333333333333333333333333333333333333333333333333333333333]rKjS]qK333333333333@B>OoKGUC33333333333333GTD]d_m[\ZQZQZQ@>=33333333E[QDXO333333333333333333333333333333:#H6<333333349><"E7;333333333333333333333333<+Q8+GDUi90G3333333333333333333333333333333333333333338833333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333335#9FbcHgf7)=33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333698A333333333333333333333333347&D=5U>7X?@\E\qCPc8+E8*D9.GCNeDXm@I_EYlAM_<;P7)@333333=3R<3S:.J?>[48333333333333KcGOnJDK[>:>TpK]Q]QVpJ[zNB>=33fQjSS^F333333333333333364}O[[UT\ofHikJqyMu}OF6:333333333374WW^a^@,C8$F33333384`SBZ\bvhc\]WfXD\\\F19K8;[\\|vM:!5333363643333voK[P}vL>'73333{P_____N7<3333333333333333333333333333A,8[[]`cbccWD19333333333333333333333333333333333333333333333333333333ZlJhR[nJ333333333333GXDVQGXD3333333333336%8OuX_m[[ZQZQZQZQ=5:5 4333333JjXF_S33333333333333333333333333338@7 A333333333333338?;@33333333333333333333338*IGZw==S33333333333333333333333333333333333333333385333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333CT[E]a<=J3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333336;8#G353333333333333333333333336$=?DZDTk?C\<6Q>?XAJaF^s90G5#<33333333333349DNmDNm5:33333333333333RyNUUCLZ336"5OcGSnJ`QbRbRZsKoWlTUbG333333333333339!5leH[[[[R\NA33VXX9#53333333333YH@^ba_niI=-R3664VG?{xMYT[]rm_cWaRC53P>=\\\RA>P\\\YI@33333333953374Z\\S333333:!5Z___vMP=%633333333333333333333333333J9;[[[k\Eaacc]UkmKC1933333333333333333333333333333333333333333333333333P[EcQYpK333333333333FZELjI>=<3333333333:5?HdTNx^YXZQZQZQZQSsL7&6XOIXD5!533JjZBNL3333333333333333333333333334<#H33333333333333333368>A7:33333333333333337)@EZjEKm493333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333338-AE\aEZ_3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333369%I8#E4633333333333333336'@=7Z8&D33333333333333IbGOrW@ER333333;.8XrKbRVmJfSqZrZiSMPB9&63333333364QRR[[WE193343XXX433333333333zNabba<)CNESe^FwvM[[[[Pkpb`\I6:3333@*7|xMOSoiIVO\}O33333333337433^PB\\\_RB33333333P9<_ZyN^_yN33333333333333333333333333F4:V}PrsK:!5^X[``ZYWdeHF6;3333333333333333333333333333333333333333333333SbGfS\vM333333333333P|OQP8,83333335!6AKGMu[GdT;8@<2:TuLZQZQQmJ7'6K]FZQZQMfH?D?HdW>BG333333333333333333333333338>6:333333333333333333333378<=<<::55333333;6IG_k>CV5 ?:%M333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333DW_Gbh7*?333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333344333333333333333333335;:'K;+N9(H8&D7&B9*G;0L=8T?A[=;U8+E343333333333333333>BVAL^333333336&>>?VCOf:2L346 333333333333333333333333YPBYYT33hVD^^`b]Yt{NXXuOLC>543333333333333333333333333333333333333333KSBXpKP[E33333333336&6JkJJkI333333>CBIhRMwXCVL7)9RoKJZE6"57'67%63333@==UyNTxMS|NXYXlBOI333333333333333333333333331U7"B3333333333F]FNy^?EN33333333333333=19gSoXsZjS\pKoUoUjRZa_^^~SND>D6;<)743G:;XXuPG8;H:OQGaH34>DBF_LNyWGcO?FE33BC>ZQZQL`F333333333344@B=TPX^TfQRMsL;:<3333333333333333333333< B3333333333333333333333333333333334=>NCXaE[d90E33333333<$L59333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333BR^Gcj6&<33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333355<=333333333333333333333333333333333333333333333333333333333333;8NF]mF]m?EXBOa<;Q6$=33333333333348>.U6>33333333GbHQcBMS3333333333333333LUCcRbQ[nJ]pJoUoUuS_^a`_yWgvL}V}V}V~T``ZXXXu~OXaddcmqwwM[[[qmJzvMTE?9#B>+V3433R[[niI333333}{NY^V[yvL3333333333333333rlJ[[[C.8333333333333339 5Z__]rLfVD3333333333333333333333ggIw}OuxMUJ@3333Y___]63E5:hkJWnyMWWlyM}VrQQPBA3:433333333333333333333333333333RcGaQP`F3333333333ANCKuNJoMHhLN|UKtRCVI6&83344KbGUzMYP8(7333333333333335!5Nu[ViQPMtMO}PMzOANC;6<44333333333333559=33333333333333333333333333335!8<;JEZ`Faf?FS5":333333333357=$K33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333337*@DWc?FU333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333344=?8933333333333333333433333333333333333333333333333333334 9;8M>AUF]mF]mAN`333333333333333333335;<,S36333333CSDN|]DZZ3333333333333333GI@bR`Q337"5JG@lQ]a`Z`{WxVfsL}V}VxT}T]]VXXXpvL]ccdryZnkITplJUH@;$63333=+T9#E3333d]E{}O{}OgbG333333mjIbcaqmJ9!53333333333333354{zNR[}O333333333333333333ZF@_TQ^]C,833333333333333333333VYYNA>3333{lK__ZvMI4933337 4QK@qOWl{N}V}Vi{NxVvUW_FPRCC8;4333333333333333333333SmJZ~OEJ@33336%5>?=CRCX\Y^O~RN}RBQE8-:333333DMAVQS|NBF>33333333333333335!7Jkb>CI@F?EZEOQOQIkLN}RIjMEYI>AA4 4333333569;33333333333333333333336&:;5E@KRHffDX]DW]7*?3333333333333333;!E6:33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333<=OF`j7+A3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333379= B< B9@9A9!C;#H:#J;%M;&M:)O=,R;*N7#B35333333333333333333489.F>AWCQeDUf7*ABPbCSe8*B33333333333333333333336 A:&L333333=>>O\Jng3333333333333333<09SkIWxM5 433>)7XYZ\VesLlPuUfsL}V}VpPV``XXXX{QbdetxstOUI@=(733333333336<=,V473333_XDYYR333343SccbM=<3333333333333333\QB[W{zNH5:3333333333337; BoZRffea|O333333333333333333C19YYY743333L5;QRY^yN3333333333;'6WXDoPyTqRxVsSoSsUhOnTfPR[DOUCLNAB<=C===49=3:>5:<09_RaUTsKIXDRyNOqKQPQPVZVZ?E@7'7333333334 4OqKVQQvM433333333333333333<:FE\Z5$9333392:ALBJmMN}RGeLN|ULuSMwVKoSBQHAMG;9@@3F6&84 64534466%97+<;7C=?HDUVEYXJkdF^^Igd@IR8-@3333333333333333333357="F33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333EYfBR`33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333334658463333333333334::(I>3V=3U;/N;+J@/RB0TC3UB7XE<\HIgENf@G];:Q7*B3333336$<;7L333333333333333333333333:&M5;333391:MzSN|r36333333333333335 5]Q]Q@;<:$6}RnoKYYV?*73333337!5@09H>=H==QNA[[rXVcIT^H[mMtUak|tV33333333333333339&H<*Q333333K;$J: A34333374Y^]`aS8A:754333333333333LA>t~Nv~OrxM33333333R^^^W33333333333333337"5MI@]fH`kJsUsUbtLoUoU^tLjShRcQfSXqKbR`P\PhZaV]SPpJVQTOIdGKpNPWANE333333333333CRCOyMLkI><<333333333333333333CRUCRU3333333333337)8<>?F^KF`KNyWNyWIiRMwXGcRSqaGdTLt\GdVLr^HcWKp`GbYKnbF_ZJmcDWVAMR:2B4733333333333333333333333333>#G3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333335&=CTc==Q33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333335:=*PA0W9933333333335#;CRb7'>33333333333333333333335:;%K333334KrRRt9.E3333333333333333OcGL[E;/8u{OYYtyMVI8;3333338-8?D?@I@JnLMzOIiKe]eZb_N|UPtSmerov|tvmd__G`S>EG;9B4!633333333?1Y:&I3333337 4YT}P@-8]UCYY^WWWLA33333333333375R=?}OZ[QB>33333333:"E<#H453333333333`NB^^^UnbG3333333333333333joKXXXSC33333333vhI^^^^9!533333333333333333333337!5C8;HC>XcH`tLYjIjSfQdRfSWmJbRaQZOj]dYQlIDI@>:<5!533EZKHhN7+9333333333344O|NQPJhI3333333333333333338-?Iie8-@333333333333333333338+9<:?>CCCTJBQJPbYCWNKoZE^RJl[DYRF]WAIM?FL92@6#93333333333333333333333333333333333< B553333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333<9NF_m7'?333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333336;;$J48333333333333333333333333333333==PAM\353333333333333333333333=%N353333HgNOfBR]33333333333333333333^ZEXYYXF6:33:/8FUCPqKLpKQPJnKOQOQHhKjal`gfPbfunt~{iljR{^JnYKn\Lq]He[HcY>AH8,=5:?1X6>33333333kmJXYa^FxOVY\ZYstL333333333397:6QY}PmjI33333335<%L8 B3333333333333333UYzNX]VD?33333333333374WXXC2:33333333YG@^^^^TA>333333333333333333333333333333333333547$68&68&58'67#5>=HfIMtL<9<333333333333333333DV[ALT3333333333333333333333333333333344863333333333333333333333333333333333333333333333333333:>683333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333>AUBPa343333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333335<:$K343333333333333333333333333333333334BP]>DS3333333333333333333333:!E6;3333>EBN{[Mvs5"9333333333333337$6\{NoZx]]Y[YDIWDV}POoPX^XaP^UhRbKr`Ii^CY[dsor}oxqro^`[[[xuK4 68-<=>E@KKGbYHf[KmaHf]H^dEIf4733333333ijJY[^YzP}P`ZEYYW4333333377;9TH@YYYQD?333333;&N7@333333333333333333C-8W]]]T333333333333E7:r~Os~OxQ3333333333>&6YS|O|sL\L@3333333333333333448:;@?!DB#GC"GA!E? A;<66333333333333FSCVQKbG33333333@KGGdP<:>333333333333JmLOQHgJ333333333333333333:2DDY]7(=3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333:>673333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333@J]AL^33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333337;'N343333333333333333333333333333333333336&Y]^[[F4=<'6x}OuzNS?+7333333?>53lmJSY}P333333:&K8"D3333333333333333333333vkJ]]]]S@>3333333333jrKWVOG?333333333333~O]]]P3333333333338;?"FE%NB$K>!D;>8:899::<>?D!DF!F>>44333333I`GSzN@C>33333334KoUKnU3433333333337*7IkKOQ>A>333333333333333347CT\>BO333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333<@343333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333DVj=>T333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333;*O493333333333333333333333333333333333333333:3EDY`;7G3333333333333333336:: C333333IgRN|_E`f6&<3333333333@==lYz`virskt_rNweVfZfLiT;9D5!9353333333333\gH_^|WrQtvM[ZvuMjbF333333333333333333=4SDMdHd_Ga`EZ\7*>33C19bnpgQ?K?!C@"F^fceYM5533;:87XPBYWuzNF5:33337 @;)N333333333333333333333333>'6\]]Yh[E33333333;(7WWV:%6333333333333ujJ]]]V33333333; BB&NB&M< B6833333333333333333333;:B A?<446&6QPOyN4!4333333?EFJnW<@333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333335BMb:4K33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333337"A9&H33333333333333333333333333333333333333333333<;JEZ^<:H333333333333333335="G333333<=AGcQGd`BQZ3333337'69,8P`Gkdpurrox_h\_CJB5!5333333333333333343RUCpS``mPE5:Z[[[VI@333333333333333333=0S;-O35>@KDW[IggJOZv~hjc`msK333333^YEYW~T<<==G"E64UYYfeH333335>.T5:33333333333333333333333333yoKX{NT\P>=333333XXDoOlwMadH33333333333333dUD]]]\33338?B'QA'O:@34333333338:44333333333333333387@>BCANxMIeH33333346F_RHhT45333333333333KpNN}RCTE3333333333333333:5HDZd5#:33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333355;<333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333348DVj:2I3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333<.S363333333333333333333333333333333333333333333333=>KE\_?CM3333333333333333>"E33333345KnXJmZCU]?IQ>=*7~RqyMxQ:$6::@?[IJtrRVX;&633338$C=*L83333333333333333333333333339!5T\\\zN3333;'7{U}V|V:&633333333333333S@>]][U>%==%LB)T: B34333333773333349;33333333333333333333ToRPuP929333333AMJLt\;6@3333333333338-:JmPIhM8.93333333333333348CUa:2F33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333==33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333347CMd8,E333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333334:<-O33333333333333333333333333333333333333333333333333<:GF^^BQT45333333333333>!D453333339/<;6;JgTZtXaSxO^fbhsorjv`nZZQZQNdH333333333333339%6U^FkShOsUoSd|NoUoTVwzNU[P@>33333333333333333333>5W;-M335%L573333333345:;333333;>33333333333333333393:JoKRmQ97333390>Jk[AOK33333333333333@HCN|UKpQ3333333333333333<333333333367<?3333909JiIV^Wg^x^~T_Yddf~[W}ZXyMRpKEMA3333333333338$6NRB\oKoUoU^oK[gH8#5NPBiQ~YYYTd]F3333333333333333333333A;]=3S=+Beohz]itLWpUGY\_s~bWmwM333333TLAXX{S;:NC>XXU64333348?4X34333333333333333333333333333333=&6[\\XXI@@09wVpRdoJ9%6333333333333333333V]pr^OO333333333345<@33333333;@333333333333333333HdKN|R<;=;7744 6E[THeW5#733333333333333BRGHfNAOF3333333333333337DWg6'>333333333333333333333333333333333333333333333333333333333333333333333333333333333333333332;8753333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333334DOh:/H33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333<1R5 <3333333333333333333333333333333333333333333333333333336%:E\YGc\@IM5 633333333>B7+8HhJO}PMvP[jZiWeVpQpVs[zVivLsPbfH338'7FNAL_F333333@6;R`G]uLjSiSczNczND<=3333;+7pU`[YYH7;3333333333333333333333=4TPVfcniz[}VzUUQB5447CNVs~rgl{O;(733337 4xQmvL{U>*8adGnxMU`_F3333338%C<0P3333333333333333333333333333333333zNQ|yMWPewLxVwWPPE5:493533333333333333UsrcfZE333333347=;@3433333333;A33333333333333337,9HhMKqO4433<8BOOKo`90>3333333333333333MvVNyW:4=3333333333333393I@J]3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333334433333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333@D^:/I33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333?8Y363333333333333333333333333333333333333333333333333333333334AKOF^WJk^=BG5!73344ESGPgUM{OOQMxSTcNx]Lt\Lt\Ngkosk{XtR5333MbGZQZQ=4:JQBVoJcQfSZrKjS`xMA7:3333333333zY^^YonJ3333333333333333333333<+8auimt_iwMxTNH@33333333S`Up|tvbuU333333adHWZekHWWxR9"5333333;,K:+I3333333333333333333333333333333333D08X]dpnkf|kg~q?2WA4]@1Z>-V>-W=+T9$I6>46;&M=(R~yZqa\pgH347?:!E: B57333333333334: B3333333333333333GdMN|U<<>3333CLONk`;7B33333333333333336&8HfPKrT5!633333333333333?G\9/F3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333>:T;4O33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333@>^333333333333333333333333333333333333333333333333333333333333338,=BRQLq]HcVIkVImQNSRyWN_PFbM8/;Lr[Lt\Lt\Lt\MfSx_rrsoWeO3354GRBaVfZ[PbRbRXqJcQOXD=09333333333333SI@[]wXT:$63333333333333333338$6[gHrUcxrmv]Y^F9$63333333333:%6x\uur{HW]6'>33B29WYXVWdjI3333339(E>4U7$@33333333333333333333333333333333347&Blzxrlg@4I6!@6 >6<6=6!A9$G:%K8!C:%J?,Y?,Yd[d}P}zNzwL_VL9#I5:33333333333333336;6;33333333333333:4=HgOFaK3334APRHg`Ba@9Z3333333333333333333333333333358*GA?`@:[]cknh`^Y_F333333333333333333;&L?,Y?,Y_Ve^[ixx[333333333333333333339"F3333333333333333HfONyW:2<5#9CWXG`];7D82333333333333333333>BCMwXE[M333333333333337&?@D[3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333338'BCGd35333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333CHe36333333333333333333333333333333333333333333333333333333333333337,:JlRJoSMxTN|XIpYXoUiViOtZSxXNiQN}RQXhqkfm^^VV^[hZh[`WT_W[T6#533333333333333333333bbFVX_|ZJPA333333333333C<7T333333333333333333lPxVxVLMF:4K=>VQaewx}}hl?;Y?<[?:[7%B>6WB>a<1Q5:3333333333333333333333348+FBB`A@_@<]9*H67Z]_]f`F3333333333333333335:>*U?,YYNS[keP3333333333333333335>7 B33333333333333@IFKqU@KF;9HGbaCTW8+>3383333333333333333333@IHJlV>EE333333333333339.H<7P33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333335A@]7$?333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333AD`5 :333333333333333333333333333333333333333333333333333333333333>BCHePLuULtU;=>CRPIj]IiYAPL<9?=?@CUHBQEHeKYXiqjlo]MkJBG@CMDGbSJkWP_W^OxQ<9<333333333333333333XRCXvO|Q[fS[zM333343>5:SaG`OcOjS`yNmTd|OGCF@7]37>;X@>[353333333333333333D9K45333373333333333333333333CRKMu[?EF33333333333333:1K:/H33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333=3R:-K333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333>>X7(B3333333333333333333333333333333333333333333333333333333334?GFLuWMwXCUJ7,;E[WF`XIg\7,<333333333333XbEc\lne`333333338-19hRkSa\[[hbG33333333333333333333=(RME_{f{}^wzckk_;+L;-N;0P>6W<3P8)D465;;*N3433333333333391CN{hSwGdd@HS5!83333333343333333333333333333@IHHdU;9A33333333333333:1L8+E333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333337'C>7W333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333<7Q:3L33333333333333333333333333333333333333333333333333333333E\PMu[GbQAJF4!7BPRKnbCTS5!7333333333333=,8sUqXilNo[8.>3333333333LrMUYW`IfPNyWIjOMyTGdKHfKDXFIcHfR{]|\z^iU[QgZiZcVUnJbR^O\vMR`GA8;6";6"?6#@5">>5V9)H336%@@A]=:V3333333333333333336 4kQsUlQB7;=+8xV\[xVQOA333333333333336 ==/S<+O5:33333346@A[AHb@D`9+F3333339(7XlIfPn[jmP[[QuwL54333333333333333333;(ONJzg^[V333333335!<;2ODIkCGk<:S<5N;5L:6M<BVAL]F_jPzOpAOR4733333333333333333333333333333333CSMLt\<;B33333333333333:.J8*E3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333335@9[6#@3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333:/H>@X333333333333333333333333333333333333333333333333333345G`SF_QLqY:2>46DVVJmc?HM3433333333333333PRCsUsUiZKp`If[4633333333?I@IjJIiJ7*9?ECDXILsRJoMN}RKoKh\t]hZw\o\PrKZQgZhY_RGMAFF?<09499&I;*M8'G8&E8'F:-LGOuBEd;3O6$>AEaCIf49333333333333333333A4:`pKjRjRNMAtT{W{WbsKlQ8$633333333333333338$D=.U:'K4:6&?BG`AF`AE_4 :333333:*7bPfT_iVLGD54yyNtvLXY_WD333333333333333389-87&6HSBRnJHTC33338!C7#G36333333335;@<^5!=7)C>=VCLfCNh?=W33333333333333333333PSCoUoUrVmQfzNSWCsUsUaqK333333333333333333347!B@9_GKsGRs@?^4:353435?4?_vVcu[j^HJA3333WLAYYYW:#53333333333337<9#C>;XC.Tg[[W33335!=>9W8'D33333333333333335!7DXSIhY?FH33333333333333333333333333333333333333AMLLr^<;C333333333333335 <<0O333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333334?6Y6!>3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333@I^<9P333333333333333333333333333333333333333333333333EZRLr^DXQ6%833>DNE\\BNS3333333333333333337"5oUnTfO<,834F\XHe]>CJ3333338,8KqLHhJ8-833333333JA>mzMWW~U@/9333333CF?ZQSrL339 C6=3333333333335"=@:[4833337*CKhH`x8)B33333333333333333333YeH\oJ}^|\iP54g}OpSavLF?=333333333333333333:0IERjCNg?:Y9"E;#H=#J="IH@Ob~[dWZvLB;<33333343RYYY[SC333333333334;@;1K9.I<%FmSR}}O338(C?=Y4933333333333333338+=DXUJm^;8C3333333333333333333333333333333333333333>CHF_V94@3333333333333334>5U3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333338%C=0T33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333337*BEWk4 833333333333333333333333333333333333333333333AMNF^UHeX5!7338,>HdbDVY34333333333333333333E==oUoUhQ33335!7E\YJmc;7E333333MyQN}R>A@333333LE?|V|VdlJVH;<33333333=6;TwMNiH8>7<333333333333337&BBAc483333339-FIdzKk4!;33333333333333333333^uLz\|\hQ43=,8]oJoUmT@3:33333333333333=48@C]4746mbYV7&@??Z483333333333333333>CKF\YIf]7*<333333333333333333333333333333333333333333AMNKp`:4A33333333333333339+K6!=333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333<-P9%F3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333?H\?FY333333333333333333333333333333333333333333:4@Jl^Ij]5$83335F_aDZ^5"833333333333333333333KI@iQoUZgI3333336&:DVVIic;6D3333KpNN}R@KB3333C7;}V}V}V|VE8;33333333336$6VQUQ;$C33333333333333337%@AA_5 ;33333334BG`G]rHix5":333333333333333333IF?z\x\kVYpK6 4IF?oUjR[mJ8$63333333333;8NBPeDVj:3K333333<3:SrLSoJ]QRjI5433333333333333^XDVYYkmK33333333:<<8Q;3M3333cnZ[@F_4!;33333333333333:3BG`]F^[AJP4633333333333333333333333333333333333333333333@JME]X6(;333333333333333349:+N33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333348=/U5;333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333337+ACUe8-D333333333333333333333333333333333333336%9Jl`GbZ8.>3333<=KDY^:5E3333333333333333333333\qKfQ_wMD=<333333337(uUerK}V}VWVD33333333333343VQXV8&:33333333333333335#>@?]6">333333335";DOgJh{G_o6%<3333333333333333RWDnTw\hT_}NTiI7$6MNA`xMjSa{N7"5333333<;QEYlBPe:4J33335!5GVDQpKZQUxMDF?333333333333333333D3:YYYYI;<333333;+E@G^363333Ymf~r9.G333333333346;9HCSXHgcAOS7)<333333333333333333333333333333333333333333333333F]XKnb46333333333333333333:(I6=3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333336==,T3733333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333?DWBQ`47333333333333333333333333333333333333ANQGc\>@H333346DX^CT[333333333333333333333333gRjSjS9'633333333336%:GbaE[]=MlJVQPrLOfH9+83333333333333333333333b`GYYszNntL33334 8ANb7*B333333QX}xsu3333335!9:3F@JUHdfCW\>EP7(<3333333333333333333333333333333333333333333333333333E\YCVU3333333333333333333334:(M473333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333335><)R483333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333334 8DXe?FV333333333333333333333333333333333390@JmcDVV333333<;KGch7)?33333333333333333333338$6hRjSfQ333333333333335!8CU[FbcJoaIkSWwPdvLxVxVxVOMA333333333333333333NuMU}W9.9333333333333333334@B_:1L333333333333?E[DVjE_nDZe>ES463333333333b|NjSXiI33GI@aQTlI[PCD>NUCbPfSZrL92DF]mF]m<>S44?E@HdHQPKoKPrL><<3333333333333333333333333364nrKntLXX^\E46AN_;8N33333348[hxru>:Q@GXBQ^CWaCT^@HU8.A353333333333333333333333333333333333333333333333333333335$9JmcCSU333333333333333333333346:%K383333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333336>;(P5;3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333338,BF`j<=_~O\wMPYD333333333333333334<CV5!;:/I=;UAE^AE]~zw{syNMm@=U80E5#;33333333333333333333333333333333333333333333333333333333333333:5DGb^;7D333333333333333333333333349"G7A34333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333348<%M:!D343333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333;:KGcj<9J3333333333333333333333333333:5DGb^?DL3333337+@E[d91E333333333333333333333333KPBfSfSKPB333333333333333333B8;a]eyi|nsgR:'63333333333333333333333KrMP~R7)7333333333333333333??YBHb333333333333336$BN8,>5 5_}O`OFE>3333337$6M^FUyMZQPoJOgHbzb~]LsRN}RKrOGcI<<=33333333333333333333333333333333333333_^FX^mpjs@=W=8U9,G5"<34;->~|pYmqL:?E&P<@3333333333333333333333333333333333333333333333333333333333333333@HPIhb6%:33333333333333333333333333335:9!C: B8<6967:;66333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333338A>%K:B4633333333333455443333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333=?OGch=@N33333333333333333333333333F]^Gca34333333@HWDWc33333333333333333333333333Q]FfSfSD?=3333333333333333T]EoUl^bcjlaqF\c5#:3333333333333333333333GeJHgK4 4333333333333333333;2KAF_5 9333333333333337(A@K^F]mCSd5#:=>KDWZF]]JkcdidcL`O80?7+<7*;7):92>FXHYZV[^s_tax_h__IeH8,933333333333333333333333333333333333333333343m^bpr{kn|S6433338-BIchrfvO|Q_[E3357D$JB$K79333333333333333333333333333333333333333333333333333333333345HecBRV33333333333333333333333333333333333356786733333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333337<"F>!E> C=B?A<>::;;;::954333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333=AOFacAMV4 7333333333333333333337*=DY\>BL33333334DUc;:M33333333333333333333333333QbGXtLZvL7%5333333333333B9;`zN]rLoUk`hhNhN5#:BQ_DUc6$;33333333333333333344N}RMyQ333333333333333333338+DDPh9.H33333333333333338,CE[kBQbDUe6$<337(BPF`hFJOXXWZLI>A> B> BB$KM,YK*WD'P9A4533333333333333333333333333333333333333333333333333:5EEZ];5D33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333337443333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333==KEZ^F_a7)=333333333333333333=?LIgg6%;3333336'>DUd6%=33333333333333333333333333[yMbRaQ33333333338&6OWDjSjSgRbxMa[MqW=>B3347AO^BPa4833333333333333335%6IjNCWG3333333333333333333336AG_?BY3333333333333333336)@EYiF_mCUe7)?3344bRaRDHC8.=:6A=?E<;C=>D93>91>AQ\CU`MukMuNKqLWW^\^]SRH_G6$53333333333333333333333333333337+>AMUF`cALZ>4UA2;~UWpPta^kDX`6*>QG@X[_OAA33333333339:@ EI'QA(Q9!D343333333333333333333333333333333333333333333333CX\Gab4533333333333333333333333333333333333333333333333333496%@8(C7(C8%B6#?5:343333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333:2CCUZIhe>BL4633333333333333E[`BPX33333333;8LEYh3433333333333333333333333333^ObR^O33333354R_FeRcQc~NjShRFA=E[OMu[==B333347APa?FX3333333333333333<:>N|UDVH3333333333333333333333@D\CNe473333333333333333338,CDXgCSbF_k:2G33aQbRED>333333333333=?PFajFaj7.B33;6;DYEO{QY[[^]bTZPV@ID;5>6%7453333333333456(;;7C@IPDVXGdbCV[9/B:'L3533E;>h\noruvi_gI43`_F[\X>+83333333333333367D"FB$L<&N48333333333333333333333333333333333333333333;7GGad:5E333333333333333333333333333333333333333333335#<:2K@B[AF`@B]>;W<5Q;1O;0N<0O<1Q>3W=.R9%F483333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333336$:CTXF`^Gc_;6C333333333348DX_=>L33333333BQc<;P3333333333333333333333333333VtLWvLObG339(7NZE_P\wLfSfSVhHT`G8$633CTMHcT8-<3333336%=BSe91H33333333333333?FCHfN;9=33333333333333333333339-EDTi;7N333333333333333333336&>F\hG`lCTb?HWRkKY|NCD?333333333390DBT`F^hBQ^333333333391:HcJTXY`[dV`U`O]JkWJlYE\RIiYE]UGdZKnbF_ZJmcEZY>DL8-@338 C6 =:3B@INHgbSveth{Z}VnOUWD[WEptPmtLovM33333333333333333333@?C"H<(P6<3333333333333333333333333333333333333335BR[BQZ333333333333333333333333333333333333333335:3J@G\BNd@C[:0I5"<3433333333333333477#B;*O9%J46333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333=>IDXXJmcDXV==G3433339/CHdi8-A3333336&>CQd5$<3333333333333333333333333333]Q]QWwLL[EUmJbRbRVkIfSUfH<-8333333IhWLt\6&933333333;6MAMb48333333333333HdONyW6%7333333333333333333333346BNd@H]34333333333333333333336%=AM\E\fFajYo\ZIQB333333335 8E]fGcjBQ]6$;3333333333333333;8;E_GSXRYS^T_Q_LuYIkXDYQBRP?FK93@6':5"77(9:5@?GLFRaJlaGb\E[Y?DM4"8G;@UEYl90H333333333333333333333347AM[FajPyhYwLk\343333337*@E]fGcj;9J33333333333333333333335"5<;=HeKJqOMyTMwSMuUKoSMwXIjSMu[HeTLt\HdWLr^KfdEW[AKO8,=33333333B3:gwMxVyW`\W`bG333333333333333333333333?>9@=-U35333333333333333333333333333333337+@Gcj<=N3333333333333333333333333333333333337)@AK\F]l;9N47333333333333333333333333333333333333:$I6>333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333336&:@IMHf[Ko`HeXOnMzp?DF8-;4559BMb7(A333333333333333333337(7<9;H[EPqLRuLh\h\_S]QZOCB>7$633333333333333Kn\Lr^3333333333337)ADOg3533333333:4=LtVBMH333333333333333333333333336%>AL`AOa3433333333333333333333333393FSr^{Vq46<:KBR^CT_=>N5"9=>O33333333333333333333333333333333:2;<:>BPGANFE[MBRJF\P@LIBPL==C:5@;'E3333333333333333?/9oR|X[`_WYE33333333333333333333333344A>9%G;+O3333333333333333333333333333335 9EZe@IW343333333333333333333333333333333333>AQCUaBQ_5":333333333333333333333333333333333333333333;#H48333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333345:6BF\SQvRvLt\HfUMuZKnhNun@JEANF=@A>DB==?<>>?D@>E?E[FHeIMsLQPLnJVQVQOmJi]i\V|N@<<43333333333333333333GaWDZS33333333333333@B[:0I33333333DXNIlV6'83333333333333333333333333333@GZF]m;7L33333333333333333333333333CJGXqNoS?ETGcjGcjGcjGcjAMZ33333333333333333333333333333333333333333333333333333333: B3333333333333333338"5k~N^]\qSE>=333333333333333333333333=:64<0T6"A3333333333333333333333333346CR`AO]5!93333333333333333333333333333333335BQ]BT`<=N333333333333333333333333333333333333333333333334<#H3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333@MZE[^ALJHeTNzeP~xMx[GcONyWIkQN|UN|UIlMN}RIjLOQOQJlJQPMrKTOOoKDOAVORtKENA333333333333333333335!7Kp`GaX333333333333339-G??Y33333346GcSE]O3333333333333333333333333333336$<@M^F\k6&>3333333333333333333333339+8UQUUHfkGcjGcjGcjGcjGcj7*?333333333333333333333333333333333333333333333333333333;A33333333333333333333epK[`^_pKoUZgI8#53333333333333333333375;87"@>2U33333333333333333333333346AM_BP`6%=333333333333333333333333333333335$:DX`CU`92E333333333333333333333333333333333333333333333333337<8<33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333@IZ>AS3347AI_>?N>CC?DBEZKCVIJmPLtSFbJLvPF^HIiJF`H?E>?B>90933335 4VQVQEPB333333333333333333336(;F`Y?HL3333333333333346@B^493333@HHLt\;6@33333333333333333333333333333333=933>5X6"?333333333333333333334 9BOaAM_6$<33333333333333333333333333333333:3EE]aDX`8+@333333333333333333333333333333333333333333333333333333:W<5P333333333333333333333333333333333343VQVQFTC33333333333333333333<8DKnb?FL3333333333333333=7S8+E3345HdWDWP333333333333333333333333333333333334?GXG`l@HY333333333333333333333333COAQUQsGcjGcjGcjGcjGcj7*?333333333333333333333333333333333333333333333333333333:=333333333333333333<*7kOfsKoOLH?_sLoUfPfQjSYjI8$63333333333333333<733:,K;/O3333333333333333337+CCTg?FY5!:3333333333333333333333333333334"8BPWE[^EX^6#:33333333333333333333333333333333333333333333333333333333; A33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333334478786633333333333333333333333333333333=@U>FZ>CJE\Y8.?33333333333333338+F;3O33=BGJl[:5@3333333333333333333333333333333333336#;EYfBSa?FU3333333333333333333333<8;QPPeGcjGcjGcjGcjAMZ6&=DYc8-A3333333333333333333333333333333333333333333333333344:;3333333333333333WZExVxVpR4333JI@XgHjSjSeP_~OMTC7#6333333333333<8335`3433333333333348=;SDTi:4K34333333333333333333333333333345=>IIgdDZ]@GQ3333333333333333333333333333333333333333333333333333333333338=453333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333344<:>>;=9;9;;>?!E=!C6833333333333333333333333333>C[HZx8)D3333333333333333333333333333333333333333P}OQPDUD33333333333333333333F]ZJkb4533333333333333335!<=7V6&9Kn_CSQ33333333333333333333333333333333333333336(?F`jFaj=?P3333333333333333333333HfJNQ@JPBR^CT_==N35DVaGcjGcj;8J33333333333333333333333333333333333333333333333333563333333333333333qRxVxV^gI3333339'6VdHjSWjIfSfS\xMKTC9)733333333:63333@;\7#?3333333335:/IAG`@C[4!;333333333333333333333333333334<;FHd`G`^EZ\8,>333333333333333333333333333333333333333333333333333333333333339:5633333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333376;93333333333333345PoQ\AOC33333333<=MGbiCS_FajCS`6%<33333333333333333333333333333333333333333333333333333333333333=.8dvMlOxVC7;3333333333=/9UfHfSfSVmJbRbRM[E?:<43645333338)F8'E343359:/K@@[??Y8)C333333333333333333333333333346?DJE\YJmcDXY=>I3333333333333333333333333333333333333333333333333333333333333333339;3433333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333335466333333333333333333337<>%K463333333333358#C=.QQ353333333333333333333333333333333333333333333333333333333333YcGsUpTYbG3333333333333333?4:Q^F]~ObRbRVtK]Q[PKNB=6:4446A?`BAc=5T9,H?>[<4O6$?333333333333333333333333334594@DVRF_XKnbF\X@HN4 733333333333333333333333333333333333333333333333333333333333333333333<<3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333359=&M353333359$G<+P8$E48333334BKc6%?3333333333333333333333333333333333333333BQCOQLvN333333333333333333F]^F]^34333333333333333333<EM333333333333333333333333333333333333333333333333337*?F^eHdiCS\90B3333333335DW]F_cBS\E_MKtP@JC333333333334==OAN\G`lG`lAL]9.E3333333333333333333333333333333333333333333333333333338#5qTsUsUPPB333333333333333333338'6JQBRdG]Q]QWtL[Q[_TwbLfZMclFPgBB_353333333333333333333333335 68.;>BFBQMKp]HdXKp`GbY?EK5!7333333333333333333333333333333333333333333333333333333333333333333333333::33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333337?:#G346=:&M5>333333333333>=V;2K3333333333333333333333333333333333333333;;CS\F_bHeg<9H3333338,@HdfHeg90B5"5KqQNzU7)83333333333336#;AK[DVeE\jF_m?GZ7(@33333333333333333333333333333333333333333333333333GC>buLqTpS6 433333333333333333333333333=6;M[NSe[]t\nQq_UYXfRylR\KnJGaHEZF>F@?GA<>?<BA<=W3333333333333333333333333333466:593533338.9N}RN}R8+833333333333333AOVHee5!83333333333333333=>KGdb>CM=0T333333333333333333333333333333333333333333333333333333335!8DV]Gce7*>?DPG`cG_c>BO7*><9I3333@HCHgNCUI33333333333333337)@CRcF]lBSdF]m@G[7*B3333333333333333333333333333333333333333333333fPoUbyNLJ@333333333333333333333333335<<.Q?2U:*H<3>EMAGXDUPUPPzaSbJlJOQOQIjLN}RIkMN|UN|UJmRNyWGdOMwXHeQMu[FaQBOK;8A34333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333359;%L@+X6<333333333333333348AE`4:3333333333333333333345:>;?9>6<7>9!C9#H8"D35N|RMyQ;6<3333333333338+?Gbe<=K3333333333333346@HSGbc;8F35<,Q3333333333333333333333333333333333333333333333333333333333347*??DPHfgHfgHfgHfg>BO33333333IjQNyW;6>3333333333333333336)ABPbF]mAMaEYl@J^=;R6#<33333333333333333333333333333333333333IF?oUoUmT:(7333333333333333333333335:(L>/V7#B3333333333337'6@DNGY]@H@GcIIjKF^HLsOF`ILuSKpQDYJF_M?GD>AC8.:4533333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333337>=&N5836<&N353333333333333333<6Q;2M333333333333333333789;333333333333334::(KG\YKrRCRG333333333333AMXCV]473333333333338-ACU^DY^7)>336 =9&H33333333333333333333333333333333333333333333333333333333333333GadHfgHfgHfgHfgF^b333333338,:F`NLqV7(9333333333333333333337)A>BXEXkALaDVjBNc@D\9-F3333333333333333333333333333333333WfHawMoUV`G33333333333333333333336<=+S8$F3433333333333333335 ;#G33333333333333335 :AA]4733333333333333333333333333333333333333EWSQ|lG_S3333333333;7IGag;6H33333333336'>?GVE\e>BQ3533338$G5<33333333333333333333333333333333333333333333333333333333333333GadHfgHfgHfgHfgF_b3333333333>@BJoUF]P4 63333333333333333333333478-E@F\AI`ERjBIaBIb:1J3433333333333333333333333333FA>jSjSXgH9%6333333333333333333335;<)Q5:3333333333333333333335@9\35333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333337;="H3333333333<#H583333333333333333;1M;1N33333333333333333333333333333333333333=?@GdQG]\=3T8(E37336&=Gbi>DS3333335 9:4J@L[CTa>CS6$;33333334;(O3333333333333333333333333333333333333333333333333333333333333333?DPHfgHfgHfgHfg>BO333333333333?FEMu[DXO453333333333333333333333333347;4M?AZDPh@E^BHb9,F333333333333333333333333dOjSjSS]F3333333333333333333359<'P47333333333333333333333333?7[4833333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333344>"I34333333333358<"F333333333333333335>8W7%B333333333333333333333333333333333333<:?NyWJlR468)G>7U?@\IjyG^n;6N<6O@AXBK`CTf?GY:4I4833333333336?7 A33333333333333333333333333333333333333333333333333333333333333<:J7*>?DPG`cG_c>BO33==K=?L3333333333>BELr[F^R6&93333333333333333333333333333338*C=6W4:3333333333333333333333333333333333:3@EGcVJl[7(:333333333333333333333333333333337'A?>YCJf?>[9*F33333333333333>4:eSfSbQ>393333333333333333338>>%K463333333333333333333333333333?2X47333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333345>!D3333333333333333;A583333333333333333336">>4V473333333333333333333333333333333391@K33333333338.=E\TJl^8,<33333333333333333333333333333333339,GCGdAD`:-I333333333343SeHdRfSUgH3333333333333333339@<"E34333333333333333333333333333333?1Y343333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333;>6833333333333333338<9<333333333333333333337#@=/S3633333333333333333333333333444392?;YCEd:/K33333333ReHbRWpJVkI5433333333333333337;.V333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333?A3333333333333333337:9;33333333333333333333336 ==-S5;333333333333333333333344<;3390?33333345< C7;33333333333333333333333333333333333333333333333333333333333348CU_CT_F]d7'=3333333333333333<!G33333333333333333333333333333333335;;)N333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333>A333333333333333333798:33333333333333333333333348:(M8#F3533333333333333339:<<3333<;AMu[E\P33;8OAK_3433333333333333;=3344;?; A453333333333333333333333333333333333333333333333333333333333335 9@LYGcjF_g5$;33333333333333333333AMREZYHd^5"833333333337)=333333333333333333<@6833333333333333333333333333333333337!C8#D333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333>?333333333333333333<>5733333333333333333333333333336?;&M8"E6:333333349<=@77333333==CHhV?EF33@F\:6M33439797655577:33333333333333333333333333333333333334?7XITb\[]Q]Q@;;33333333333333333378=@333333333333333333333333333333333333:%L5:333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333>=333333333333333333=?3333333333333333333333333333333333599 B:!E<"F< D;A693333333333CRMLt\>AE48BMc5#<333333437699995657:;3333333333333333333333333333333333333333333333333333333333333333;7KF^jBS`CS`5":333333333333333333333333337)@H333333333333ANSF]^33333333333333333333333333333333333333FSE[pSrk[SFK@33333333333333333368A ?33333333333333333343833333333333333335<'P33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333<;333333333333333355<<3333333333333333333333333333333333333333333333333333333333DXQF`U6*:7)CBIa33333333333333333333>>3333333333333333333333333333333333333333333333333333333333335!9@H[CRbG`l>@R34333333333333333333333333333333@GLKnbGaZ5#733333333337'<333333333333333333333333333333333333333333333333333333333345Lq]Kn\34<5N>=W33333333333333333333>=3333333333333333333333333333333333333333333333333333333334;7MAN`F_mDUe8+B333333333333333333333333333333333334DWTIj]DWS333333333333?HQBOW3333333333333333333333333333338(7PqLVQLfHXOCDQ>4X6!>33333333333388=<66333363753333333343;732333333333333333336>&M3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333557633333333333388663333333333333333333333333333333333333333333333333333333333:3@HeZ@IK33<5O;3M33333333333333333333<<33333333333333333333333333333333333333333333333333333380GAL`DXiF\l;;O4733333333333333333333333333333333333333;8CKp`Jm_7+;33333333337(=Hcf6&<33333333333333333333333333?D?LrLRzNVQPqK5"534@6[<-P33333333648744333333333364<8753365;733333333333333333333=$I5933333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333374333333333333;8333333333333333333333333333333333333333333333333333333333333APOKp`;7B33;5O9.I333333333333333333339833333333333333333333333333333333333333333333333347:2JCOdBMbEYl=?T6%=33333333333333333333333333333333333333333333CTQGdWF^T333333333333CR\>@O33333333333333333333337)7DYEQPQPIcGGWD4433337$BA6^6<3333333333333333333333333286A3333333333;:KANZ3333333333333333336$6APCO~QN|PLoKMuM<8;3333333334=/U:(J33333333333333333333333333334476333333333333333346>"F8=333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333=>HIh^?CJ3333;1M9,H33333333333333333375333333333333333333333333333333333333335!<:/J=7QCJdAG`DOh??W:/H36333333333333333333333333333333333333335433333333333333DWQ;9B5$87(:333333336)>CUa34333333333333:4B>443333333333339'J>/U333333333333333333333333333397?;87333333333355;?>!D5733333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333345Hf`Ga]4533339+H:.K33333333333333333333333333333333333333333333333333335"==5R@=ZCHeAFb@B]?>X8,F4933333333333333333333333333333333333333333333;;4333333333333334DUPLr^Lr^IgX8,<333346DYd4#:33333390;@HDJnPN|UHfLN}RMyQ>D?5"533333333333333335<@2\5<333333333333333333333343:7533344:9<<<<=?> A<?563333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333=>IE[Y>AJ3333337&C;0N3333333333333333333333333333333333333333333333339(E>5VB@b@?\;2N8*E4:333333333333333333333333333333333333333333333333333333;;333333333333@IJLr^Lr^Lr^Lr^IjZ333344F_h?EL=@CF]NIiRMwVNyWGfNN|UD[I>C@453333333333333333333333=,T8#E3333333333333333333343633333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333334 6He`Gb^343333335;>3T333333333333333333333333333333333333333333336 =?8Z?:[<2Q7$A33333333333333333333333333333333333333333333333333333333333333<>333333333333HdWLr^Lr^Lr^Lr^Lr^8-<<;BLt\QxOhIiUMwXMwXHePHeO=?@6&733333333333333333333333333339$F7!@333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333BOUF__90@3333333334?6Y3333333333333333333333333333333333333333349)IA:_;0O4:333333333333333333333333333333333333333333333333333333333333333333:=453333333333G`ULr^Lr^Lr^Lr^Lr^7):;8ALr\MyqIm^BQK>AC:2=3433333333333333333333333333333333336?9$G5:33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333:3DDY\BOU333333333333@0R>#E@?@ B@ BA!D=@7833333333333333333333333347<-P@6[6"?33333333333333333333333333333333333333333333333333333333333333333333338:683333333333<;CLr^Lr^Lr^Lr^F]T333333?H\6(@33333333333333333333333333333333333333337!A@/[@/[?.Z5933333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333336#:F]`F]`353333333297=;=&G9&F3333333368> CB#I:>34333333333333333348=.T=/S37333333333333333333333333333333333333333333333333333333333333333333333333569=33333333349.=<#G:@69463546485<=.W;*N333333333333333333333333333333333333333333333333333333333333333333333333333333< B33333333ALKLr^ANL33333333333348AI`33333333333333333333333333333333333333336>8"E@/[@/[@/[7 A>,V7!B3533333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333334CT]CV^9/B3333333385433333338&H6 >333333333333333368: B=#I>%N>'P>'Q<(QC7iB6h=,V<+R<*N8#C3633333333333333333333333333333333333333333333333333333333333333333333336<=*S=+V=)T8!D3433333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333346BQ\BU^:2E33334373:5953333333348:&K3333333333333333333333333333:&J;'N34476=9%G>0W?3Y;,N7!?33333333333333333333333333333333333333333333333333333333333333333359: B3334F_WIi\CTP45333333333333=9S8)C333333333333333333333333333333333346;&M?-Z9$H3533333333335;:$K>,Y<&N5:333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333334 8BP^CWa91E333363623264953333333333;'N333333333333333333333333336><*S4633333333336<<,N>5Y=3U5 ;3333333333333333333333333333333333333333333333333333333333333333;#G46=@GJl^Kp`91?33333333333348?@Z343333333333333333333333333333333347<(Q=*V6?3333333333333333335;>(S>(Q8 A33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333336(@DTcCS`7*@33333333333333634333333333:$J34333333333333333333333334=)S5=33333333333333335;<0QA=`9+I3433333333333333333333333333333333333333333333333333333333333347A:WKmaG_Y=@G33333333333333;3N8+E3333333333333333333333333333333346>(Q=(R5:333333333333333333333333<$H?'Q;"G3333333333333333333333333333333333333333333333333333333333333333333333YDY~̙pYDY333333333333333333333333333333333333YDY̥~M6M33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333fSf~fSfYDY3333333333333333333333333333@'@fSf~fSfM6M3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333@'@fSf~fSfM6M333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333M6MfSf~fSf@'@33333333333333333333333333333333333333@'@fSf~fSfM6M3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333347<=QDYh@JZ5!93333333333333333338333333333:"G3533333333333333333333339 C:$J33333333333333333333338(EB?b=3S4833333333333333333333333333333333333333333333333333333333337';EW]NjqDVU333333333333335"==8U3333333333333333333333333333333335?(P>'P5833333333333333333333333333338@@'Q<#G33333333333333333333333333333333333333333333333333333333333333YDY岨fSf33333333333333333333333333pfSf333333333333333333333333fSf3333333333333333333333333333333333333333333333YDY333333333333333333@'@~奚fSf333333333333~333333333333333333333333333333333333333333@'@33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333M6MٙM6M33333333333333333333333333@'@~奚fSf333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333334;7NBOaBPb:4J33333333333333333333333333333333:"G343333333333333333333335?(R453333333333333333333333335!_>9X6#>3333333333333333333333333333333333333333333333333333335!7Hd^JmcCPZ<+P37333333333346=6V5933333333333333333333333333333333=%M?'P59333333333333333333333333333333338>A&P; C33333333333333333333333333333333333333333333333333333333M6Mp333333333333333333@'@3333333333333333333333fSf333333333333333333333333333333333333333333@'@fSf3333333333333333噌33333333@'@YDY3333333333333333333333@'@33333333333333YDY3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333@'@sas33333333333333333333噌33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333336%>BNc@K_:4J353333333333333333333333333333333333;#G33333333333333333333339 B:!E333333333333333333333333333348@=[@>\7%@333333333333333333333333333333333333333333333333335 7EZZDZYGa]5!74:<+Q9&G35333335<1Q6">33333333333333333333333333333333:!C@(Q6;3333333333333333333333333333333333339?B'P7;3333333333333333333333333333333333333333333333333333sasYDY333333333333@'@33333333333333333333fSf333333333333333333333333333333333333333333fSf333333333333@'@3333333333M6M@'@333333333333333333YDYM6M33333333333333@'@33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333YDY3333333333333333@'@33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333:2KDOg;7N3533333333333333333333333333333333333333<"F3333333333333333333333?&M4733333333333333333333333333333336@?\AD`5!<333333333333333333333333333333333333333333333346CRVJkdG`]4 73333338$D>1U8&D>2V8%D6!>3333333333333333333333333333333358A'Q9A3333333333333333333333333333333333333333#H?%K33333333333333333333333333333333333333333333@$K=!E3333333333333333333333333333333333333333333333pYDY333333333333333333@'@pfSf3333333333M6M33333333333333fSffSf3333333333333333fSf3333333333333333333333333333333333333333p33333333333333333333333333@'@3333333333333333M6M33333333333333p33333333333333333333333333333333YDY333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333@'@p333333333333333333fSf33333333333333@'@3333333333333333M6M3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333=8T>=W47333333333333333333333333333333333333333333<@45333333333333333333338=; B3333333333333333333333333333333333336#>@D^@A[343333333333333333333333333333333333333391BG`bEZ\E[\6$93333333333333348;,N473333333333333333333333333333333369B(Q693333333333333333333333333333333333333333333368D&N68333333333333333333333333333333333333333333M6Msas3333333333333333333333333333fSffSf33333333@'@@'@333333333333333333YDY3333333333333333fSf333333333333333333333333333333333333333333333333333333333333333333sasYDY333333333333333333333333@'@3333333333333333M6M3333333333~3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333@'@333333333333333333333333M6M333333333333sasYDY333333333333333333333333@'@33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333:/J?#H333333333333333333333333333333333333333333333333=!C@"F333333333333333333333333333333333333333333YDY33333333333333333333333333333333@'@fSf33333333~sas3333333333333333333333YDY33333333333333fSf3333333333333333333333333333333333333333~33333333333333333333333333fSf333333333333333333333333333333fSf3333333333333333@'@33333333YDY@'@333333333333333333YDYYDY333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333M6M@'@333333333333333333333333333333fSf333333333333fSf333333333333333333333333333333fSf3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333335;@@^4833333333333333333333333333333333333333333378;=333333333333333333333333<B683333333333333333333333333333333333333334AHaCLe363333333333333333333333333333338.BBPYHegF^b92D3333333333333333333333:)K5;33333333333333333333333333333335E(Q6833333333333333333333333333333333333333333333333345D&N5733333333333333333333333333333333333333fSffSf33333333333333333333333333333333333333pYDY33333333333333333333333333333333M6M33333333333333fSf3333333333333333333333333333333333333333fSf333333333333333333333333YDY3333333333333333333333333333333333333333333333333333YDY3333@'@fSf33333333333333333333fSf33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333~p33333333333333333333333333333333333333333333YDY3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333<3R8)F333333333333333333333333333333333333333344;<9:33333333333333333333333333< B7933333333333333333333333333333333333333338)CBJb>CP5!83333333333333333333333339'I5<333333333333333333333333333333:?B$J3333333333333333333333333333333333333333333333333333?!C=A3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333fSf3333333333333333333333333333333333333333fSf333333333333333333333333M6M333333333333333333333333333333333333333333333333333333psas33~3333333333333333333333fSf333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333M6M333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333335 8;333333333333333333333333333333333333333333AG_?@Y33333333333333333333335!9>DTCT_Gcj@LX8-A3333333333333333333333333333:&J48333333333333333333333333333333A#I;?333333333333333333333333333333333333333333333333333389D$J333333333333333333333333333333333333M6M@'@33333333333333333333333333333333333333333333333333fSffSf3333333333333333333333333333333333333333fSf3333333333333333333333333333333333333333fSf3333333333333333333333333333333333333333333333333333333333333333333333333333333333~333333333333333333333333fSf3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333335:9!D<%L='P<(R=*S<+S;*O9'I7"@363333338%B8%B3333333333333333333333333333333333333333333333333333333333333333333333333379<?33333333333333333333333333333333333333333336>;TDPhBIa6%>33333333334 9:5J@JZF]jE[fBR^92E33333333333333333333333333333333;&L34333333333333333333333333333333F&N57333333333333333333333333333333333333333333333333333333C"H9;3333333333333333333333333333333333~3333333333333333333333333333333333333333333333333333pM6M33333333333333333333333333pM6M333333333333fSf3333333333333333333333333333333333333333fSf3333333333333333333333333333333333333333333333333333333333333333333333333333333333@'@@'@333333333333333333333333fSf333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333M6M~333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333: A?$K:!D6=35333333465;8$E;,O?4Z=1R7"@<.O=2T493333333333333333333333333333333333333333333333333333333333333333333333333333B!E333333333333333333333333333333333333333333:/HERjERjERjBJb33;5L;7N?DZBQcBTeF_mBP`@IY7)@333333333333333333333333333333333333;&N33333333333333333333333333333356E%L3333333333333333333333333333333333333333333333333333333389E#I3333333333333333333333333333333333sas33333333333333333333333333333333333333333333333333333333333333333333333333333333fSffSf333333333333fSf3333333333333333333333333333333333333333fSf333333333333333333333333333333333333333333333333333333333333333333333333333333333333M6MYDY33333333333333333333333333fSf333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333fSffSf3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333379@#H8<3333333333333333333333357$A8(FA;`A;`:+K5:33333333333333333333333333333333333333333333333333333333333333333333333333<>993333333333333333333333333333333333333333<7PERjERjERjEQi33DUj@K`CPd>AV;8N8,C35333333333333333333333333333333333333335:9"E33333333333333333333333333333379C#H3333333333333333333333333333333333333333333333333333333333@ B=@333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333fSffSf333333333333fSf3333333333333333333333333333333333333333fSf333333333333333333333333̙fSf333333333333333333333333sasp3333333333333333333333333333fSf333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333fSfM6M33333333̙fSf333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333:=>!C33333333333333333333333333333346?7ZA:^8&E?7[>2V7$B333333333333333333333333333333333333333333333333333333333333333333333333AB44333333333333333333333333333333333333336$=EQiERjERj>=U333433333333333333333333333333333333333333333333333333:!D483333333333333333333333333333339;A"D333333333333333333333333333333333333333333333333333333333344D"G993333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333fSffSf333333333333fSf3333333333333333333333333333333333333333fSf333333333333333333333333333333333333333333333333sas3333333333333333333333333333fSf333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333fSffSf333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333:;;=3333333333333333333333333333333336/U6=3333333333333333333333333333333333333333333333333333333333333333333355A?33333333333333333333333333333333333333:1J8+E<8P:1J34333333333333333333333333333333333333333333333333333333<#I333333333333333333333333333333338:A!D33333333333333333333333333333333333333333333333333333333333355F"F9933333333333333333333333333YDY3333333333333333333333333333333333333333333333333333333333333333333333333333333333fSffSf333333333333fSf3333333333333333333333333333333333333333fSf3333333333333333333333333333333333333333333333sasYDY33333333333333333333333333fSf333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333fSffSf333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333367=>33333333333333333333333333333333337#A3333333333333333333333333333333333333333333333333333333357; B333333333333333333333333333333333344E#H333333333333333333333333333333333333333333333333333333333333333333>=B A7633333333333333333273gSe333333333333333333333333333333333333333333333333333333YDYsas3333333333333333333333333333333333333333fSf3333333333333333333333333333333333333333fSf3333333333333333333333333333333333333333333333333333333333333333333333@'@~333333333333333333333333fSf33333333333333333333333333333333333333333333333333333333333333M6M3333333333333333333333333333333333333333sas3333333333333333333333333333fSf3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333337788333333333333333333333333333333333348>0V3533333333333333338!D:%K33333333333333333333333333333333333333333333333333333333333333333333333364858433333333333333333333338,EAIb=9R3333333333333333333333333333333333333333333333333333333344= C33333333333333333333333333333333333333F"G4433333333333333333333333333333333333333333333333333333333333333333354?<@>:84333333322639341fSf333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333fSf3333333333333333333333333333333333333333fSf333333333333333333333333~3333333333333333333333333333fSf33333333333333333333YDY~3333333333333333333333fSf33333333333333333333333333333333333333333333333333333333333333fSf333333333333333333333333333333333333333333333333333333333333333333M6M3333333333~3333333333333333333333333333fSf333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333<;333333333333333333333333333333333333:'J8%F333333333333333333338!D:"E33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333348AIbAD^3433333333333333333333333333333333333333333333333333333333> B4433333333333333333333333333333333333333??9933333333333333333333333333333333333333333333333333333333333333333333333386=8=9<7;6;5632233fSf33333333333333333333333333333333333333333333333333333333333333333333333333333333M6M~33333333333333fSf3333333333333333333333333333333333333333fSf333333333333333333333333M6MYDY333333333333333333333333M6MM6M3333333333333333p@'@3333~fSf33333333333333333333fSf33333333333333333333333333333333333333333333333333333333333333fSf333333333333@'@33333333333333333333333333p33333333333333333333333333p3333333333M6MYDY333333333333333333333333M6MM6M333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333;9333333333333333333333333333333333359=,S343333333333333333333333<$I6;3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333334@@\@B^6#=33333333333333333333333333333333333333333333333333333333:<55333333333333333333333333333333333333333377B A333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333YDY33333333333333333333333333333333333333333333333333333333pp3333333333333333333333M6M33333333333333@'@33333333333333333333M6M3333333333333333fSf333333333333333333333333333333333333333333333333333333333333333333YDYYDY33333333M6M333333333333333333fSf33333333333333333333333333333333333333333333333333333333333333fSf333333333333fSf333333333333333333333333@'@33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333:73333333333333333333333333333333334;)P5=33333333333333333333333335>$K33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333<4P@@]9,G3333333333333333333333333333333333333333333333333333333333=>33333333333333333333333333333333333333333333E!C443333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333YDY333333333333333333p3333333333333333p333333333333333333sas3333333333333333fSf33333333333333333333333333fSf~33333333333333333333@'@33333333333333@'@p3333333333@'@@'@3333333333333333fSf33333333333333333333333333333333333333333333333333333333333333M6M333333333333fSf3333333333333333333333YDY33333333333333333333fSffSf333333333333fSf~33333333333333333333@'@333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333335433333333333333333333333333333333:%K8!D3333333333333333333333333333: C7<3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333:/KAB_<3O3333333333333333333333333333333333333333333333333333333333667733333333333333333333333333333333333333333333:9=;3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333fSffSf33333333333333~@'@3333333333333333~M6M33333333M6M@'@3333333333333333fSf33333333333333333333333333333333333333333333@'@M6M3333333333333333333333333333fSf3333333333333333fSf3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333岨ٙ33333333sas3333333333333333YDY33333333333333333333333333333333@'@M6M3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333335<$K8 C33333333333333333333333333333346<#I45333333333333333333333333333333333333= B33333333333333333333333333333333333333333333333333333333333333333333333333333333336#@B>a:,I3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333386=:33333333333333333333333333333333333333333333333333333333333333333333333333333333333333M6M33333333333333333333333333333333333333333333333333333333333333~fSf3333333333333333333333fSf33YDY33333333333333fSf333333333333333333333333333333M6Msas3333333333333333333333@'@@'@3333fSf33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333@'@333333333333@'@sas33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333338==!E3333333333333333333333333333333333333333<@4633333333333333333333333333333333333333333333333333333333333333333333333333333338A;^;-M333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333978633333333333333333333333333333333333333333333333333333333333333333333333333333333333333~33333333333333333333333333333333333333333333333333333333333333M6M噌@'@333333333333333333333333YDY3333M6M򙌙@'@3333333333333333YDY333333333333333333M6M򲨲M6M3333333333333333̙33333333333333333333333333sas̥3333YDY3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333̀p33333333@'@p̲fSf3333333333333333fSf噌@'@333333333333333333333333333333M6M򲨲M6M3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333357?"F333333333333333333333333333333333333333333;>45333333333333333333333333333333333333333333333333333333333333333333333333333333<3U<2S3433333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333332=833333333333333333333333333333333333333333333333333333333333333333333333333333333333333fSfM6M33333333333333333333333333333333333333YDYM6M333333333333333333333333YDYpsasYDY33333333333333333333333333333333333333333333333333YDY~~fSf3333333333333333333333333333fSf333333333333333333333333333333333333333333YDYppfSf3333333333333333333333333333333333333333333333333333333333333333333333333333333333fSf333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333fSf~sasYDY333333333333333333333333333333333333333333YDYppfSf33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333?!E45333333333333333333333333333333333333333333=@3333333333333333333333333333333333333333333333333333333333333333333333333333338&E?5Y5:3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333865433333333333333333333333333333333333333333333333333333333333333333333333333333333333333@'@3333333333333333333333333333333333~fSf33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333fSf333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333fSf333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333378;?33333333333333333333333333333333333333333333>?333333333333333333333333333333333333333333333333333333333333333333333333333334>1U9'G33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333:533333333333333333333333333333333333333333333333333333333333333333333333333333333333333YDY@'@3333333333333333333333333333M6MfSf33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333fSf333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333fSf3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333=@3433333333333333333333333333333333333333333355;;33333333333333333333333333333333333333333333333333333333333333333333333333338#C>0V3533333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333953333333333333333333333333333333333333333333333333333333333333333333333333333333333333333pp3333333333333333333333M6MfSf33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333fSf333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333fSf3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333>@33333333333333333333333333333333333333333333=<333333333333333333333333333333333333333333333333333333333333333333333333333333<,R8$F333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333394333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333p奚fSf@'@333333M6MfSffSf33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333fSf333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333fSf33333333333333333333333333333333333333333333333333333333333333̥33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333334375643233333333<=333333333333333333333333333333333333333333876633333333333333333333333333333333333333333333333333333333333333333333333333335:>/X3533333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333338333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333pfSf33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333fSf333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333fSf333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333323354;7<83333<<55333333333333333333333333333333333333333374863333333333333333333333333333333333333333333333333333333333333333333333333333338$G;(M333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333332623333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333YDỲp3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333fSf333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333fSf3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333344><98993333333333333333333333333333333333333333334333333333333333333333333333333333333333333333333333333333333333333333333333333333=*S6=3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333433333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333fSf򲨲YDY33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333fSffSffSffSf@'@333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333@'@fSffSffSffSf333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333354G"D773333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333359=)T3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333M6Mp̿fSf333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333M6MfSffSffSffSffSffSffSffSffSffSffSffSffSffSffSffSffSffSffSffSffSfYDY33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333><33;987333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333:%K8 C333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333396643333:755333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333335;<'Q343333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333332;733333333:833333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333334>&N6<333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333353653333333364633333333333333333333333333333333333333333333333333333333333333333333333333333333343333333333333333333333333333333;"F:"F333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333753333333333336333333333333333333333333333333333333333333333333333333333333333333333333333333333953333333333333333333333333333< C=$H3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333343333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333343;8333333333333333333333345="G@@<><>=?@!DA"G9>343333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333456756343333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333contextfree-3.0.5+dfsg1.orig/src-win/win-install/ContextFreeVS11.nsi0000644000175000017500000001602012076364074023637 0ustar brambram; Context Free ; --------------------- ; Copyright (C) 2005 John Horigan ; ; This program is free software; you can redistribute it and/or ; modify it under the terms of the GNU General Public License ; as published by the Free Software Foundation; either version 2 ; of the License, or (at your option) any later version. ; ; This program is distributed in the hope that it will be useful, ; but WITHOUT ANY WARRANTY; without even the implied warranty of ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ; GNU General Public License for more details. ; ; You should have received a copy of the GNU General Public License ; along with this program; if not, write to the Free Software ; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ; ; John Horigan can be contacted at john@glyphic.com or at ; John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA ; !define VER_MAJOR 3 !define VER_MINOR 0 SetCompressor lzma RequestExecutionLevel user !define PRODUCT "ContextFree" !define VERSION "${VER_MAJOR}.${VER_MINOR}" !include "MUI.nsh" !include WordFunc.nsh !include "x64.nsh" !include WinVer.nsh ;-------------------------------- ;Variables Var MUI_TEMP Var STARTMENU_FOLDER ;-------------------------------- ;Configuration !define MUI_ICON "ContextFree.ico" !define MUI_UNICON "ContextFree.ico" !define MUI_WELCOMEFINISHPAGE_BITMAP "sidebar.bmp" !define MUI_UNWELCOMEFINISHPAGE_BITMAP "sidebar.bmp" !define MUI_WELCOMEPAGE_TITLE "Context Free" !define MUI_FINISHPAGE_NOAUTOCLOSE !define MUI_UNFINISHPAGE_NOAUTOCLOSE ShowInstDetails show ShowUninstDetails show ;General OutFile "ContextFreeInstall.exe" ;License page LicenseData "license.txt" Name "${PRODUCT}" !insertmacro MUI_PAGE_WELCOME !insertmacro MUI_PAGE_LICENSE "license.txt" !insertmacro MUI_PAGE_DIRECTORY ;Start Menu Folder Page Configuration !define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKCU" !define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\OzoneSoft\ContextFree" !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder" !insertmacro MUI_PAGE_STARTMENU Application $STARTMENU_FOLDER !insertmacro MUI_PAGE_INSTFILES !insertmacro MUI_PAGE_FINISH !insertmacro MUI_UNPAGE_CONFIRM !insertmacro MUI_UNPAGE_INSTFILES ;Language !insertmacro MUI_LANGUAGE "English" ;-------------------------------- ;Installer Sections Section "Context Free (required)" SectionIn RO SetOutPath "$INSTDIR" ClearErrors File 'license.txt' ${If} ${RunningX64} File "..\\..\\src-net\\Release64\\ContextFree.exe" File "..\\..\\Release64\\ContextFreeCLI.exe" File "..\\..\\src-net\\Release64\\CFControlsVS11.dll" File "..\\..\\src-net\\Release64\\Controls.dll" File "..\\..\\src-net\\Release64\\FileDlgExtenders.dll" File "..\\..\\src-net\\Release64\\WeifenLuo.WinFormsUI.Docking.dll" File "C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\redist\x64\Microsoft.VC110.CRT\msvcr110.dll" File "C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\redist\x64\Microsoft.VC110.CRT\msvcp110.dll" ${Else} File "..\\..\\src-net\\release\\ContextFree.exe" File "..\\..\\Release\\ContextFreeCLI.exe" File "..\\..\\src-net\\release\\CFControlsVS11.dll" File "..\\..\\src-net\\release\\Controls.dll" File "..\\..\\src-net\\release\\FileDlgExtenders.dll" File "..\\..\\src-net\\release\\WeifenLuo.WinFormsUI.Docking.dll" File "C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\redist\x86\Microsoft.VC110.CRT\msvcr110.dll" File "C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\redist\x86\Microsoft.VC110.CRT\msvcp110.dll" ${EndIf} SectionEnd Section -post WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\{DD0B06AD-5E55-41be-88E5-E9D13BAF06F4}" \ "DisplayName" "Context Free" WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\{DD0B06AD-5E55-41be-88E5-E9D13BAF06F4}" \ "UninstallString" '"$INSTDIR\uninst-contextfree.exe"' WriteRegDWORD HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\{DD0B06AD-5E55-41be-88E5-E9D13BAF06F4}" \ "NoModify" 1 WriteRegDWORD HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\{DD0B06AD-5E55-41be-88E5-E9D13BAF06F4}" \ "NoRepair" 1 SetOutPath $INSTDIR ; since the installer is now created last (in 1.2+), this makes sure ; that any old installer that is readonly is overwritten. Delete $INSTDIR\uninst-contextfree.exe WriteUninstaller $INSTDIR\uninst-contextfree.exe !insertmacro MUI_STARTMENU_WRITE_BEGIN Application ;Create shortcuts CreateDirectory "$SMPROGRAMS\$STARTMENU_FOLDER" CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Context Free.lnk" "$INSTDIR\ContextFree.exe" !insertmacro MUI_STARTMENU_WRITE_END SectionEnd Function .onInstSuccess Exec '"$INSTDIR\ContextFree.exe"' FunctionEnd Function .onInit ;Folder-selection page ${If} ${AtLeastWin2000} StrCpy $INSTDIR "$LOCALAPPDATA\OzoneSoft\${PRODUCT}" ${Else} StrCpy $INSTDIR "$PROGRAMFILES\OzoneSoft\${PRODUCT}" ${EndIf} ReadRegStr $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client" "Version" ${If} $0 == "" MessageBox \ MB_YESNO|MB_ICONSTOP \ ".Net framework v4.0 is required. Install Context Free anyway?" \ IDYES okgo Abort ${EndIf} okgo: SetOutPath $TEMP File /oname=spltmp.bmp "splash.bmp" splash::show 4000 $TEMP\spltmp Pop $0 ; $0 has '1' if the user closed the splash screen early, ; '0' if everything closed normal, and '-1' if some error occured. Delete $TEMP\spltmp.bmp FunctionEnd ;-------------------------------- ;Uninstaller Section Section "Uninstall" Delete '$INSTDIR\ContextFree.exe' Delete '$INSTDIR\ContextFreeCLI.exe' Delete '$INSTDIR\CFControls.dll' Delete '$INSTDIR\Controls.dll' Delete '$INSTDIR\FileDlgExtenders.dll' Delete '$INSTDIR\WeifenLuo.WinFormsUI.Docking.dll' Delete '$INSTDIR\msvcr100.dll' Delete '$INSTDIR\msvcp100.dll' Delete '$INSTDIR\license.txt' Delete '$INSTDIR\uninst-contextfree.exe' RMDir '$INSTDIR' !insertmacro MUI_STARTMENU_GETFOLDER Application $MUI_TEMP RMDir /r "$SMPROGRAMS\$MUI_TEMP" SetShellVarContext all RMDir /r "$SMPROGRAMS\$MUI_TEMP" SetRegView 32 DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\{DD0B06AD-5E55-41be-88E5-E9D13BAF06F4}" DeleteRegKey HKCU "Software\OzoneSoft\ContextFree" DeleteRegKey HKCU "Software\Classes\.cfdg" DeleteRegKey HKCU "Software\Classes\ContextFree.Document" SetRegView 64 DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\{DD0B06AD-5E55-41be-88E5-E9D13BAF06F4}" DeleteRegKey HKCU "Software\OzoneSoft\ContextFree" DeleteRegKey HKCU "Software\Classes\.cfdg" DeleteRegKey HKCU "Software\Classes\ContextFree.Document" SectionEnd ;eof contextfree-3.0.5+dfsg1.orig/src-win/win-install/license.txt0000644000175000017500000003603512076364074022456 0ustar brambram GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 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. contextfree-3.0.5+dfsg1.orig/src-win/win-install/splash.psd0000644000175000017500000202243512076364074022276 0ustar brambram8BPSX,8BIM%8BIM$9 application/vnd.adobe.photoshop Adobe Photoshop CS3 Macintosh 2008-03-08T22:45:11-07:00 2008-03-08T23:05:27-07:00 2008-03-08T23:05:27-07:00 uuid:2AA0D720EBEEDC119E59C67F9B1082B2 uuid:AABB4380EBEEDC119E59C67F9B1082B2 1 710000/10000 710000/10000 2 256,257,258,259,262,274,277,284,530,531,282,283,296,301,318,319,529,532,306,270,271,272,305,315,33432;AEAADE3EA5EE3D45AE8CCE8508594292 600 400 -1 36864,40960,40961,37121,37122,40962,40963,37510,40964,36867,36868,33434,33437,34850,34852,34855,34856,37377,37378,37379,37380,37381,37382,37383,37384,37385,37386,37396,41483,41484,41486,41487,41488,41492,41493,41495,41728,41729,41730,41985,41986,41987,41988,41989,41990,41991,41992,41993,41994,41995,41996,42016,0,2,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,20,22,23,24,25,26,27,28,30;4052212324FEE53A0C9873FCDB723B1D 3 Color LCD 8BIM com.apple.print.PageFormat.PMHorizontalRes com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMHorizontalRes 72 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMOrientation com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMOrientation 1 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMScaling com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMScaling 1 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalRes com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalRes 72 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalScaling com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalScaling 1 com.apple.print.ticket.stateFlag 0 com.apple.print.subTicket.paper_info_ticket PMPPDPaperCodeName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray PMPPDPaperCodeName Letter com.apple.print.ticket.stateFlag 0 PMTiogaPaperName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray PMTiogaPaperName na-letter com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMAdjustedPageRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPageRect 0.0 0.0 734 576 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMAdjustedPaperRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPaperRect -18 -18 774 594 com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMPaperName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMPaperName na-letter com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMUnadjustedPageRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPageRect 0.0 0.0 734 576 com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMUnadjustedPaperRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPaperRect -18 -18 774 594 com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.ppd.PMPaperName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.ppd.PMPaperName US Letter com.apple.print.ticket.stateFlag 0 com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.type com.apple.print.PaperInfoTicket com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.type com.apple.print.PageFormatTicket 8BIMGG8BIM&?8BIM x8BIM8BIM 8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM8BIM8BIM08BIM-8BIM@@8BIM8BIMIX Untitled-1XnullboundsObjcRct1Top longLeftlongBtomlongRghtlongXslicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongRghtlongXurlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?8BIMapplmntrRGB XYZ   acspAPPL-appl󅺥ڋrXYZ,gXYZ@bXYZTwtpthchad|,rTRCgTRCbTRCvcgtndin>desc,ddscmmmod`(cprt$XYZ [4KXYZ w(MXYZ #aXYZ Rsf32 B&lcurvcurvcurvvcgt$z||~ D ho u!"#%{&')~*+-./1235679:;=>?ABCEFGIJKMNOPQRTUVWXZ[\]^_`b cdefghiklmnopqrstuvwxyz{|})Ղ  !"#$%''()*l,-/0112456v78:;<<=?@ABCńEFGII ˋKLNϏPQRӒSTUחWXZۛ\\]ߟ_`!bcd%fgh)jkl-nop1rst5vxyy:{|=#|gT C 4 ' ' &(8L^s6g !#$=%q&')(*l+-.A/02)346*7p8:;x<>?o@B$C{DFGxHIK1LeMNPQGRxSTV W@XqYZ[]^O_z`abde?fXg~hijkmn+oDphq|rstuvwxz{| },~5@KO[`eltrş̠ѡӢӣӤۥڵѶɷm[K<*ŴƓrS6̴͊Z#г}EԠj3ؓ])ۺ܂Kߩs;^'Jl5[$|Go9[#Ixz;}?F J OT\ !"#$%&'()*i*+,-./012345678x89:;<=>~>?@ABCDEEFGHIJKL LMNOPQQRSTUVWWXYZ[\\]^_`ab!bcdefg&ghijkl,lmnopqrstuvwxy8yz{|}~ɊJ  !c#$&&'()*,-./01123457789;;<>>?@ABCEFFGHIKv"NPPQ}*VW؂/Z܆3߉5d;ijloZRndin6+VS+'_P T9=pJ=.BYs KxG=!YFG\9 : o -   n E afQ:7_i+f%wG$|j ! !"""##$%U&&'(C()B**+,-\.3/ /0123d4G5,667899:;<=>?w@qAlBiChDhEkFnGtH{IJKLMNOPRST8USVpWXYZ\]>^f_`acdGeyfijPklnoApqstKux$yoz| }Z~T\qэ_Ɠ/sSŞ%-DѸaBtƬJˊ-vp&ߊ?dV_ )?Xu0_*_M O iC%ud \  ^ c  p * L o@vF sjltz9VQ !&!"n##$c% %&n''()B)*+|,=,-./T0!0123j4D556789:g;W<==/>!?@AABCDEFGHJKLM1N>OOPRQkRySTUVWYZ/[N\q]^_a b0chdefh)iejkmnUopr(svtvwsxz#{|~Yȁ65ΐe7嘞jU)¥c\F84.-(%(0?HQlqˑ͠ϼ=d܋޺Bf(nBY KxG=YFG\ T -  n dafs7_fNGP ! !"Q##$&&'(v)B*+,-\.3/ 0123d4G66789:<=>?w@qBiChDhEkFnH{IJKLMNOPRST8USWXYZ\]>^f_`acdGeyfgijPlnoApqstKuvx$yoz| }Z~T\qь2_Ɠ/sSŝ9%-DѸa񻃽BtƬJˊ͖vpְ׆v&kDߊ?bkI(VgH* TB'desc Color LCDmluc nbNOsvSEfiFIdaDKzhCN frFRjaJP0enUS>ptBRPesEShzhTWzkoKR deDEnlNLitITFarge-LCDFrg-LCDVri-LCDLCD-farveskrm_ir LCDcran LCD000 LCDColor LCDLCD coloridoLCD color_irmfvoy:Vh LCDFarb-LCDKleuren-LCDLCD colorimmodW{textCopyright Apple, Inc., 20088BIM8BIM ~kȠbJFIFHH Adobe_CMAdobed            k" ?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?I%32I$wJ7lnݿ4<rCZZ gZsX,hs:6#]Z R5gٶ ghqeUmM;+%[cV>=~UM<{fcWVwOͱa:̊luVQkr4m"K#,-~=#%VܒZe:ֺ3;3v;^L]FmZgIhu,,hcƣMfC[U,MuYꊺFf3+̌=U^Lv G (r2%a㜧cIs-euk] ʭ]\̇Ӄ}{-o{?lWjRū "Kl9}:۽7vU9쭦)7f[zN:<qoIu}.xˣ7QDˁ\RﺯTtìK}7кK#.7.4:1ޢ԰D~Ce$1e6=%G2,z/+u[rT8XY{;SL}lVNW+667Nǧ՟z:s2-XqzݎZ npƳ6{ˆpͩՇ].>իx{?a۱.nFUM7\v7Z}F.xtfQvcVPJOZ=[ f@sdG3XQK>u [1]p.vٵ/f_:O̦|jfMظĹmwvl]5]ob3ƾd La4Y7vc7+ ځ/HHh4e32Avp 6D{i_IL5 I=ڥelu<<݇}Fu>ȥ,#L{[5Os7)Sx:Rܺڭ w֯ߢmTVĬ{:O-??lٌ[[q8 ݯYgݽ>_Ng˚I3ݲkٳծ~>6]]6ockgo$Nޠ Z!53u,c#NܓX1̗5nn$ρZ1׀ׇ[lVG} @ȩۚ7訛s"bp Wv4en{ʂp\I%)$IJI$RI$⃋\ZA'l9ȱ{64;LʕYk<EEu}nݮ?m!M6+tGfgP`ef;2GKkmwEڅ+_~CӱiZMngQ_FۅZ+>aus\N=?;!N~bq~6'P`\YkvF/_K}Bf:0maq6فk?2:VUWr f;[*}eU־i͡kۻԮ}jnN]3j=6N~NO2NmVSc.e qkC^MfN7eU5K /!}fk3k\9.-̊}_{ߐʿG_J ƞlkc82EĈ$IRI$I$$I)Ⓛ L9FֽŖK24wZ2Y0ٸ{HxkcE3sX=FH+F1}sWH&0멟m+'!H$;WyˮXюׅk"\r+jhIYnmFXl2momo%W%a\6-scWcdzn;'ḟmʮY<uxm$+lƖG1 jx=LrzxzղWYqXu߷qj6IcHVY>oK]`WXɸ?%=}bUXed§skgmWKm}#UmzϬڱwz~U~R%FĸlW[У}Ŗ1(˫@[lss]$u}Z6djCvuVbc"EO5Y4Squ7bڰv}k?B̼r0|8kZEfV%Ϋ^#!wSϷSiZv17^Cq@,wZIJՌ{m2\0m&{,k?_ 4U@ۀiƖngbrn"WIIŢ`{]4OۻI$RI$I%?NJIiO%y5>]kU~ᇐP;hkmeleaFEk78 !o7;HVV+ ɱ{7zS=OO63o$贀z~isiv̽l);+#?{1aZnsXnlwk27S-úE}{l>goj̋k665wjRUJ:\4bH_fQM^b]x -Oy.kӯo"?#ӱI;߃KC)\D^2vW;mշg3.}k-Ikm{ :}8hh)q_OJ}2_eī{XS\Yu5gT^2Υʀ%{o5"WFm֜Z=c +!XYofݓ?lF]vid[8TozhV/p/tXӿqa'׵;sI<9H(Y$E*I$RI$I%?$˗ݣe l5{Awg9EmL]iF.?R}͐@{v cϬׇ0^-wlu=FƎ\<kڽǩ̊jѸu_e/NC>{Ou*qC˅nk MdkzYNձŮ>gotktrnɑ)ּhk?2#I#JRI$I$$I)I$JI%32 $G}ɻJSc]ˠV kQ_ou_mw[o\ d~}۳gk ̯cg !4 _l_~*ı⫙cr]WcY[s_lUh}ycnmY6'ǯdvo-i)0:y4`e| wX} bL\|+>Mh[C=?OzR1_rsm=?OҡgvzG>oݷAIMg2ӏw{Ip-ӽzNc_/vo}j6Y!jM_֭ejf/g7}wF_SGO9!z\7WIN n$znv93!cMu lw dsOS_zg}l]ߴwzSl?wGU8C)zR i1Ż΢}V4t9qk~s-_ϥ?A?F>]mIz>}n/ۻo=?j#qDo訚olKkVk?h6ߏ=_o=oz߲nGl}/C]-T8BIM!UAdobe PhotoshopAdobe Photoshop CS38BIM".MM*bj(1r2i p' p'Adobe Photoshop CS3 Macintosh2008:03:08 23:05:27X&(.HH8BIMmaniIRFR8BIMAnDsnullAFStlongFrInVlLsObjcnullFrIDlong^aFStsVlLsObjcnullFsIDlongAFrmlongFsFrVlLslong^aLCntlong8BIMRoll8BIMmfri\XH8BIMnorm(Layer 18BIMluniLayer 18BIMlnsrlayr8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMfxrp4L"""8BIMnorm$L( Context Free8BIMTySh#H??@q@I2TxLrTxt TEXT Context Free textGriddingenum textGriddingNoneOrntenumOrntHrznAntAenumAnntAnSm TextIndexlong EngineDatatdta!r << /EngineDict << /Editor << /Text (Context Free ) >> /ParagraphRun << /DefaultRunData << /ParagraphSheet << /DefaultStyleSheet 0 /Properties << >> >> /Adjustments << /Axis [ 1.0 0.0 1.0 ] /XY [ 0.0 0.0 ] >> >> /RunArray [ << /ParagraphSheet << /DefaultStyleSheet 0 /Properties << /Justification 0 /FirstLineIndent 0.0 /StartIndent 0.0 /EndIndent 0.0 /SpaceBefore 0.0 /SpaceAfter 0.0 /AutoHyphenate true /HyphenatedWordSize 6 /PreHyphen 2 /PostHyphen 2 /ConsecutiveHyphens 8 /Zone 36.0 /WordSpacing [ .8 1.0 1.33 ] /LetterSpacing [ 0.0 0.0 0.0 ] /GlyphSpacing [ 1.0 1.0 1.0 ] /AutoLeading 1.2 /LeadingType 0 /Hanging false /Burasagari false /KinsokuOrder 0 /EveryLineComposer false >> >> /Adjustments << /Axis [ 1.0 0.0 1.0 ] /XY [ 0.0 0.0 ] >> >> ] /RunLengthArray [ 13 ] /IsJoinable 1 >> /StyleRun << /DefaultRunData << /StyleSheet << /StyleSheetData << >> >> >> /RunArray [ << /StyleSheet << /StyleSheetData << /Font 0 /FontSize 47.33333 /FauxBold false /FauxItalic false /AutoLeading true /Leading .00986 /HorizontalScale 1.0 /VerticalScale 1.0 /Tracking 0 /AutoKerning true /Kerning 0 /BaselineShift 0.0 /FontCaps 0 /FontBaseline 0 /Underline false /Strikethrough false /Ligatures true /DLigatures false /BaselineDirection 1 /Tsume 0.0 /StyleRunAlignment 2 /Language 0 /NoBreak false /FillColor << /Type 1 /Values [ 1.0 1.0 1.0 1.0 ] >> /StrokeColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /FillFlag true /StrokeFlag false /FillFirst false /YUnderline 1 /OutlineWidth .23997 >> >> >> ] /RunLengthArray [ 13 ] /IsJoinable 2 >> /GridInfo << /GridIsOn false /ShowGrid false /GridSize 18.0 /GridLeading 22.0 /GridColor << /Type 1 /Values [ 0.0 0.0 0.0 1.0 ] >> /GridLeadingFillColor << /Type 1 /Values [ 0.0 0.0 0.0 1.0 ] >> /AlignLineHeightToGridFlags false >> /AntiAlias 3 /UseFractionalGlyphWidths true /Rendered << /Version 1 /Shapes << /WritingDirection 0 /Children [ << /ShapeType 0 /Procession 0 /Lines << /WritingDirection 0 /Children [ ] >> /Cookie << /Photoshop << /ShapeType 0 /PointBase [ 0.0 0.0 ] /Base << /ShapeType 0 /TransformPoint0 [ 1.0 0.0 ] /TransformPoint1 [ 0.0 1.0 ] /TransformPoint2 [ 0.0 0.0 ] >> >> >> >> ] >> >> >> /ResourceDict << /KinsokuSet [ << /Name (PhotoshopKinsokuHard) /NoStart (00 00    0=]0 0 0 00000000A0C0E0G0I0c000000000000000000?!\)]},.:;!!  0) /NoEnd (  0;[00 0 00\([{ 0) /Keep (  %) /Hanging (00.,) >> << /Name (PhotoshopKinsokuSoft) /NoStart (00 0   0=]0 0 0 0000000) /NoEnd (  0;[00 0 00) /Keep (  %) /Hanging (00.,) >> ] /MojiKumiSet [ << /InternalName (Photoshop6MojiKumiSet1) >> << /InternalName (Photoshop6MojiKumiSet2) >> << /InternalName (Photoshop6MojiKumiSet3) >> << /InternalName (Photoshop6MojiKumiSet4) >> ] /TheNormalStyleSheet 0 /TheNormalParagraphSheet 0 /ParagraphSheetSet [ << /Name (Normal RGB) /DefaultStyleSheet 0 /Properties << /Justification 0 /FirstLineIndent 0.0 /StartIndent 0.0 /EndIndent 0.0 /SpaceBefore 0.0 /SpaceAfter 0.0 /AutoHyphenate true /HyphenatedWordSize 6 /PreHyphen 2 /PostHyphen 2 /ConsecutiveHyphens 8 /Zone 36.0 /WordSpacing [ .8 1.0 1.33 ] /LetterSpacing [ 0.0 0.0 0.0 ] /GlyphSpacing [ 1.0 1.0 1.0 ] /AutoLeading 1.2 /LeadingType 0 /Hanging false /Burasagari false /KinsokuOrder 0 /EveryLineComposer false >> >> ] /StyleSheetSet [ << /Name (Normal RGB) /StyleSheetData << /Font 1 /FontSize 12.0 /FauxBold false /FauxItalic false /AutoLeading true /Leading 0.0 /HorizontalScale 1.0 /VerticalScale 1.0 /Tracking 0 /AutoKerning true /Kerning 0 /BaselineShift 0.0 /FontCaps 0 /FontBaseline 0 /Underline false /Strikethrough false /Ligatures true /DLigatures false /BaselineDirection 2 /Tsume 0.0 /StyleRunAlignment 2 /Language 0 /NoBreak false /FillColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /StrokeColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /FillFlag true /StrokeFlag false /FillFirst true /YUnderline 1 /OutlineWidth 1.0 >> >> ] /FontSet [ << /Name (Verdana) /Script 0 /FontType 1 /Synthetic 0 >> << /Name (MyriadPro-Regular) /Script 0 /FontType 0 /Synthetic 0 >> << /Name (AdobeInvisFont) /Script 0 /FontType 0 /Synthetic 0 >> ] /SuperscriptSize .583 /SuperscriptPosition .333 /SubscriptSize .583 /SubscriptPosition .333 /SmallCapSize .7 >> /DocumentResources << /KinsokuSet [ << /Name (PhotoshopKinsokuHard) /NoStart (00 00    0=]0 0 0 00000000A0C0E0G0I0c000000000000000000?!\)]},.:;!!  0) /NoEnd (  0;[00 0 00\([{ 0) /Keep (  %) /Hanging (00.,) >> << /Name (PhotoshopKinsokuSoft) /NoStart (00 0   0=]0 0 0 0000000) /NoEnd (  0;[00 0 00) /Keep (  %) /Hanging (00.,) >> ] /MojiKumiSet [ << /InternalName (Photoshop6MojiKumiSet1) >> << /InternalName (Photoshop6MojiKumiSet2) >> << /InternalName (Photoshop6MojiKumiSet3) >> << /InternalName (Photoshop6MojiKumiSet4) >> ] /TheNormalStyleSheet 0 /TheNormalParagraphSheet 0 /ParagraphSheetSet [ << /Name (Normal RGB) /DefaultStyleSheet 0 /Properties << /Justification 0 /FirstLineIndent 0.0 /StartIndent 0.0 /EndIndent 0.0 /SpaceBefore 0.0 /SpaceAfter 0.0 /AutoHyphenate true /HyphenatedWordSize 6 /PreHyphen 2 /PostHyphen 2 /ConsecutiveHyphens 8 /Zone 36.0 /WordSpacing [ .8 1.0 1.33 ] /LetterSpacing [ 0.0 0.0 0.0 ] /GlyphSpacing [ 1.0 1.0 1.0 ] /AutoLeading 1.2 /LeadingType 0 /Hanging false /Burasagari false /KinsokuOrder 0 /EveryLineComposer false >> >> ] /StyleSheetSet [ << /Name (Normal RGB) /StyleSheetData << /Font 1 /FontSize 12.0 /FauxBold false /FauxItalic false /AutoLeading true /Leading 0.0 /HorizontalScale 1.0 /VerticalScale 1.0 /Tracking 0 /AutoKerning true /Kerning 0 /BaselineShift 0.0 /FontCaps 0 /FontBaseline 0 /Underline false /Strikethrough false /Ligatures true /DLigatures false /BaselineDirection 2 /Tsume 0.0 /StyleRunAlignment 2 /Language 0 /NoBreak false /FillColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /StrokeColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /FillFlag true /StrokeFlag false /FillFirst true /YUnderline 1 /OutlineWidth 1.0 >> >> ] /FontSet [ << /Name (Verdana) /Script 0 /FontType 1 /Synthetic 0 >> << /Name (MyriadPro-Regular) /Script 0 /FontType 0 /Synthetic 0 >> << /Name (AdobeInvisFont) /Script 0 /FontType 0 /Synthetic 0 >> ] /SuperscriptSize .583 /SuperscriptPosition .333 /SubscriptSize .583 /SubscriptPosition .333 /SmallCapSize .7 >> >>warp warpStyleenum warpStylewarpNone warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub warpRotateenumOrntHrzn8BIMluni Context Free8BIMlnsrrend8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMfxrp @oT8888BIMnorm((copyright 2005 Chris Coyne co8BIMTySh'$??@j @w2TxLrTxt TEXTQcopyright 2005 Chris Coynecopyright 2005-2008 John Horigan & Mark Lentczner textGriddingenum textGriddingNoneOrntenumOrntHrznAntAenumAnntAnSm TextIndexlong EngineDatatdta$ << /EngineDict << /Editor << /Text (copyright 2005 Chris Coynecopyright 2005-2008 John Horigan & Mark Lentczner ) >> /ParagraphRun << /DefaultRunData << /ParagraphSheet << /DefaultStyleSheet 0 /Properties << >> >> /Adjustments << /Axis [ 1.0 0.0 1.0 ] /XY [ 0.0 0.0 ] >> >> /RunArray [ << /ParagraphSheet << /DefaultStyleSheet 0 /Properties << /Justification 0 /FirstLineIndent 0.0 /StartIndent 0.0 /EndIndent 0.0 /SpaceBefore 0.0 /SpaceAfter 0.0 /AutoHyphenate true /HyphenatedWordSize 6 /PreHyphen 2 /PostHyphen 2 /ConsecutiveHyphens 8 /Zone 36.0 /WordSpacing [ .8 1.0 1.33 ] /LetterSpacing [ 0.0 0.0 0.0 ] /GlyphSpacing [ 1.0 1.0 1.0 ] /AutoLeading 1.2 /LeadingType 0 /Hanging false /Burasagari false /KinsokuOrder 0 /EveryLineComposer false >> >> /Adjustments << /Axis [ 1.0 0.0 1.0 ] /XY [ 0.0 0.0 ] >> >> << /ParagraphSheet << /DefaultStyleSheet 0 /Properties << /Justification 0 /FirstLineIndent 0.0 /StartIndent 0.0 /EndIndent 0.0 /SpaceBefore 0.0 /SpaceAfter 0.0 /AutoHyphenate true /HyphenatedWordSize 6 /PreHyphen 2 /PostHyphen 2 /ConsecutiveHyphens 8 /Zone 36.0 /WordSpacing [ .8 1.0 1.33 ] /LetterSpacing [ 0.0 0.0 0.0 ] /GlyphSpacing [ 1.0 1.0 1.0 ] /AutoLeading 1.2 /LeadingType 0 /Hanging false /Burasagari false /KinsokuOrder 0 /EveryLineComposer false >> >> /Adjustments << /Axis [ 1.0 0.0 1.0 ] /XY [ 0.0 0.0 ] >> >> ] /RunLengthArray [ 29 52 ] /IsJoinable 1 >> /StyleRun << /DefaultRunData << /StyleSheet << /StyleSheetData << >> >> >> /RunArray [ << /StyleSheet << /StyleSheetData << /Font 0 /FontSize 13.80556 /FauxBold false /FauxItalic false /AutoLeading true /Leading 16.56667 /HorizontalScale 1.0 /VerticalScale 1.0 /Tracking 0 /AutoKerning true /Kerning 0 /BaselineShift 0.0 /FontCaps 0 /FontBaseline 0 /Underline false /Strikethrough false /Ligatures true /DLigatures false /BaselineDirection 1 /Tsume 0.0 /StyleRunAlignment 2 /Language 0 /NoBreak false /FillColor << /Type 1 /Values [ 1.0 1.0 1.0 1.0 ] >> /StrokeColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /FillFlag true /StrokeFlag false /FillFirst false /YUnderline 1 /OutlineWidth .23997 >> >> >> ] /RunLengthArray [ 81 ] /IsJoinable 2 >> /GridInfo << /GridIsOn false /ShowGrid false /GridSize 18.0 /GridLeading 22.0 /GridColor << /Type 1 /Values [ 0.0 0.0 0.0 1.0 ] >> /GridLeadingFillColor << /Type 1 /Values [ 0.0 0.0 0.0 1.0 ] >> /AlignLineHeightToGridFlags false >> /AntiAlias 3 /UseFractionalGlyphWidths true /Rendered << /Version 1 /Shapes << /WritingDirection 0 /Children [ << /ShapeType 0 /Procession 0 /Lines << /WritingDirection 0 /Children [ ] >> /Cookie << /Photoshop << /ShapeType 0 /PointBase [ 0.0 0.0 ] /Base << /ShapeType 0 /TransformPoint0 [ 1.0 0.0 ] /TransformPoint1 [ 0.0 1.0 ] /TransformPoint2 [ 0.0 0.0 ] >> >> >> >> ] >> >> >> /ResourceDict << /KinsokuSet [ << /Name (PhotoshopKinsokuHard) /NoStart (00 00    0=]0 0 0 00000000A0C0E0G0I0c000000000000000000?!\)]},.:;!!  0) /NoEnd (  0;[00 0 00\([{ 0) /Keep (  %) /Hanging (00.,) >> << /Name (PhotoshopKinsokuSoft) /NoStart (00 0   0=]0 0 0 0000000) /NoEnd (  0;[00 0 00) /Keep (  %) /Hanging (00.,) >> ] /MojiKumiSet [ << /InternalName (Photoshop6MojiKumiSet1) >> << /InternalName (Photoshop6MojiKumiSet2) >> << /InternalName (Photoshop6MojiKumiSet3) >> << /InternalName (Photoshop6MojiKumiSet4) >> ] /TheNormalStyleSheet 0 /TheNormalParagraphSheet 0 /ParagraphSheetSet [ << /Name (Normal RGB) /DefaultStyleSheet 0 /Properties << /Justification 0 /FirstLineIndent 0.0 /StartIndent 0.0 /EndIndent 0.0 /SpaceBefore 0.0 /SpaceAfter 0.0 /AutoHyphenate true /HyphenatedWordSize 6 /PreHyphen 2 /PostHyphen 2 /ConsecutiveHyphens 8 /Zone 36.0 /WordSpacing [ .8 1.0 1.33 ] /LetterSpacing [ 0.0 0.0 0.0 ] /GlyphSpacing [ 1.0 1.0 1.0 ] /AutoLeading 1.2 /LeadingType 0 /Hanging false /Burasagari false /KinsokuOrder 0 /EveryLineComposer false >> >> ] /StyleSheetSet [ << /Name (Normal RGB) /StyleSheetData << /Font 1 /FontSize 12.0 /FauxBold false /FauxItalic false /AutoLeading true /Leading 0.0 /HorizontalScale 1.0 /VerticalScale 1.0 /Tracking 0 /AutoKerning true /Kerning 0 /BaselineShift 0.0 /FontCaps 0 /FontBaseline 0 /Underline false /Strikethrough false /Ligatures true /DLigatures false /BaselineDirection 2 /Tsume 0.0 /StyleRunAlignment 2 /Language 0 /NoBreak false /FillColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /StrokeColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /FillFlag true /StrokeFlag false /FillFirst true /YUnderline 1 /OutlineWidth 1.0 >> >> ] /FontSet [ << /Name (Verdana) /Script 0 /FontType 1 /Synthetic 0 >> << /Name (MyriadPro-Regular) /Script 0 /FontType 0 /Synthetic 0 >> << /Name (AdobeInvisFont) /Script 0 /FontType 0 /Synthetic 0 >> ] /SuperscriptSize .583 /SuperscriptPosition .333 /SubscriptSize .583 /SubscriptPosition .333 /SmallCapSize .7 >> /DocumentResources << /KinsokuSet [ << /Name (PhotoshopKinsokuHard) /NoStart (00 00    0=]0 0 0 00000000A0C0E0G0I0c000000000000000000?!\)]},.:;!!  0) /NoEnd (  0;[00 0 00\([{ 0) /Keep (  %) /Hanging (00.,) >> << /Name (PhotoshopKinsokuSoft) /NoStart (00 0   0=]0 0 0 0000000) /NoEnd (  0;[00 0 00) /Keep (  %) /Hanging (00.,) >> ] /MojiKumiSet [ << /InternalName (Photoshop6MojiKumiSet1) >> << /InternalName (Photoshop6MojiKumiSet2) >> << /InternalName (Photoshop6MojiKumiSet3) >> << /InternalName (Photoshop6MojiKumiSet4) >> ] /TheNormalStyleSheet 0 /TheNormalParagraphSheet 0 /ParagraphSheetSet [ << /Name (Normal RGB) /DefaultStyleSheet 0 /Properties << /Justification 0 /FirstLineIndent 0.0 /StartIndent 0.0 /EndIndent 0.0 /SpaceBefore 0.0 /SpaceAfter 0.0 /AutoHyphenate true /HyphenatedWordSize 6 /PreHyphen 2 /PostHyphen 2 /ConsecutiveHyphens 8 /Zone 36.0 /WordSpacing [ .8 1.0 1.33 ] /LetterSpacing [ 0.0 0.0 0.0 ] /GlyphSpacing [ 1.0 1.0 1.0 ] /AutoLeading 1.2 /LeadingType 0 /Hanging false /Burasagari false /KinsokuOrder 0 /EveryLineComposer false >> >> ] /StyleSheetSet [ << /Name (Normal RGB) /StyleSheetData << /Font 1 /FontSize 12.0 /FauxBold false /FauxItalic false /AutoLeading true /Leading 0.0 /HorizontalScale 1.0 /VerticalScale 1.0 /Tracking 0 /AutoKerning true /Kerning 0 /BaselineShift 0.0 /FontCaps 0 /FontBaseline 0 /Underline false /Strikethrough false /Ligatures true /DLigatures false /BaselineDirection 2 /Tsume 0.0 /StyleRunAlignment 2 /Language 0 /NoBreak false /FillColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /StrokeColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /FillFlag true /StrokeFlag false /FillFirst true /YUnderline 1 /OutlineWidth 1.0 >> >> ] /FontSet [ << /Name (Verdana) /Script 0 /FontType 1 /Synthetic 0 >> << /Name (MyriadPro-Regular) /Script 0 /FontType 0 /Synthetic 0 >> << /Name (AdobeInvisFont) /Script 0 /FontType 0 /Synthetic 0 >> ] /SuperscriptSize .583 /SuperscriptPosition .333 /SubscriptSize .583 /SubscriptPosition .333 /SmallCapSize .7 >> >>warp warpStyleenum warpStylewarpNone warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub warpRotateenumOrntHrzn8BIMluni?copyright 2005 Chris Coyne copyright 2005-2008 John Horigan8BIMlnsrrend8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMfxrp@@(  $#$((*4==967=BB5687;;>??<>GEJDC;8:?SRMPVRKT_\^]\\`\_`rprquuxrcqqrsv~ysrx}t|~qmvtqf[UV]bcmnkicbXDNZOOLJJGLLLWXNSXYPNPJ>?:884.)22,;B=:220+$$""%# 33333333333333333333333333333333333335764333333 5=>@>>?DG>4333333983?J<333333835GE3333353353CH3333353433F333332738334N<3333364337533;Q433333<39733KC333334D7339T333334<8933S=333332347833<533463GM32333335423=33763:X533333@33<3RF3433333@4335;3CV535333338?33?34UG3533333E533@3EY:364333337F33>53US432833333=E33@638^M37633333>I533B3@aI36:33333:M=33F3GaI3434<333335KC336E3K`M383?43333343KD33C<3K_O36739;33333734P=335K3P]G3>3C433333939S4333I;34\^=3<537A33333;3JF333DE38b^43B43?9336897653233337838V533DK34543EbR34C3G4334<>8323313333@3NC334IL43:94323\_>37B34H33=A6323233337>3AR33=RH35=5393Pji3j`dVNC53:E39H33B@3333AKD=536;EOZR@OT93E3Hj b3LNZcem`Y@3N36L339I3333 :DLPRSSOI@63BB39?36Tha>39JZjf^E3L43N733H;3333<X3573>;3_Y39T_jXA3J83I?339J3333RF34<:3B93CbU3:VbiP83I<3?J33CA3333;^838=3B834ae63BYgbD3K;35Q8335N733333JX639=3A=3M`G35P\gR53O93FH33CF33333TW73@53=B3>^[43Bb\\938N739Q9338N8333334T^?35A36K38^b638^cU934O_N3HK33KE33333KgN53F3M736\`<36Vd]73DUDVD>38QA33EM433333>c_J53G3BE38[\@3 7ZY]7:QG5335Q>3CQ;33?P;333334NabJ3G435R53<_X>37^cZP736V93MP933>PC333337QhZ93G53CJ3EbS83;]qU3=U35PP833@QG33333@c`@3J434S=3;Q`I437WaYG3NE36QR:33HQG333338^aE32453N3>S633 8BINPQQihVRNC63D4339Z^L3DS34F[FCK>E[AVB533333:``5327;GF38CI>438TS736=34=DWZM53`:3M[E333333D\U3RE?BBD@837P[?3:83C^T3\@3A[[Z9333333U_@34Y34I_O:3=53U^:A\q^KC=43?G:33333336`^43;T3=Z[QA3>3W^ a4343JU337;735?D733335337`T43OH373CRiahQ=3B^^>3KZ36CQPKM;34UJ334636F=333343833O`B3OI3837JdblT=3QWT3\O3 7EPPGD433B^<3326<;23E?33335638633@ZK3OM3<3G`ilO73C`_;3=f<3?LNQK54[P347434853573I93333:3<335]\4NW3=34M`meB34T]S3QW37LQHOQX>338<63537236M3333;35<33QU:Ca3>39[blR43LbZ73<\E3CPXqX33;=363D@3333=3?339BEFDA93M\E8c<369967;3Kj``:3733?ME:34<@73CVF3\M337755734Xb[QQ;338@3L:3333A39:338MF53 :<33A[P3O_43=34?A539Yjg;3RY^8383<33@S6343YdK3HRJI433;E35V33335D3A833>V73K63X733334I438F35WB3?WR6GU\ynNOX`fYI83?A3J>PccO3KL3E[R93CUg\\:3BNLP439N93[:3333;H3H83MN3 @Q\TE73=iS39J[aS;34O3PgO3E[O537MZh^bF3OSSF39P73[83333@I433>G3:]73SlS3IgH3>VeQ533G<3dgb3BUP637E\`jabJ43>SSH63;Q:35\53333>N86N53QM38;3:KYRG3X]73A^^>3=H3dgb3:NV93AXkajc\F3HMUG3?><>CHD5RQ<3?eK36ScF5Q34?PgO3QW>3Abmal^R<3?UUT735LVB36N]@IKHOISQJMDC:53333IX?43GW3 6:95339RR83Ve83KbMT38]e>PccO>I33CNI3@cldm[B3PUN@3ADPPabJQQLRMUURWOXQ[QKA43333?G4=M>3VK3\bgH3@fgB5QU83;[ejmZ@3>LTS43;N[tn_Yfl\JHF@A??A?EFOO[U\YZP?43533339M5335GPE8334c?3CQN3^43HwM3?ei\B35]c\MPC34O\ll]E35TUUB3 6BGQQLQ_bZlg_53 6;FM]X`YK73:3333463o\C3Mi_j`<38MOV;3 9HSSJRRE<343FE439K[YC36JYcYI3;43333 4:>=;;>EC83[xD3OPD3Zb533:6333348863UZYO3HI@3JY?3FO3G[@3;faU3;PejZ=cA34;33EVVR33@HSSPOC6383<`438SiK435Id]Q3=53333^X7WP3QC3DbL3SE35WP34XlY3AUsj?3=3 37OKO?LUPQSI6373KO3CgY:38W^^:3A3333ZS37_NCBKIPSJPHJH>>9334QQB3;YL36^933H\@3Ql\63NYnjH3?33UVXSTUUJ;393X?39a_<3Ea`@3C3333Z^JTex[OWQUUMRLQQJPKOKAOKA37`X3GY36SO3<^k>38QUkj?3A33K[`^KUI5358@U36_`=3:``E3<33335BSvv\UZhnEFAB?>@?FILPJQQJ]\N<3WS3[I3NV83ZmL3GqSTjZ3B335N^]\S=3:4TA36`]935]`N34H3333:M[`XnpF;59bA3 7;ELL\\SQO>63\^3Ag53=VH3>`a43 Fr{q6K^_N9O3 ;>GFMJPILC@E39RX[`_E34>GO39eW43Qa_:3H83333 8RXbWO=Jb53SX3 8UWYQKQQD73RT63_N34SK3UlH37[jhw\43@fjJ35=KOTSUSXS[T\W^d[O=3:MVW`\WG3>@U53@jN3@\lN73I>3333 IXcVG433CiA3>d<3QLEJRRISH83W\93Mb83OW736d]43=\fjoZB38fj];3;GXY^__YXQPK@:79@Laa\YM8hlbWKN?3D`h^3:JX`d``]WYRYUZbZcYL@3C=BNbehZVODEPLM3?HP<35[Z35J\d[I<437BOJ63333CZeL63`X3Lh43ORO34FRQNSR=O[B337aX3>UH3\e73CgbkG3QR>3PjjB3;EQ[^bZVD>7535;CPXb[BL53>\ouiI3F[\X837FLN83GdE3d=3MRQ3 6DSSRM[WB37^a836NG36_Y3@ime?34RRC=AECD>>\`kNLW\]RG53 >UcZU;UWPak`>@X[_A3:EQQD43\b539@CCB?:43333 :;:943OcV73=\L34cM3GLL53 ;NLU`hN:_c;34RQ3DhH3Ckbe<3HZ[stxh_H93^pkS43 BhfOQE37JK935cV368733338MD43KjJ3D^L3@dE3BSSB3;]y|sR63MR73Yb3 5OO>3 6FMQJHz~RROI=3FX^psWU G<4>|pYL?P@3Pb:3:CB<97;63333>P;3BjM34^Y;3]X3=OMD34Kr|oUJU=3GP83]S39^dj^`J43PSF337NQKFHSUvdaEIQLL?3R838eV3@cV3Kh?36RSQ38[caSPLVA3MW934_L3[jneS63NSI3@QIP>CPSLDmmS4@HPKL<34KLXXE6_N3 8[huQX^a^UA539cU36K83333=T73W`733Q\H336^[3RSS63 :a]JIUHBVVUIB3JU83;eF3NavgD3DKKDMRN7GSMI43N_kS33>JQLH83GYYNL338bB3QXxu39FUf\P<3YU34M733338U;3AeD3 39`Z>33K^E3KQM<3<]]D3GNC3>UKVVD3QV:3>]>3;g{o<3 DT\TNI6AMSN53 QleJ335DKQM?3:Y<3E^633YmfrG36HXcS<3Xb63I=3333PF3\Y33@^]835a^83@QUI3 :VcD33NRB33;V;36QQC3@_;34`rx:3 ?\\VK4?URJ63NejK3:LJQI43DVYYK3< QM33cnZ[_;3B][P63MX;39N3333CT3Bk833NUX73>bY43 =UUQ337YcE3QR@3?VVJV<3;MH><3Bc83Fz;3 L\\Q38JUT:3RedO3FQIO:3=YQOV53> 8]76mbYV@Z83KY]<3N`A3K=33334Y>3^P33R^Q83N\S35UTO84X]J38LJ83>MWWU93?QL3C=3=[833CxB3 HJ^\P4OSL=3 IjgYEHJIO[WL<3RYC34 @KIFmSRO3CY93=U^C3HV@34U3333IR3;b:335L\W94X^O3ENUFMYU43=QQ5359MZXZM>86BJC33CG63;^=CVfhW3 CUUVQNCUUK34B_ss^:545?V[^A33AYW53 6VcM43CUUZ`[63$@JJ9CIRMRK\]Z\\KQZYRA?99IMGEFLudO>af93 :KRRATWWKQ63DUK:?``_:3 7PTVD4NLXYD333#MY`PWOTKKFHR]\^UQZZVJROMG;;?@>VH3@]V3 4QUQ;8V\[VA3=SO:36[b`F3 7IP[P[[QL433Ozg^[V3P]YL?@HEKXql]J@DSW_^Q<3CXOQ[SM3 :GOOSNTOF]7X[53B3FUFHaW>3HVE3HP3333MW3`433@Wmgg_]jVH\_SONTpcbPQU[ZMG:37WZ``F37FOS^znM3CN[ll^NUPZRR;356`aZ3 5G`[knh`^F3LYYe^[i[3F3OW<9X]D23CXM3?[3333TO3^33 =Q]VVQSWPM;[\S_roO34BVZPRRJQD93@[]XT636HUr]F63 6\u{]>39WYXVWI3EU@34BlzxrgI@><=AGKC JYYdPNLLI:3;3=OK34R`F3@XQ35g63333^I3Y633#4OW^G734GUOQSc]\\gokXR33GQQ:BJQSKSM:3Y^^YJ38i_MT@3U|vU3HWZHWWR53KI38X]dpkkqW]ZVWTI> 6MRZqa\H4?EB734B3MU>33O`B38PT63\F33334hH3R<33:Y\M63B8JPPjiepp[VLPH37AF3;GLSSNN=337U`[YY;3Tfi[VUB47V~gO7334QLU8GMUF3CP3 NQMWPLVWE:9533UsrcE34=@43A39MO438O`>3VW=3I]3433336aD3HF33A][>37?339I^gx~_df[WZMKA3 6BKUUKH5BQYTF3 ]SBh]LWU\sbWM3AXXS:>XXU4338X43 6[\\X@9VRJ633V]prO35@3@3KR=746TW73GNF37g>328533337dE3:O33G^T53D53<;TtaOfhoj`ZQQH3 6FSOUSNUTVNU[>3 WM33:KQ733>[K3CUQ3O\37633338jI3S633K_M3E35XZ]Q]][U=LTB437334;3RP93J\@3:PM938aF3=33335bK3AH33J^H35G3AQ`Z3 68Gdurxh_B53CS``P:Z[@3 SO5K[gZhjc`K3EYWT<=E4UYYH335T:3KXNT\=3DOMH33D]\33?QO@43:437>AMH36RT53NRE3Hd:35<3333jT3O933E`G3:C3R_f<3 =Y`istreffTD953 H_^WQM[ZMF3Sd_`\>39bnpgKCF^fcM53:7BYWN:33@N36\]]YE37WWV633J]V3BNMB83:A<46PN43FWA3ERK43U^53@3333]^37N43Y]^[[=6ONS73>3JSYP3KD3J]>3KWV?33O]P3;FNKD>:9:43GN>34UU437KQ>37\O3@43333Ua433LQJ3D]=3>73333Nm?3;J83P\53N533Nf]3%EXYYX:38CKKPKQQKa`fbu{ilj^Y\][YH=:X>3 JXYFOVY\ZYL376QYPI35LB3UYNX]?34WXX:33@^>3466565IL<3[T3463>83333=cQ3 :PWNMLJGB>93;b>3:K334RtE3GE8OYYMV;38?@LOK]Z_USeovd_SGB63YI3 4YTP8CYY^WWA35?OZ[>3EH53B^UG3KXXC33I^535;>HLISQRSJRQO]YI@<53KN934NPI3?e@39?CJJYNZR[RWML@93B53333f`36863:IVUNJRTUX\gf]QB3NOM33R^W35@HJUULUULSRQSKRPPZVSJQOGNWE3CMI<3U38?KKWWRXRaT\V^W`YbZcVRB73G3333OjA39BB@ACHJMMORNB538FWefAbeB3AL3>\g39IM437XYZ\VLPULVVPV``XQbdetxO@7333K__ZM9334@OWNVVNVUFC;3 JO@335=C\^RRE:3AQN>3 7bI?EQQLRMIA436;3:ERf]]?3E:3333^j<35=3NmmXaQ=38U>3HcS3CRQJJUUS_^a`_WLVT``ZXOXaddcmqM[ JM?BV43R[[I3NY^V[L3J[835Z__]LD3IOM@33Y_ ]3:JWMWWMVQB:3GQF3 CNMLURI834GMP73 5[iPMPOC<435=38J`fS:37K3333D_W3:34=BDC@:43:OM7L\cV:39UB3F^N39SXZSKUURZa_^^S>;73;XXP;<=@IQcpa[ L[[XaJ3X[[C3V[__[[@38[[ZB3K_Y43JYYL39_ UQNXXNWUE73GRI3 >QH4BLWOE3>QQF34=P^fRL<3B34NadE3L93333_h?343 ;KNHDBGLT[UE43V^333>VfL43BYYT3D^ `b]YNXXO>43BKE36JI3BRXL9KE56633=NMNYlI3D39VjO33GB3333Aa_36IE63@U^K636hD333@]^ZD3GWR3 8KRJSZZSB63 4QRR[[W933X3NabbaCSFM[Pkpb`\:337MOSIVO\O343B\B3<_ZN^_N3:VPK5^X[``ZYWH;3GSM3OP836G[T@:LQQJ6FQQH?WG3>:38=<:53IkV?M3333[aJ3;G53 =Zk\QW\XasG<339mm:3 NUZ35GJQRRKWTG35H[RA3VXX53@^ba_IR64?MYT[]rm_cWC3=\>P\@3534Z\\S35Z_MP63;[Eaacc]UK93EQK3EI<3?T^XQL6OD53ZL34H38A:3@jm933339cf=39A34DUX\qcEDGem_l_P@3RSJ[83 GJ[>KQQJN=3QSF3 4O[[UT\HJMO:34WW^a^CF3 4BZ\bvhc\]WD\9;[\\M53 433K[PL733P_<38[[]`cbccW93JRJ3DQD38Xm[Q:43XS3@A3?@3IwS335333L\^834B3AUK;336]Z73[G3;O ^ebDB\83IT43LQZ_IQN<3JME3NVP\[YYB3T^ccbJO35DZ_th]]N_`\\53IXN\J3373>V]]D3KT_H34[_`ccca^3KSK3>KC3Ddm\Q=3QO3H<34>E;3QGiG338333XeV73?537PK634[X6g;33@YgsW3OQ3JVTjRA43QUJ3A\^a\G3K^acaNL73K^dsi^P_aaW434U]9435]RH`^N^_T3;]``_bb_L3HLD3?QL3 53^^ac^O?3N\dffacK;3E]]^T3R]_`MT7334RTR3?ZJ]cbbR?3\^``][C3LX[S4Qkrke`__I6[dRS:3BRRb`:3A[Wacd```W35UUD3=NN:@LRKQK33?Jh^@93VS3C3PC338dB334;333:[cX=3:35L43Ty:334_G3V\PQRH34K=336?JUU35S\bT^O63OT]caRK3LXWU33CbjmolkibHU^^O3B`cca`D3C\^bb```E3=OK;3 8FZYSRORHA437enV35PI3?B3[=3H\33>333;Y\`B363H73;vU33>`;336ZaN3;OXgSSQ3EG@=3DNM634Lac\`^^Z@33U_^aa^[3O]]Z3N\^b_WV`^93?d\``M3 GQW\^acc``^53EUWA=CIGSRUZUSRC=3GjpS33;WJ38M3[:35^A33>3338Z`YO439B38acC333If434TeOOQN3F43\RY433T^3 4Tt_O:37SS>535:G[YA3=[ac^^WZ__T`_`ce_C3HRSR3U^^\Q_P_ caZ\43:XabbcdW3A]EWcQI:36BKJWWOV`\[VMUUIKBDMJ3?QWcge\;3@Q935]839\33>9333IV]^J93D3TE\C33TX36JjnK3RSB39MME34Y[^N_c_S]aOP3M^ 833S\]Z3@Y_cbB?aS^cdA3I^M]]L8baM35BOKXXSVWVW`^QC=:43HSL3KMJEjqYH63;PN534^;3A33E3333`B3?a_;3338C3335D[\R[P?5354566443;63;QC_=3Y[3 CSU>AaZ43GSR3RVV3>[@B[__Sdlca`J3H^<33V_5334M_PdbcbbUc`_I3338ENPQPKC63VL3QccJ833F5333 8IW[TXWGA636;BFCNQRGS KSSNMMJCB?;63;53S9ZJ3X[3 @WQB33QWH3@OM73ELN=3 W[[O36M\Mddkd aQ>93AQRR@33U_63A^abcddccb_TRUQ3<^TW^S45^abaca6336JZMYNH:3>VVJ3;SS=3@[]D3MV3DIa`GaR;3?B3337IMXXOWWMKBA=9;93APS63CWVK;3 D^63KZC443;M]K53;I3334AKSWRSUPRRNR\RPPKQ KQQHQQOPRRKSNSSMULULVSPTKC633<34QEW :3Sc33MXM53HXM3SUJ38WWR36Y\\L3S^b\adaQa dccZ?4FUY]CMab \ddbdcd\8^_43L_ ^<39abdeec4333@V[O[[ZB39WWS3PTG34MQKRQ936fDLW;38QV83=M6333'6ADQUKRRL^QJPPLPQQJQQHMHDA@=<@??AEFDPSUKULVNVHOC?3BOZA3Tm7=PX:37\Y7EKP73JMQ=3R\\Z53`abcdbUa dcedba]`_`]bdcbaa[Z_:3 EXP__B36PbbeV335KP[PK73FWWG38UUE3EME8PMQ:3Ee`733EW<34FL533369?DPGHCFEBA@>985347?DHHVLVSRWI?3MbJ3EgET[E3HZL?UUB3GXXJ3A\ZPE3_`^\ccY`aa`c\ccbb`__ccb cbdcaaY`\PO73:^_^RH33T_QacdcF33>X\QZ[U<36UMN93CLL:3 7NQ;37OUQ;38o}h<33>U:6ESD333@:36dXRW539\T7TUI3;XXU34LU][533]`_KY`aZa bcddbbV_adbdcaZWddca<3V_\63Dc`cdS733AU\OD3FXXO3QUR3IME38ONVB3 @}kgKaQIB=7668?34>JUMXJYYM;3QK;FewY3683@[O=VVJ3DYYU3 6\]]R73TWUTR@_O3 Babccb7`cddbdb\JbbdY[<3:``P[N33Tcdec_J33T]PK53FVML3MSK834OLC3BXXO@35Ux5346643N=333I43AUXXVRYD<3W R33bc>=<73QX>SOL836XYY=3LRP\N8a`[6_YRR8339\TQSC3[dbcY\HRbc[bccK43V` W533IbcbdcX_=336UL]J34WYYD38VVP3BQP63=MZ[L;3@]kI338N333M3?ONYMXYO;34QI34Xv^3JXG@VVG3HMQV434Z^?a]3F[__G3U`>3Tcddb cdbaQ3IddcdcZF`F3;Zcda]M338X^[R\C3AVYW43IMUA3Wc\@6N337I3337J34=@=85563>PPYXKXC39OE3GXRaV34UW@HLPH3LYYP736\^QYbaY36_733H`T3UG3Tb`\TS:3_bddbWYSON63V_`ccL_bdcSUPXY35U__S[@3=PYYF3DUKM3DSS@34BL`Yc\cYWYT\]aj_UC3@A33C83337P3A?3CVXS[PB;MD3UX3PeH3AUS3KWUF3G[=3 4Y_bd^TQE33:V` 834L[aaI3TabdcbN9b >3`][X?PYJacddcbda`[?3L_D35W[NM536UWW=3FSJF3 4=HMVYYbX]QKB53B=33;>333T3@>34D[ZJ[VTF3bZ3DeQ37OL8:KRX>35W[ZN83@_cddbbO3[`I33Oa X3HZRQ\PVWJ=33bD6b@39YSdcdc``63NVU__L3J[?3IPWM3EQSM43A<337A333S83:F3?V[[MZ[\_N6\O35ad53QR@3HXXS43CQP[R3S^cddbK3I`Y53@a78^bB3]bJ8b=3Pbccdbcbddc`Q3H__ZTO3BOX[N3AXVK93IUNK63=<337?333GI3K634GUU[[]b_GdP33[a=3KRD35VVNL3J[F34bdG37`XQ[O34`a^TI3]bP3Wbb]I;b:9bbdcdcc`>3?__U38Y[RN735UXXF37NPUP639@339>3337X43;F3RQ\\>3>Wa\_aK39aN3=bFBbbWS?[cSUcYLcb4OP`cdcd?3V`\Q^<34TQW[M3EYYU:36MUOUK43D433@333<\43O43GVZ_^}o\A@\U3>JH36VOST43B\Y837I[`C3OaY>3[bY5NVccTUc]Qc]Qc]DccYWcd]348L`D3O\\RL53=QYYJ35GLVVNC38>334@333QP34P3=_a^vpRSVd`3?PP53;XYYK3M\[NZ93;FNQ`a``[=339aXQ`^5IbbaVDUcbKcMcaVcXWcNc bddcddA3N`\`W43F\X838WVLS435BSVSQQ:3@533=43337^D39M3H]^wuO]`lY333A\bM7WNYc`Fc KccbYK[WSOXcUcS4Zcd K3>cdc^a]833K]NZ[<34RYYX737EUWOVV@434A43396333?cB339Z]PZY83Rb abdcaaZ>3AbYX=ac_TTQ\fef_fcfb`SU[3 bacdb^VbC3T_O`c[McXTefbfbfdfV@3 QccQYZ3?bcdPbb\@36U^[O]J39NY[\UEQYQYYOXXM73333:YiJ435W3 >QQYf]_prb^W73>QQ:3BK[A3?]^^\UC3Ibad]SbE7LcQaURefdfdfefdfdfcfV:3Bc X8>abcaddPabbN34>BNYabb`WSRJJLOK^a[ba[RYYMYYVC933334Jk]F43U:3 4HLUbD[mn_^^W73?QQ:3C[NH3 @^[R__H33TbVbD>cKafcf aXVNMMWV_eefcfdK^cH@_bZYUb%bTXD=MT[T^bdacdd]\]]R\\]^bba^[[MYYPK@433339\cbO93NE3 3HRRkHRss_^J53?KJ73D[L\\I3@K_M;RbKWb PcTJcc`SfafeXH935ESdfedY[ccVJcRabbZ65Xb Ybdd`a__[ad`daY\]]P\_cZbb_T[XGG<3333=QidYK;3 4>AUbIHEF=;533433 LSTc\\h^^QX__O3IQQ36D\\O\X:3<^ccb_acba534H`cUXfeR734Kcef_Mc I83:L[Rbcccd`d`\aY:643@[Q[\\G3333413;IP_[e\d]__WQIHZcFIKNVPWOUUKI<433 >SLYp^UNRZ_K33IIH3473CMZ]][A334Hbaadd`_]dcbH39Qc^Yecf`D3:[feb`XcX6:YbOaabcd_d]R638J]L[B3333635686437a?3 7?CNQRRJPG833ESTvlI3W_E6RRJ393 33CManh73<^__U53DORQIA73?3;L]cdcdPbXB?[``Sc]F63OcW^cfX43>Yef^E3Lfe^LcWbbUD;G^aQ``a__`M_cbdZL837;AFCNQSJUUJTRKJHC;833332393;]R35@HPQJI8334X_Z`U43@_Q438]bb_]F36;D74?X` abdcddc^V?34JW[a]`L64ZcaWffdf^638Sff`G, %@[ff[=3TfeefaYcH7BXbWaa`Q^F37IM_addbcddcR^^\UB?;63 5>APVWNVVMVMUUKUUNSMSQB?6333323673@`P34AOJQQ?433 P_fhg^U43=33?]b_ T33:<:HXc]T`QbdcT_L637TaPbaJBJbcPfd<3Ddf`0!XffO34afTccRCH[bSaaE73 :Qa]ddbda`_Q^[Z]MRPMEA@?>9::;483H__^aP` YZ^a`XZ__]H?3@ZX\b^]c^MP]fJ3Dee@ 1afP3>fcNIZccUbaPaS:3BL_P`aa__\U^S]O\R[X[ VYYXVYYSWXXOWMVSKEC@9886799:?AFNLRRKQQLF:33332543?3E`];3338E[`_U_SN84>II\^N]N\P[W[RYQYPXXVMGA93 ;DFQQIQQC<333323B3A\iL536JONRJ539IAJ[eVN@OWlb_ckfH3\_^NP@3?X__O` TUC433BY_VcVfeE3>ee.afJ38deffa]c`X_L736GY]]`O__S;3449IM`aQ`^J>349>=EGJDPPQNNRQPFNJF<=73:CPQIPB3333532434C34543B_hfL93;NLSQ<3:JR\\Q[P59:834CVibjbaTRJJEECILegqr_`XZM;33CP^aWcba`_G35DVaNbTc`fa3CfM4fP3XfWc^]bU_SA3=PMPE33335835:634:?OE34;942=EG@;78:?G<37BTWh^g]g]e\d^cqmq_O<33EWZa`dca^_]839BXbbZ]cVfR3Qf,f^3EfQcPbbWE538HRQE53333=3 8<>@BC>788D536>43;LC73D<434;DFNLTNQKIFQNPT:33 DWdbccbca^_E38GE]cPfI3_f\f93]ccbcc^H3 8?>INSVT`bbQcQf=3?fI/fL3bfVacPaZTM?>63=TWI43333B3LP43NF38?35338PM\[Y@43JV?9ccaSD65?U[[O[[ZW[QB?53;HVR_O_Q`Z`aSbXcTf=3?fJ0fL3bfYcTbXaR`Q_TG=3GTY7337:>A;333E34EK=3\R3I3;N>3LVVQTR=3 HVVM3E`bb__E3?IX[[P\ O^`\aa`Q^__R_U``ZRQPKFAEB?:CEHKNbfB39f[BfF3 4effdRTMDD?FLSO[aX`P_R__[J=3RZI33:E5333G3;NB3@TO834I3BL63DTMV;39BE?4Q939X86S3A?3>Q433CT7AV R4336?GEW^_O_W_`RaQbQc_S^dff:35`f! ae=3 `ff`\S`ccTbPa_G=35@Q^R]SYZG53C=3?XT433?A333G;35OB3OI33ID3=J3JG335VH3Y^ XVQK337LZN[PQ=3 8:@DHEORTVJV ISPNK?AAO`NfL3EfXBfR3@f S`TDII]bbaYaT_`WB37@S]]P\KD3E=3R`E33O333:I3EO3]A33BK34O:37X5334VF?^ SQQ8CU[[TXZJ636TcVdf_3Zf6ec73SfPcW<336V<38\;338G63G3HL33NVG3338O8343HO3;[733M[V3@P53V?339VK4Ya_]^P6Y]_YWTJ63]^_aaIV\\^ZJ537?S_aaWb[]c]KN]fK3CeeB 3bfO3>fdKNYccWbMT93=I[_Q__L534GO[K436O35bT336Q333CP83733=U63 =b;5ODG<3?X33OR<3693 R`baX`^^]^YK3:@R\`[_aPbGDLacSfd<3Ccfa2#ZfeM35afQccS@J`bS`a`I435I^S_IA34J[PXYS83O73Td6336T333BT?3573GP39\EPJ43AWE33EV?3ET3699=OYYWL>3GB3I\?339S333O[OYYB3?L3>eL33@O3336KWF63=`G6434=HQhT37Mpf73KX43;L7?FECCEGKLE<3CE43:CO]V@UP3 RhTMRMOGD>;843CWX[SNUSRUWaX[abW?3 =W[\L[[WV[[N\P]V^^[Y_S_YQA?638K^aRbO`INc`Rfef[83 4RffdffZ[cWGbQb\:33>K`M]C3 333AOZX@R\R4563567635\d^:OR\bYPB338]D3CNcuRG@736LVVS65>CSV_bdb_^A34SNG4;BCINQHUWXMZ QYWTKNJF7438GZaVabb_D5Oc_Xdcf`E3;\feb`YcY;NbNaH33C^`V\__O@S]__L^`cdac``^T]P\YX[YbQYLYYVDB73KH3T\339\43338HD\?5634;FFdI`RL>53D^83=TSWPj634NUJR;3Q^cdccYKOA433NSS434DW``RaQ\G43CacSXfefS834Ldef_Mc I9FabS`aaQ 4338RW`bcdW_P_cbacc`U]OUWXUSW[[S`a_^[YYNYLXXR@;33 QbNbccVQ^VffefcV935N`fcff\XZNcO`]83=KHMSNMNF@83FUH3@^93 >IR[[YUPI@638TVP73aL3CMRUI3IUbY9@TWSUX`ZG?636SqfbA34dG3^ffNA3639LB3[cddccbbac_ddcaE35S^^QZM3CZ[[O3 ;><=?VVQ56@L@35CRMUKP<3KZ36hH33?gG333:RA3OM338MacdcbbZTcd^ba\a`__Q@34QSZ]]M3L[[R@393GNPK3BN639JUMUB73D]3Cm933;cU3338P:3>V83HkxlROMHbgEDHMU__OB43F\43<633563>@3F]B35gT37QSSH733P_a_PO:39U3G`TVaX9Y`Tbb]:EbUZc[HcQc_J[WSOYcWcUAbcbddcYZaccdcdcda]J8?__QZ^=3F]XE34SNWX93=3NUU>39R839CTUNQR>3Ab3N]339a^53335N835TB37Y`e?9@LwfKJFA:34]M3>;93D636ZQ3Kh=3;PISO733I[aa_[D37MLJ3;_``]QA]aa]R]:gA3<35C3L_63 7]Z33:QRRE6338O_`_[P39V63W`_ATaU86]bL8VTccORc]Qc]Qc]AccXbc bcdbacdbddba`>3;]_I63ET\F3BYYKC3AUUC3CN39OSKSN:3Cm533793@37bF3IdIAQJRJ5337UZ\`^U538V73M Y``Q`\Waa[:3KRbW3NbbSN:YcVUcYMca3NNadebc bdca^dcRY`\N[83@_]N]Q3B\\ZLC3IQYX73PUJ53S>34@SKD63Dd3P]33Gh[;333J53Q>3Cef=36\f@3Qg?3;63;733O^3XoWQOA37TY\^WQ937VVT83<__ZS]` U\W63FaaO_^78abW4OPRTGNUW\RATRPO6Fbdc ba`Oa``VUW__S3ES^E3EYO[[>34TYYL3=MSC3PJRRN@43Ic35dD33;UiS73337B3?L3H]c<3:ebA34ThD3;737:34bF3;UnnTA3 PYY`_^E<;73;RQQ73U__`_T`F43AaP<3Ob?6b?Vbb]JLK<3GO3 6DLQQKPG9[S37^C3@U^fO:333D37M3SeY333;b;bD;bcZ=3YcdcR33:YL_dXV_L37N[]]H3IR[[P39X83PSH38]3 6DHQQKSsW<53SR3=NXd[U9333D3@D3 8_YK33;[jT73?f`L6E434B;3933`C36FVK838APPIQJ835Xa83CjzurdYX;3337VgcC36X_eNF3 5@43273:i53 4J`SQQJPI:3 H]<539Wmqj^Y\ZH3BXW<3DW39`d\Y]C3K`V3Pa<33B^`aZ9YSPO8Gcdc:3WdcW3G_]Scd`N3H]XNQ34TUNY<34VWW636QR=3SH39<@?<536YmMPJQQLRMPMGHLjKGHNQ]Z_^\QA4333@3K53NXa<3 O^iU>3346753>VfmZD733>433423G^3 7BKMXkeQB:3 A_cULul[MYYTQD3FZDFWWV3 8N__cdd^F73O_Q``X633BSPaaO3Ba\Baaba_acdcQ34`dcddcZ533ZW3:>IOKRLUUQ]oaQ[V\\XTF?3333>3L34YcX=3>^ambSEINJB63 @SsaaZPD943OQ48VcdcaM636O_a_ddbM638[\\Y63=YYTB3;NMP3ALK3IV3<36HP;3=gJ3 7;3LT363 9KnlL?CHHJMME:3333A83>;37WZ\P634>NZXbW`[osW\WZ[Rcg_gbL[>3 B\NZ\ldXPTW_sM3@J@3 599<=?:;9734RWh_WH35BIPS[[R\NXGC]D33RN34=53cv93333:7:37@37Q^UYB323:?HIRifWS[[QXXPWZb~kH838CTs~g_ZVHWOW[>3 HQ>:BIOIVVMVIW7AWZkWV539>??FHGTXWZ[[O[[ZSZN?33M] 933E^^S\_J3?_^63;Zddbd`@5C`U3S__ccbc:336\]]X@P\\TW[TRV[K35VXX?3DTM;3EQC3[H3933DddO3333643473D363EW\ZP<3#4PO34638YV=5> N[WRPUUKVVQVLW5IWiWW=3HXXNYYPYW\Zb]M[WL;43P]]V33E]^LC3G^__N3C_`abaabI33ARPQH3 6Z_Vdebc^E33M\PN=3>UR[U^[Y43FVMI36SUH3DQD337i?37`W:[A333345363<:3 233;UQ[[I:38UG38@P\dRU[c__hdci]XVHFHRivXKVVG63?d_YS[aWUMUULVVUTVVNW3IWa[W<3GXXNYYQac_NPJC<3 >YQQD:U]P^^Z=3:_TQZ:34PJ``cdc^S:33J_H3;L^debP][337T\\N3=V[RXc_U<35NWW<3RUN3>LC33H^43Q^I3CZ4333353243A43 23324CYUWVH93@X;37cPRJQQE<3>PUUK[vfTC7339EGSVgiY[VPFGA:;736647=?@3?W`ra53@LLDLSQE=8323G\B]YSR63K_J37V_]O`cdcda_^433T_@3C_abdbG33P\\[635KT[_`[R3CWWJ3HMI43@PF33WP3HbS433ZE3333236>327FVXNWK<43PQ3 M=3;W]_a`83 6RLM533BUU73KUWTRSD=43;\?39O33?GQUXWYUUQPU@Ha@CKQQJRQFD::P_\;3 6OWWZjN433663KUa`\SYV;3QF3Q_3?U`?3:i733335:53164=MISUMRRFE>7533ST3J?@EJS]Z]Z^VTLVM<38fcQIQQD@538]dV83;AYD3Cab`]\[A43 Q^VR@3E_\O_ V76YcdcO833?_J34Udeed]O433C[83U__VU83 ]\QE435>IL;3;I]bb`\P834]^^Y3H_[T_Q433[d\3K_F36[ec`baJ337[C3?^_aYU83MO536SS@3ARCPY63?[SK3UQ333353 4;GPJQQIPPIQp\QMQQJRRV`SSJSRST>CQ>Rf?3:XSTOPA53EDOPHQkfQKQQHRQaME<63NQKOh;3 3PM7DRKOA73>]gZ9353 4@NUX[[X_VJ3ENU^Q]L_\<3 R_^cN335TPSW3BdcU33B[[Y3LNTVRXS63=VVB33OSD3IVaX439L[[B3Gh3333<4378=QkIGHDGG?B?<5@?34QNJb?3 3PZ53:FQIPE>43@ccW83:3QWPO73>c:33338;3^X37@3AQ=JiF33;\G37ANIQMQQGG@?NieV3:>@LQQ]XWTYYKN?434KOS<3393B]a`\^R43 Q^`d^]D3U^^Z3D_Zbca^S:3JYYI3 5PMJ4PSQUA336\X3?437?>633PlF33EW?3>Nbcfnjqpimuyv}~oeXQVVQWZJE<433<`caQ[S=3DYYP3 IWW?33AUVV:3;=63IQB3?Z]X;35?EPKRRD93E`83333E53OeB3;53=@@733PcA335]R3ARd\[G332723;`cc`]H3;]UA]_]]X3I`_Z][OL933:RQN3@NL?3JVQJ5;PUHMQA3CTSUX434:>FHPPJQPC83Kh43333<=36`b43;53IQQ>33[m?33=5;73?TaaR=33?<33CYVbP8D3@=DD?BUV\McXLHQQKQNNPFD63Y^3333H43I`O3:3IQQ=33\c9336XbbIRbP<3 :=33F>QVYY3>;3=XOF63 AYYPD533583P^ca]S43 6Z\VJ33BR`c\N839I[__^ZJYOYOZYX3 8VVK489>BXVYWU^RLUUISRT`e\T_bVQIQQHPJ>93\Q3333:C34bf?363EJI935mj33Jba>@3 @33CC3OMKL@3C34][53@X`^43=3C\_bb_3J\C33;\cc`T3E_ _LBUPXYX[ZT63 6de83GPP=3@dZ334Ob<3;537N37U9Q7>53G>HS534DaVH3>38LS`bbS34OY\V3UacaB3O_ YS<3=TYT`aaMKA6=@NRJ__ZSSRQUUH[_ZUY^NBMOTUYNHB=V`A53I`=3333L43Na^43JPP:3SlP36K^AabbY3;33L;3>UUS3;R9:3>M<33IN34AJKFXXQ36;3P[VW`UG3H[TL?3W^Z_G34W_R,W_[833=Daa_TZ[\\VTSO^_\POKHJH8T]\VUUYXGANJQI@39XP3T`433335K3\lT43GKM73]eB3B`Y_?>OK@73;35S33?MKE33AIQ8AIOF53MB3AOC53`[U735XY83 73K@34TUU;3DJ93>?BJE3=WWK35A3POO[ZVWZ=3C[UOI39XNUXPQX73F_#R[PHQ_^\E?536;ELI^_YUUNSLSSKUX^XUYD438^R34]a43333;J39fi]937KMH?R]\]R634UY93F_I33339N39[la?3=RQ@Se\3L\^8333RaB343W83ESSC34R343:M[D3AML=3D733S[N9Y43IR[Z;3 WZYYT43=YYS38VMYV738SYYM3JYYO;3?VW L=35TI]`bbK3Stc;3:^e]C35dggd53L`N3333@M3 CYiiV?3?UU]gT36eY533 N_S33DWPSS93\3K:3;LG@VVJ3 9>5WkZYD33:YYU36TYYL;34RVMU534PLYV73JXOM53U]abcPB36TYMK43L^b\I3A]^B3?ZS733337S93 7V\gg@QilO>83Y^:33R]W56gOKL3Z83@B39MfePBB@?93:K[jW5336MNL3ITYY?3JY938XYYO34OQXE335Q``X[\N5337UFISN3HXJUZQ34QI38R^C3333LI3>^]Bz{xgR3DcE33L`^:gfR>3QE34I3ION743JYX^S36XXU3LXRQC33QUO34WYYWP=3WXX43DXC38VXOJ3CRXXC3OZS<33>SZ]\OXWC38RN93;TY83R[V53Pf43NSX63333KQ43nzuhgg93Ek8336`un537c53F3MQI3?YJ:Q533LNO6IWKXG3KXXU73MXXM;3FUZ933EQLBZ\UUbmO7ARQ43 ;YX;33E[]=3F_<34I[Y833335VI3;i|ugg^3<3`R336QWlqSC73YH3E3;UT>3L NW;3JE33NWWKW@3JVMW:34OJWU<3=^[;33OUP38RL[o][LMJB3=\S>3@][C3=iF34OWO>3333=ZA3 JQmkg_;=fV6UU;36X K339T53GX_YNWE3GWWV;3QWWN83IE334LNF3H`j[PZ`\B3C^T;38\[E35cI38PRW=3333GY=3 :^yZ8;33Ab[aXY33%8QQF43PbC;CHIIHoP8338=7>FLMFBBEFB?GUV:3BX@3P@3G[][P=3HRQWC36QNTU=34J[[J433>SS:3JZXP]^_TA334M\T83Y\P3bL3?QWQ;3333NZ<3Jm}g636Ues_33EQQ=3OaH3Ee6338;3783CSR993DTXW53DPJW__\:3GVVPA3 5LVVQE:<:<;4K`K33GSQ3K3>Z``^NYTI\YO43UZS3dS37@GGDD=536GUOP833335RY@3=cwiI3HiL433=QIE3J_S43\R335=3CSS3535WSOG3BqQV_[V534HPTVB3 9FQerlvfb[``=]`]334PKA3 8F33=Y_QX\jxdI3SZO43\O33=MH=438??:53@QLUK433336RZK53Pu~_3=oYbW5334MQO63B]\<3;hB33>3?LL333:GUcaTT[`UPQRJW[VK?3AMadae]kpvko_``<]`]33ASS:3E633IQKIdsv]YYTB3NZS83^N8MJ7369983;LKRP>33334OXZ>3FesiA3BYBbZR433FJL?3 ;WaL633Ig<3=3BSR3DW69GUTVukNOfcTBDSjmuv\A434?Pabg`_PJA<@PNUUC94M`M35333HKJ3 9A339JO8Nhj[LYOUI=3O]T?3hUT=3HM\_j`hRG73 4LUOSQ;4M^^M63533>RR;34D3KPBP^F3?QYOXKF=4IVK@34ma836CHPPHN=33334=HVZZ\b\]^QM<36N[bSA436Zard@3AR33D]YN336KKN53 JUUK@334I^=3633FQM3 6C433>JLM_B3?ONWXXQWLZaVJ3A{B3 5:CMMQOMN>433336HVWOIB>;?AGRXbe[O9;Nc\^J<3O_qq[3>T3I``B33KQO93=SV^RbhF737RR:6?FK^]_bcU93 LI3?[^VUQ93 7=DFLIKC=<3 DKSSI73X`S356338TS;34<>4337PQJaD3(5GSXJXZZK`b\]ROCDCjp:88:9:=?AFFMQJQQIQL;433334GXM?436GWf`U8;Lb]eZTH@963NbXMVE38W3QU]?33DJOB39IVWkugIB;:654459;QTRQMQM^^gX83>ZGM^^WE43 49358>=CC@C>=83:OSLRE?X\B339433ETQ@;;535NJJbI3%6BR^jx}|kfXVMUd|qUMSSNSSORRMQQKPO@:3333=TL83OGPPIQLRRMUOWWQRE@6334?PRJO\bX33>333QROOQG9334B637N73 4>Q_aT=3YfOOTR\U\KRMUOaedT[ph\WYH?3GS639M^_XH5IZL=4369973333L63JcmG3<_e[B33Zl `>llboq^L83:N3GS:9=53@SYRCVYYW=3DB364348433?PRKRQ@53@C:3<=@?53333>B3LjaE35Og]\:37Zll^:6ET\tbmlb\@33FB35P[ [YA3MQYkX>3;MK4FMOQ93E?3DSG4ISSMD63 4?EHKJRWEJTVH73AYdTfb3>TVI338K\TF3?U3IX3GnqA37<<>;63=97;:9643333I53Llg5536Id^dG36C977>BDASDCWblla_A3L:3L[[[ Z9434NdiZ?34OO>@TUU3J83ESH7RM;3P<337HZP836Oer^8FNJ?DNV^K93JH3IV533XtYL3D:33334F3 QB\khG3?QfeeQ73 EkoI?:558J<3BUij__?K93Y[[[D39QmceOA8345CNM:U43N34S7:33=p@MS?3>3333;?3Xlk;Tj\P63Srj34I3:Ofj^SK3X[[[D3;N`jdj\YLI@=87553 7?DCCK]bJa_\639G39S<3Q=36KacRD83\|ygqaWM635><53G_CMQWBC93D;356S83CK3 ?Sbea^ba^nP=433@=3U3K^kTE36MSE3:3 Xgo[[W7N[[X?53;BMO[VbZd]cc]bW`SK?438;3 @bEQSS54;@536I335FR7HSL38X3 8?CGGESilsT3J3U3 U^^_tQ@33CXV7373@VfXI>438BMQA435433333C43AOWX`W^^QL<3734]UQSS83 =533E83AISSH5JSL63V:34FpiZhJ3B:3P534L^^hhQbN@3IUR4353;WaY=37GN93473333B3:D@:327Fmj3B3@WThlI33>[[M3 5>HYY[\PR@753SQQJN63:3??6KRKQSF338>:4EB3RB3Ci_Y>T^lHR`V`THXXF3Gh]D37JG73:33336=3PlU32Jjc3@3 8M[^VQPc\D333MTS@3:LYS[XMA3CQ`VS<3 2B?=JPRRD936PSR63NH3G|h44Zc43N3@A363ET^K36N3C7457>`b=335V\W43GWQXXK@35@?WaSB34A>CQQIN;3JSSB3LN3IrW33=cK3O36L393F`^C3 K3>?3335TaW]B3>3@Za;3@ZSD34CVWQWP73:;3QbSB35=@8KKOQD438LJQ83MR3VS333S_433N43K53:3MbU?34G35F3=RmtcA3YiL33335;3GcV3XbC254686334:33;Z[bK635833B^W53L^[535BVWNTG53>439aiT:948JQOE=3CRRK3N3^xB3339hD33R43@=3:533P[Z93G33E43FiykF3SeQ33332673_mB3cjB3 4:8<33?ZcZA3:3HbK39]XD3 7JPUUH;33<3 Sde63:OJOJ534NQJ=3QK3i};333WZ33U37B3>3H\[63F339@3:`{lQ43Gc]43333453;c_3Za=37C9@c^V7353Oa@3H_^43@SPPRD:53 AVhR;KQQA3239JQO63YH35{u33Bf45U35D3@?c[73E3C535[|h\>39ff63333UlL3dj=3;3C``T436WV4337`^@35GRRMF43?Q\hbNM@3EQQD34fC3@sc33 5`?>O34;??=?B3GcX:3B4334C3634Yrl^U:3^eA33338d^53Yb<358=_dO53D]@3L]W3BQNQK6335QN\ne<34IIQ@3A`73S\33XHIKA@;89=JNEGB834c_?38;34A43 8335]b^[eRB34@?TV3333NjL3`g<57799;B;c`O3633WX3>bb63235T]d`QG;54]jjU3333@B?3RaI3:83 8445433Ij@34QV]P>3WY73BMKM836bS3BgEOR33Ro43 =9339F:39`a837:383Y_434[jjS3333;eY53BeP3UhH233;X<334dd73@Q]PF37bO3>PPI93Nd=35\Y4OY336kZ34@3DETiI363=dH3>BT:33336]\=3:bV3FjU4533TE3WZ<3:QKP:3De=3 23323?JOP>3;jW3Pa<3Fd4333XhE3A3;mkE3S^53EjQ33334UaD3\d63Xc<1633MO3TeE3GQ=STH33VV323;OQLF534c`93 EcE33<];334X[V>36?3CdTBI:36hG3Yh833334PdE3 M]A33@jU33533=Y633K\G3>G4BMOJ:9VYU;3?_>3234537DRRJ=3XbG3@aJ34_E38Z\9Y539;3Sk936AGD;3Ma3EeO33334PdE3 =dS33Sb=31334RB33HgO39PQK53GQ\[V33WR323 6334DNSUG73LgW3A_M3YTDcZ93A]3MbJ3333=UZN636XZNd:33GM3<`P3ARRO53=]ZaMNX323253373 6BWiq]R[SUG?63SKQ:3;bd^Oc3237523!;`ja86BPS\T^V]QQN^eYKOYZgb^V>33:c>>L36P?KZ383Y@36_b833334<>734;BLHB<74335;BKVWK83[~U3 8AJQTNS_OoaKE:3234QUU<3C_`bp:325734O^hSDD7334=DQQ``tsq^d__cSN>3R^N439S?3KU363TC3:``833335;43 9AHNRUVZTOG>43@~c3>LSLB93IUjQ39BG:323CLUI3DffzL3!235325236K`ceC337EIEA@@FMTPH?B@@:63AA?:434DG?c@37GYM63GY3QE38Wb?333373?c^W93@XO833NvW637A353EWW?3M}r_536HYb[eO>3:BG:33G_:35BLW\N;3?a3PA35OcK4333323?e=XT539=SeQ>;73VaAL>36?3573:WPL3fuj]434E^cZ`I;34:<=>@A<43 3G@ZQ@Wf^OB53a93R<3B`X;333323Bh99XR43 ;HMTZhp\NNPTNF=43 db36EK?5337:35;63KXX:3Qahp]:3>\bY]F433[jjMO;3RH3X436O`M93333<_:3=VN3 ;KRXWKHY[<35 ?;37NSN3TB[gg^G34>@56T`X`I33Tji>3@W39Q333338Y;33>;G[X>QXYK@46UX;338EK:Md@3679:3F[[93Z7=\fgA8Y``\;W`P8337O?3W=3HC3:GVR>3333BD437:[ VDG5334WY<33:Jjd383N[S35Z33QWT5P`X3EC34FS:3333ef:57P[[E3FZK33UcJ:353G\[53N>3P]PV`]33QK39V739M3;R<3333 6]ffbKaP>C93:^W33=jN5G6353NSM36S3:Z`J_`E33TD3@R43435L839OB3333 DcDUW=CVkiuA34Z\933_]539C32332236^^B3L?3U`O:LN?33V@3@Q73835J:3FL93333J`Z93 EXtbE4CBLJ33O`@3@632423=V]73?I3BY\4LM:33V?3;P@3:39H838GH;3333H\T37WVH7YbbR33F_K37>32103N`Q3=L35abA_`A33S?34DLD:364:38CB43 6AFECAA?>=;633335>CIQPSYTXRLIL^S3YR3>b733E]P3@31323V`K3BI3PXKUX?33PA39?FEB53 6<>;<>?B>5348433335?JURMJIDCEDGPRatuSK?3N[7:b`933I]N3;53144323XY@37H<3Dc]_b@33LD35A>3563233335BNMC;3 4XdKZX^TJ73 RMFAH`_DZW83:T\E387332513323236bb936E438\X^aC33JB38>383333=MH<3G^933;LX_UL633MI5hf834NZ_?39O]P93 583693322139WY43D3Yd[_E33L@37;373333BL<38]E36G]_UC3KJ4MLIMC:?W^F6=GU]O<34799321343?c^3;83O\_cM33N;3<323333EG53MS37Ma\[W3?3Ge^ZO33S43473333DE38W>3B@YltaT3PWE337>353BdX3=3A_[d]338O3333?E3GR38ahva`3PW>33B4353AaV383>g[X\534:>?@?<433E?33338H43TC34^dwdZ;634TT7339?363@bW37:<@E=<83;bUZeD34873:DD636O3333G73:[43B^th?[]?36XM33A5373=e\3:37g^F\N3437H@3I;3333>@3GL3 JV;JK6S[_Q63?Y>3337A3836_^35838aW;gc43?LE;@??33337D3KC3 8[`;8O73>[X[=3MP333><393df43943:iY3S^B33EcK3HbC33IhQ3L33334;63O833Yj=3G63333493K;3M^?3@I435PYE3MB36L34B43`c323X_43CbV3A6333383E?34XS3E34RT=33EF35M3A83Wc9353j^3YjC369;;8J>333343>E3>ZH3FB35WQ53@J34O634A<3GjK35>fK39]f93:BFDAADCTKJF@733332435L3N[63DE4336`Y36Kh?3Fd[439C=43F7336H:3HV7>I3I?35@H93Xl<39`d3OlR3<3K3=B43333239G39[G3 6BD:337UE>923?<3:CJA53;dX3@dN3QmP3;63J35A4333323D<3@U;3 5;AGMUYVQ^eZW?853 4JQBl83H@3;dY53 Kg<3>D8<>>;43A^`S<34:4437@373333 8?[D77433:?3:h:3DF3>gV53=fG33=H883?U_M34323B43533336S=36?3;f=3:L3>fT536`R3A3AYZ831436=33337X=3>39b@34L53;bW:34XW633A735O\;3233;833335U=38636bB3I937[\G3RY934C:3HY;33;83333Q<3;23_C3E<3J\W>34QY:38G83FV63383333P?383[C3A>37L[UC439TW87EF53L33653333NE33443XF3?>37GV^QHB=9H^XEMI935U;33333CK33434TH3?=3 7BGKXgiTE=53CK33333:O43;HJ53@:39DSRA35T433333M<3353203E>?A3C737@HNSOF;3L<33333 CF33414332236K44H63D39HHA:53DC333337O73363D=45;A536@3AE53>F33333ED52423:G6545BPGEDCAF>4354323D<39I33333K8334325H633ELH69;8=<6332587532313?;37J33333931223?39D33333EA13:A738D3;938><329323?3>=33333 D?34543345;>93=3@43327>5:34:3F633333 ?F6236787423?738;34;935734F333338E73213@43:63?2393?:333335C63@3<3873836C33333@43>43<393535B4333335>3;53;325537@4333335<53863934536;:3333386232358383638633333464522339363623433333384343433333373253423333335343232333333634333333534232333333432332313333332323133333323333332333333333333333333333333333333333333333 !!$'%)389965=BA5477::=?>A?GGHBA;6:CSULNTQLY][\\[\^[_`sotqtvzrfrrrtw~rt|~x|}onsrrfZUVabbmpdhg]WDLUNNJIFFIGLUUNPXZOKSIB>>8:4.+-2-9?<860/+$"!"%" !"$"! $"&'% ")*$(/,$#01'!&5"32!;-# #>,%"*?+$ !.B1 %! /B3)$4@,!,$@B# '%!"ID 0!%,I9 ",$%&CF$ # #/+%#RE ! /!,/1+81#!"!7:&72$$QRR=!""#$(;;+7RQUKPA8,"#  $!$,41".2!/R J57DQT_PI)&%# !%'(*+*'"%%;PI% 5J][R2&&" 7G@!DTcL-&#$3) )J<#HZdC!'$!@HL.Pe^2)(&/< 3F.CWgH-"#!"8= #DA1`Z[$,(&:E% %AF!]fR$-9-#%$!2O7"&?D!Rk` $1&2%!'!%%NK4# !=>% ZZa!+&1"!('7OP4"(!>9#!dmP+6%'& =YJ!" $(?3'WjV"8(''#(TS*$)0=+:m_@3+(($'" PW1'*,53 #@lp1@(*(( QU2& &'%03,! _iT9)&-$$,&TV/&   #%''(76,+*#!&irM*:#/#"&*+)!Z\&-%#.* LrNI"/ ,!#]]&& #./.[A&0(5@?2*Irj_E@]iwyf|[C,#fa+."5=HFB>,Urrg,Y#0Hn|f}yD"2 >hC1,!/7JGO?/W9$()U4W}k|B'/!!jX4-):QJT9$8rr1:N$P~|ou8/("Pp75.2OMY?%Td^R@ )YcW$6!3eI530LX\;8pm+(c& Drzq"6-$qn5=7N_U+WjWHO(qfD4!&X`*)I!HR`@Gna#'Y6SG! !" RtAM#7^SS")\l@N]SrK '&"=hEF6" %[aK&bmL9k,7T;%(# ;u\8K  Lc_$MZd")iD69.Hj>!# -0t]\/ UT]'J>*43%2""8%:yl)7@j^66AKTG4 :*D`_B=?Br^&*dC0!Vc*D`_B*9HgU)R]S]G*yJ.2*3MXzlj}k||mydweuaO8#&=2;hi,Z?8eV(S_e9,de0"qz)#KV\_G(Cu 6[eqynaZFG>cb4^~tN6?A5,>4$4V_n\H !! 1FMp]!bJ<][$5OcL)O=bSaS%.v7/fm[:)'/@?)D\mX>!!CZ)}U]k!7&nS(`a? fJRT=Vcc8g'djxT);#/GC!;d`Z,@F<3ekIC\.+3Bl5#YSF8cM&Y-ZIg~T#>;T4>gZGLE:5T8nF7+dWG`HOc* *sHsj$,/+TF!"P[X# IAI?CDZVmtbv^i`EB0 P(`HBHt6<]K{sc6 m65" OM$3]X+!M[Lez~xcyk||l}jlroOtN!pa-?c]$M\&+fc*ppg#"2MP%$XU26\tfunuJN@D=>DE[esnm|<aZB0Xl'G]7JoEcM "~>0"RO!QT=#&IfoezD-M( (9[quB$nr)O4tM%LO 3:RT>"> 2:PN[R\LP=5'/Y%+ ZIAUQ"# "O\n]P.:YXmX=/d-&Q$ w[mkf-ht&6Mdy%NH%M\aQ ]cQ$8_ukYRF3'"(5GRlb[D"; *=b-3VM7'$T`c6X>Q;tvb(Zwh`$Tc-%S1Ff9-T7&\`THk|D0T^Q1ckl\i]dn_mZD- 3IgvWWttv"(RQ3GNC0"#*%2UhB[P8Y_~A[u=PF:|VDN,XS_2D?aa.6Y{I5%(7IVdV/';g_+"$&7a5#2BFB;510013.%=Z_)?g%'U%y &Wxq>OP%jWGB)Y_U)H.6?;>31QUuuq_$ +M`L42X*GA '(!Xa%((%# !"! AaM *YBU:btv% 9zrh#QU$}y+P.,[QU$(Dbirctcv|c'(NYdB`JL $,*'5Z5%?c@]cHW]?]\#eg 2F (K]S#>W]k`0+*)2Xe,| -c[$$eR%!:c95bD+[1PP8'r~)?H $UWH?\`B, }E $^yogs}rc<^=8 ,"-q&Hh%! (,`<`Z'RL>~wYEdor<rt\N8 :GQWTH.$mS%,DQNc@XT' %b[( GuwU,[`g,b-MQC+;]\cvpi,*/6H' Qh&4$/JC71b(E}zk+-063)*1{dH!Id91+@$D Beut=RjiP9?UQekGMbkx9Rz5ay|C7;> 9rn %8  $=HRuE1/'GH,lox|ptxi}#bP a;<:%6>1 +B@<*`*,N IqK9bT+IlE.72<B4qyfOu|cu|zxc6+`)\vDT}YI7oq7=>9 *?:c_&,,Vx"fy2#W`7Bw[&D:4> ,Rqckmy_b/rtfeRqX0I$$gx^$ %W'2j(4$&4! !$%! %,,[}zwV#4gaPg<;weRD/8#K^kB!Sg{xxttb4Qorx7n+uwH`udk",+0|~241--+$ &(yg!  d|<Lk7&fr!G/O/1 %\cI +h}vsvf'N_6`uzz<+74VnQN{( v*dx_%0 zywPZ,hqOo0vy43JI+)'1`_-0iypM$Roog#P] ;3+otYw LC4 &I0o%Od|; [e#RfOW'M,-:^Q!/6gxd %^|z@ 5-M|8zT O.!^&Vh E%3om0kOH|p\C"nmUI=my2+zme 8/"et*y$Ir&$*!z'&@%%) ou2Mt6-mh.U2M4"&;Z:"=cdQ',`J!U5I 0-@WgO~sY"e.o{>XwdU''Cxe_hp}T5Z#V>*3Y7 g|`& =wi9! gvub4MdaZ*1?!"YPz5 )'[(%j &&  &y!En<R}gHUJL'&X:,lpEyWxjT]PFn5!9Lnec5@4'}z+ m&"k@rG~"%$!!!`zCon*kATBAP$PD!E{v"'${YW}oriYu ->Kbfmf^I jZHD&-7~~&|sL!#"! SbKd:mg2Y(9_'$=M%gR%Z6/Uqpnh{nnqecA,1 m^tj% zD2GA $&&'#=oi,yf?ft9VL&T= *0/11/-) #R'%r.c[/{y8-DInzi|t`E9!1& -UL=B"#NboSh!!8CctjmlI:!Zh+|h-i-+:CTQbWo^lY]IF2# YR(33/+/037=Nc^m&* ;i4$ 8A~~x"IfkttqpdpNRyk<R)>^`yyiwcqdtdrcpbn_mWM2#=`+ !##%&),*#.AQU*PS* &>n0kx )ssǶtI(,X=Qz5 !" Z|15y 'X[UN<=4350sXyqE' qv!:\$2Lm}e|uwoQM93& %+7?UYk^gI-"*WF 8A]]N,S|ZI"GsvƼklH$+#]}}bjüm!z}F,Alv4 K{{_R8 m~J%?R~}Q-M|F !kCFZk}jYA &5KfXW*!Rc&8]]EO;$.bMUnp v~ưw mvE#+i{vl. rVg}xJ 5kyyP3c` Nuoh|tV&bz( !ut}zN6!;ZaF"$0UL!%&'% #:86GN@ 1"]yE"1pD6):8:=Kgƥ u^2SJ-Tnku/ {{]*bi @aD_ycFC`Bs: >X[0$Wb* '+(&&*08A;+BL&?O2 4$rC?Z}[3%y/"ryx Ơp<r&rM?PV {CSp[&kkChwV)oZ"'%=yx|O!"G`=# -\Z%#'AI!v%9\Įm1[pZj=5dxs&X!jN#)ZK#bg)&57@\P+*.NXIYM;)3.> cnK:ppz>^ }fky}6,$ SĮX18v!ov'{7,Ś1lnXX%u5 j_ *Z=@X^! "2+NKC.": MVS.&<-5 tuk|:lw[yPſk)!X{"j|m@XkbŽrqBoUT>[X#"+U0TiR +(NKN")I]`?/1mM lQamſ~+o 3 $`u7oirXDs #:&hk$&!##/0P !QgZ*TJI7l]H //'z?yhYAŴXyo4\wq);}t{6b9r /WEeQ][$(&)??%e_\"&(^U9=;`S.)//m(iGmD"ryg x4S1Nȸ!W=z2LsprEho82ri!/$K(&`mZ+%Dm#E-&]W> >{i'm$}$|Ž{;sRW~P¹STV@~r9 +c~gN ! gR!7 .B'\dl5#!jN$F!U_E4vi|c"#V{y&rįGwz1Dĩp bŲ ZN?RhdS?^^.yV(:B&"`laP He3/M MiQxv58pn-!" S=qIJ:rƩ# ųx¶P,ǽf gĿs,FNuws>"t{V'Di=,:/5IppX0!:LY;F Ww1'?FL=ŵƫRdü0ŽN_~c2'ProygnOVynEzay0#/;?D]qrJ&!40`5=@ #dJR1vwZz}v +H ¿P>~I gys,k"M|rU<5 fr nxm@L3 1/= %!,fkjrI,*'[ZIE funv\(`vh`w`-n49ijzöZ bntž&-gnukQh{8rg&ql:LXM=3.,/4=6"B'#?> =qtau]9!"$&.7i,DF Gv{94m`aA JOžjf;!t~¼g< JŻi,bnS1ypFE>.79971(:02AA," %ImufwsN?! &9O^W{d r{vvlUPE6&/!aECG ;ylEP]BIw,\u}B~#uwĺ}>/KG#I~8!IJ$&kv{d5Al6=PU2:'+@?*@2 #L[wwdyxf_FG9-4/->A@W^frmqjwyu~w`J$$#Yi IU%[xV&nj!+ONh/i}8$pDZm'?ZJfC)~ hžR ^\$sw~BM%Vh3 )C-:'.;,$;IGEO[`Zssyg}S+!6k8@_1av-"og#\q'pv?"Ŀľ1 XM#u#op*``,XYyZ+ulo/+E>%2"%#-@MHZaP^ZPKIB1.",GVeiuYD-qM0[0fuEFnOEOalN[ ~y(0czv_C;'x|.Ttt2 (|8(j|s1QZM" .#*!#:Pb{l^)bM'WSal(sb'k6s!o 8&Kˆ)L~X]}jzZ(kewC %WOM1G6-'" $.;.$#9Wrd/s__t8StFW:uw[d\kX,\Yw w[S} I&·w}= D4b73cydU! -?J: 29;@E>;:83/%&%Alzlw7b U"Wh9u\>jV '(I| P*e61{w}kp ^xvvq0 ~vUBuw]89R'#OZ9u feXdw6~v,$Atx)#-.L^yb "\<&vmU+Q&2[suQ+(HJ'&%G}zx}6gU_VSwNKbfvD \_? x]WY1u,UNkyMwW%#y`0p|d%/gu, *TjRbN ra$n#@&vT;o(tu K\rjS4&ERJ'&$&ArT,iN>^N\Lsy;fufr)#$*_7oG9#Pi"rKyk0 !HXpahH8$ ,u89|SVn)aZPfQ,'/yxO­zDTVU`PWD;. 0XnUk]2eH&md)2pC"z, Hûqds]}|wb8N"A/~%uqjDixYw 0"Dwv^Ibg z}DfRdc#E()H`*9r|bzP~zMp.gyr%()$aYmJYb+ e|O#|sn_W)zras]21-?E-y)"`*y%8"=SEgA Sqd@L#[ O*Xr"s-LkJivC}xut#q^*+!J}@m'!1("-Q'aM1`T @jd%~ Q,'fNu>!nz~rsK(kQ~t">j!bw}T54'>ogD#6pv|02Snx>.x!]Objk Gj]++t$O5B*&c `;,l`}&"q <Ek'nTadxly f;+q}: **\K$I)&1 17nm,tM$z." /3V aixzzme>j(ZbH$~S 6t{ws,)K3(|i(;4%A1,y<D:||sv~ 4^Z}` _we$6i~w4(ID, To(4yu3?|Q>u*;Knhz}@rs?uB#}m0|]}v,!CU30 AO(C5QpMCQ_P'fsu|-G *;rp@Nylnu}t{T/4ZL01 jvaUR(E4T}d GeO;c gcc}aWA%Rgg%#(uvI>k8x[(I|X(bržQF6& #CO{xvr{wQE$%E6N|oF\R:<C 2a ~Ŀo$(uaJ^o3JP7hzvJ\V( 2ľŽzv]KIGA/358-;DE[qopw}v|~]J"+G;gw~v0@uuH=" gav bBDhs[JjRl8m\x0Mm~ xt[RI0,.((023EL]zvtu`3,HE!)Ww+?ef{~ wcN/ 6XblV9 'FT5'lzn#'L;Ou xz806asyEBzNHN8M)[(f($Yz7 :Up]z}vaqO-&Pete% ,^n|j@ 0@@ZdnVzz^{l^>>)3UiO *LWW8!8}u:*IZtt_u]/cth8"j3Eu \aKhkaNms< {sO[[9&\v}]./UT`J8+ )jRJg_rpfjB& 0z~¿|6m z- 57 yvN/-mj}9 -E_WcXZHG;<474>I{pajO+CfĿ_Qq~IVmE={qvR'"!! ".EKcVfXgYi\k`pZ+Iyȼ*/JqpIMtsR*_}zP  %!!%25B@MELB@?z|4IĻX)XSqX*3oO\)[h|f ""$ 6%ſu&'3Ca|iC,nQ rmI, A|g]  $"2pLgvDųc *B?aqup7zgH j~S2 0JQYcmC,nP s|ePL?Ti~q}j=asL!"& !,&#"&Ww9/P[D9*&%WuſhbYOGJ[U{Y)4nSJ!7LUzi.&ct5#"&+# #"#(&w\ 0$>ǹroJNuyO)(8bzH BmV#'0(  ,U)K <8y~HXl{U".`G&!>$$(%-'%2 Kcup:,xv?%Ca]}zuv-75 x~vZ<$Id! 2fZ "' ,'$!$,(#f q)r{? ,2GTaXu~e a}tme?DDnjbMoq> x|N\_L(ItV!Tp<'#"'7#!&&7]E 0Tm)%}Z/&wp55bs|z_ 5m>$+`X$$*8#"*-|< >nwV)"PN7Q,Y)CJyOSr)%Yn( %'#'7'/,'8"0p&k$6[x}HQ,iww4!L= IG$4aF*&*  !;)/.*?)3^Aik$)Ccm^HnUi:bjo- ;dq a~qr)kT. '+ !?("$*+-$<=$0s2GwWMfx4GS;epxC`_ eiJk-+Pk1 )$);&'%"2%$- +9$03?ľU/+1>KXzf5L#'szM An5z4%kd; (Wj@}rB&#?]-2)$,&A521,-0; $5QUtwluoF#xwa{vqf wi. Yxq7Jd~e*X}f*v% )E@24;?80$<' B^~tTC&$t##AUùQ|e 6OSiyhz mwj\,,\O!mM25oo\PzIrƾƽsYN(-+JV?  +)E-B4."(@1fisU_{n7ǥrK"~VyVNzu(`j ^.Sx + ĿƼ{uJ6!9FW/52 1/,+./19==E*E'94RasF"Y'hE@Ĵ[14c>vms}+!gjo)4d,6i´Z)(?T9;&DbA$ ')'(,1/./($*8,&A "+19751,'!%^fZ$N7Ryjh0KfE%$@FVHFE5+!.@'3==4+""&*'-\m=@FJyf'EVFZ}zchf\Qfcacuxqf&JUVe jgg_w@{LĿ3\K$l#Hnm{o9CHVE)&34.)"&4&,:IHS:*%C(EA*I=*$%0[h)4T6v}!&\ GZ}H2Oa2x~uy+Z ~M7},b{i@2&Z*Uou_KC(OH>A"/+('%;TOP*H,BJJ3'% )_`"!`26p%~? Ix|ZL'4~p2vhqt{= hrL> uG:yXT% 5yJ"  J{z?;7O;2P )*-8TVF!4D-;;JJ+ #^^"JM-|#5j:uvj4=^uev~fG:""[3p@ztu"xlL<V!uS~ :#'! #Twp;2B[3(T/* &%EU\1"F- %3A@3.)"S^&5V&2u*#<\u |#j ginwykc;(hFuqJa{o"+1kwQ)+G,^!"RA'+/Q^M+'&%BI&$).4=>2&,B7]2_F,g*41]..RZu`znCb)C=_\ {/{A0/U|C(M9K!PM&) KTZ& *WE**(#D3!VH:c'7k}'gU)xsm4zH|.7k5eg G,bi'2yn 3,pyO'TI;!QR #%$>\Y.-V2$P) >] SR6\$-}2$J("f)lvrtC @5i%Y_NsTKU&01~oz2+]"U%&UR#!'4cT0xT!:Am~I4SL,&IdE %8Wb'!UQ*@W-X28N G%$6'XEw7q@$?`7,BL^*K(Gx5w;# KkIDS0B%M\`5%HgP "ZR0>[; "!6U'&%!%Ym_oaUY_PH?-<(9Y' W,7b5.C Fj'at&evDuq;-5 &Xurb1NBE)/P^fD#!& KiV$W]85^I!!! A@%(" "KslWOk7!7,')-19DQL>,>&x8$yjcv=42N29 w1qq'zfj/-eE &Whrf;!8*HWkZO$!! !_WB#LaE)\U;"Q-"*&*Lhm-Yh!79"2@C,?wus!\Ŭ"nz,0; 9-}0B-2*pIstk[jD# Iogu|bQ5#)>*?Mh`mZJ$ " /kj.G_Z0KV^;$!Y*GY~nh4 =a*%]h(<;!W1Qkv8J.ur,X0_ĸvcy}:#'(==0&esmj}lleOSH`HHKV\pkmldP2$ GYi)>SdI* )KdYO4 1L 'F_i{o||N2 2flTWzW+<'^ -x²^'x#KyrJK s 9eðMtR+ mMyX6:  %'QK3Acwg}h||kyqyeuisre]?0%Y+)UYcK5!#&$  -Ea^cZB5$8:%1GPsxo|e}jH3 fmm~Qmn47i !WǴE u%$Dh$=h#&zǿw',#?T8{yLso4C&+(f;%36ELMbOWHOA8+$!Qmi*;VbgV@&!'#?GfZm_mY`U^nwbuewmwy]X:$/1mq9*:857 (säi O9?w3 }q"'0=q-auek9165L-+CY"*1$#dbg58PifebG:* !(!'*.DJd^p`rtzarZZK2#11 CFq06ja?dW0 #OƾV({)1r{2 "~$-pY7y0UJ"rk/6I'3 VW )-$!$ZpjA0Cgffm`n\aWQJDLEEJ?2&$%$)G-5-1Yj_nKZ)l(Lp~!2w#Sx67<~8 'Űs&/u6v@'xuB:D (Of7 ##$&'#!!][pU ,H]^n\penpatiqu^wv\_R3A$ %:9W^aJmG !02<@E36/(d#Ng|aTX9w^/iF{`n`xr/_w%dvCC>[iUrbm:'0BEXdYfauudwwfyup{a1 0Jepuizbg/ `A3Qh~lwm(M!1CFG^fc~{Dw .[hC&5CP /%Ln!FUz;[RP66kV3! @itn]/+ !0GUmyj|vz[<73413:@FY[Zdc}A#d`.#Bxqt"h@e{uv8^tPauPaJ~` $Pw}?B ^yk&gUXd* gW#>',f\uuM,/'(@l}p}~l{[LXSS\PJH7Cemb$>xv|k;bxslG. BX4=22}g1ia 7rķt,{>÷<"|<|EtS9WPd?(? BristN+!4']u}iY:CqU)0Yc_bM78)'$*=DIF#KusXgbLL=.bS%ml(yGPV%#qVoewlG]OC@nUA, $JutbyZ4.0 .$9u|nk/?duy,Kb5 ^'&$#"$" R46 'hƵ!GD80 &ww"P*;lQ']/9kY%1? 1UtyrtuM;8"/CaI9F-TqqbV3*_2&`s8;Njr\pg}*uœ# eID7@[I`3]o1!Q4b\y|g}zZX@+#33,+H[pwy<Zk[J"%y)9MQ+ VĽJ JX{)%ſ|.BksT+, ~IGgMe@JbsN5G'?WY}dsug kwY;${n6P" bY'P}hzJ(B2 H{n[|s9 z MÿQv{$=OXY}r])Uuu=0X',e. 2[jpjG1>zqq""Kjw tWT.r,fǾ;? "\}< ?DuxwaoOI9kxda%'T"A<J<2U.,tG)LzkyecIE]5BLsqzG s;P ǵZQž4og #yp;Ydrl_;:nxju?&Y%!+J& VK0O,Zf"3ZatwzrxP&4_ ?}9}b]ìJev {2K}Kf|U1~R$Ctts{K&+a&A>)D@&9Y.?a1,Ecgr|\Y;<z{@9Ž?ViDM36?&iR5typ/"DW}k}}N+0V !5K(JR ]nnAQnM*$T":1" Lz! &lRŬz..gn} .o,1CRulkhjC1TD!JO&Zmg3^[Dn-2 ""~xn<  67G|Sķn R5ŽX pR$&?|{dsr\cK/$f= $OQ`=)UHLn)+(+*"*24~xg,vŽſSz 9?ypN(?L{ofyPxuaP@lz=#:])%7LIk2A`>Dg4n_+B-%),$$6bfwGb2,WZ"Mg2;ZU1(0#Nyt@!y/j9 <_l8 kvpf +6EHM]{Q>4 11 W.Ui#)MW`3T}}Fd^&<\P&cW!< ;0*(#l7  9/4Yq]  {$ ey[~Z7DIFC?6337hU\[g=OggP;nI'I^XJYiwQ`Q4`H1iP:&+qu3('! !xp2v~w6b73p5b v|W{?)`5(?,H2g"]`'# 6caT3x|rf[&'bF:dM50VO8&#$|vg H<,w*.wl9;wy _7#loL4,VcggdIpN% .MddL+<||keIZK B[H+A1?$%"0j ~W5%s8x#t'Swb_ ƒQ3Vsn\l.YZ/3lY") JTff-[J) HQ" GVK[xns> GK !2n (vzukFl2,}YawF"y!3(hzNv]G;$\r;$+XV1fF.T0+C/"5Bt{6$"{rJnx5}o:.rn,|-stxoU/n^1LX'd4at^40! OanfZ&(fN$O"PoO5jPLOM@84B\8:;846,' >9' p*c}Za8|.H>v|]eS8l\+.`Y8)ght3%1 *xd $.`WcHB%-a?X/!*.0/-Z8 $&%" !" @mu)PI) a@dU$|@FgfFB5;KHeZ#X;0)AzQ(KpKhqo 0l~,C~r}i>{EY=. \ Bd^@C[%=vu-Yr~wq\A2(Sd;8-& Kn^EF16R\q2Ng|L&HgiPB3-%$.8wyM<`xX !0>BNIRHVMYUY]N_QFMppj``S$";-%#! /cmj:>;2 rmyZN+!!/a 'Yco{J.%8JmcpU<&[tng91&Jlq*/R9D_ceb< Pw,d|`-+L`[3)@^\_C 0__)$*?TVGG$$puuuB =^UW>+ MuN"&*2+.G9$;D}j6MggN-5$!G1bp:G`_#EaP@@^X# 8ORF7%puuuA";S`YcRO>9-(" 9zg&!"1<, 3KO?-X~hYI$!9 Uqj84/Vyk%&%"Y`3&,KR? 6ON?&A5Quuur&*8PSdVfXgZi\k^f_DA. [v6mu{! !"$-$* '>RXSRXZWpN+6Jr6%"alG "18>@920/01/&M`([_3! $>MNaul#Yuun6%/@CVQdYk`mlfn\pXK2 CwS# #"_'fs3 (.451Da~E#4 _rrqr>%Awr$&;J<-""')  %X``?#OS%!Y{vzi)$, Mn!  -3L[bp_rrZP-cz. !Mjg"ls&33wc`7 0Nrrpq9nQ2Rh`">H?##& #0+!0]Z5ebw{`04uuU /Dghrt[a7Kpyo{('ps_-A2 ZP0$1uv2@`'#*0i2]rm?nZ/%%.*4KV'"!=]rK!)!!5^`naqt=9V; "#HW.?T< 3kp^b-"BD!fthGlbwwX<9O Ok}6lR./7c%S6))>ol; $*Rgh5@X6  ^ZFY:Un^j7%;?7q]=Aqtiyh'jQ%ojX,vn+/3MX?M)&InY/""+O~u7EX52SCBM+(]`nG &=6OrlBwydyS.w+nd=Tq1Y: W,- K__$#"9s=?T<M]+NV)-]m\3*?,&qe< %Vl||Y2 $4~mj"|m=50j*BE0 =`_!$b|O2SL"PLCJ%"/iaW!/>#Dok?unu}P M`7qL3n&<-~+Q1!-j\!" Wq`."YY?Y5LR$1ZcP53"ol2!Z}}eVDuwG\YI()vk I'". +fV&  QvvaR%QZ*OHAJ")_hC&8#If[Jrll$ ;jjK'F?b?.*)$&!#S^- T[]\iK0+*CF7V4GO$##b^F33-nn 8}z+#GOg}tvW,26?NoO747" !:b;[M+NZd[E6$PaaF"QD>G%M_J$3W^; 4x78{U;^H=~l|.I4)PeO0@9!'bK &_? 4QTd[J.a">I);M)=cP2(FmQ"{iG\4@s%2PEP\S.P*"DV*6^)%0+-a",N:3G-(]T"(3.]UA?UX Owqw-L;)O-JO7S "!WGINMaaB!K@(I5Hd5/kk E] dFEh.7P$C@HZO>!A_'%S2'-E"AA#F;2cG-$TY)1p24f(Fly}@#VA6H"7h?K)XF">L0a@9E)@GKY%(*Ni7^~=dMM5z~kURN  +H+([&?B7".V0 #U0J\ 4G* 2@&*aE.@[9>^Nszh4/4+X*(U}}`6EQ1&E/[4DE8BS# 6L/X;3E) "E7BU&)!9gD0|k!_LDPou|T&8WD%A1QI.OE 0V?L(L\"4A&9;RS"'1[A%Z~d [|-]#(dxkx_iM)>.?yW;*$T+8$QL%7; -A(,^3)*fMh}ek =cV5/k^B%/9&/H_x;/3T'C8P3!38.799S"#%&ZEE}}r H !HizcubdE2!43!2B]YL1AH'"*5QDHP% !"! "-9.-9VR,"'bL8tcz04XS!%WST "=\`t`r`jRQBJKH?ERTfZVH)"W((, 4C=%JM %# !'.0*9d?  $()''.,XE$!q||7Hx"BXcD# 0>XUm_ocn_k`_aIA)@J'/!3=8(!GH #&))*-+(%#dF%)%#4bA #Gb{ZJE=^`b1!#! "&+-0-40/%T6(3 1=4*"CG #bE$'*#7V3 (xy^"X3.Gf\gC# !"&Q')7.-?2(>H$%K;3 -'=a5 Kyy9]!=ZiZiG* "/J!(1:>1 %G1%5G0'M"20*5(ET"% +tb\o{;dm\e?'  /(A9&>MD5'E2 'C:!)P1- #%),7;.%&()'" WT!%Uww*9ou(0cn]b:CRR47"6,42?."F /) &),*%#02  $% $]9 #" #$[h^:,usB/2Yp]kA;RR$&:/ 29."?! %0.*..& 12!$7T(Euu)>1t6"apph+_pQ"7%9"&#)3/ (*1.#%34#SRXud=\j_Qp`+6)K&2-#/)7JJ=1/05"(T5+qc:%/&nrAfp5;4!#"%,IJ*11#(7+?N%Ftr/"VqT]pj713'* AJJF0D0"";6$U7"R_S3(epGop;:*".%'  )G*9;#(:HGK$9:GE  rr9+!ZpO(IM/:&!,$"%.C? "5KA(&%-,6G& /cq!!(6_eIL(9#) ##",?8,,+8??3,F1MpT)ln3np46$!$!  !!  $('(,),*&&,<6,)"?*B6]pH %L\D[a01$""  $))%$$!!"!#)+6GG-(!&,?>.A3\`1"6main1-&  &%! 6>(2160) )&#!*>='966>* nn%""`Ygn7,%&#*<*392,%#>;/9<#/;2  &Z]!Yk_e9+"!%8'(8:3&$$.,#%!!69''3:/ /mcH]cmF,!#,0->:=E2$',@E4.2%!3kW1_Zk_*"&.>@F>=-1 "1gT*gVX\$ #.#% #1% !)"!$ #TF"Q9=];$ ! ,  "%),+'.2.,  $'  "&$ FR$5T%;W?###-!%"!2/*!*&"#" !' ! [GND5QE"!()""(.% !&'"5V.,J-+HK(" (#" 1FK BB;N;"," 4""OB 2N"!'DD8!  -!2!"%P=#L.$%9A1( 2%$M;D7 %;9+ /%"I= <; 0:)/ #@?+6< )8(.!".>9"2:#'3',! .;4&36!"+*&"+!)4:/'"'72"%#/!$(# $&(/;;,"#('#$#,-",%" !#&)($' !"%#""# !&!! !""!% "(%%#"!" # $'%!%#! $$#$# # !!" $""!! !!  !  !!" " !! $!  !  ! ""##(&(3>:945:A?5655:8;=;>@FFG@>;59DTPMNVONY]Y^[Z[_Z\^pnqksrvpcqrq|vv~zrvx}wy~okstrfVQT\acjqefg]XHNXQMILHFKHLUTOQW[OKUH?==883.*22-<B;8730,%&#"&# 3333333333333333333333333333333333333465333333 5=?@<<=@A93333334;93;A8333334334;34=<333337363393<=3333356363343;:33333;3:33>6333339633:5335<33333>3;833:8333335G7335=333334>993343=634333335;<33<5337838;36333334763<338635>3833333>33=3<83933333=335;38>39333337;33>3>93:33333?433=38?5385333335?33;43<3=333338=33<43A;398333339<433=36B:38=333336=733?38A93435@33333<8334<3:A;383A53333353:833:73:A<3673:=33333:3;533>3<@93=3E433333;35=33<63@63:537B33333<3:83338:34AA3>43?9338==<;;6233337834>3338:368838A=34=3F4335?@:4326943333?3;8339:3;<6323@A635;34E33>B737433336=37<335<935?536EA3:637C335D<343333:;3<336;>635A3:8<:3<38A335F93333:>34?A8?>73A436E>3:439A334D933337@8378AA:53<93;835937C33@=3333:?:63458;?=7<=43B3:E B3;;?BBFB@73;35E338E3333 59<=<=<;9738837<3>DB634:@FEB93;3F533C933335?3593;83A?35>CG@83:43A;338D3333<834;93<738B>35?EH>53953:B33?=33335@437;3<63AC38BHF93:53E6334D533333:?437:3;83;A93?DI?3<43=>33=@33333=>43<438;36@@39GEE634;436B6336D633333=@634:34?34@B34FHB63?33@=33333:D;3<3?43@A534CJG438>8>8635A933635HJC<34=53=?5338A;3333345338@<333336DC73643:3=535=533=53;4=JK934?34<=6335>>833333 4BB:3347:934:3 :;3469>?;735:33FIC43=834;?935:><533333C938438636:=>:643445=;3<3ALA34A368@7>7333336FF39==936>B:34==35939@A=734<@63863:369533333334HG35>36??<73<3HL 837;39>B@;843;3@LI334F?=FIMNGND>43=83346333334HG4339:35=@CA@?843;43 DLLI8334D439@JNHNM>535@533 4:534:<<=><533333=I?33;93735:=CAD?:353D;5736C3:CNION>439>339?835;>533337335JD33;9384388333373;33AK;3;93934:CBE=63CGF3C>3 7DQQIG4337A6338A?3;933335738633:H@3<;3<38ADF;43;KJ737H63?LRVP53@<368436<736;3=53333;3>334LK3<>3>3;AFD83DID3?B38PVLXC>6338=6336734;3>3333<35<33DF67B3>35@CG>3@KG537D;34FYZ[D33;<453:53973333>3=3359:<<;63CL>4B53479955:3;FBC537EJ>3AF3F[S[F336A3483<3333>3<5336;8639=73=H?3@:3499657:B?:435EF@634GJA3;J73?I\]]@337=3:53333>378334:83 9<3334<734CCF7335;3333;6389337=349LI33=C34;3:73EHB53;ID;36FG736?C:3RbWV5337<3>33334>3;5336>439MJ336C;3<3:435CFD39EI>38EJ839CA:34SdfU339<3?3333;63?335>43:HF3=E;:;9<73;39HG735HH<3>GJ737?C?93>efb>38>43?433334>35<33>73?IG;<@BC?:43673<7?GG>3==3>LF638=D@@53J^^e635<53@533337=3<53;3 =GG=8336G>35:@C>63;3?H>3?MD434;?D@B93djjS35<43?433339<37;35A43EQG3;G;36?E>3853GHF3>JF4348@AEBB:3FjjX935<53@33337=53<3<;37934:GKC3AC438CD73693GHF38FL737>EADB@93WaoV36=835?33335;@634A43 4:;9679983NM;38G<34@G;3<37?H>3IN;36BFAE@=63Ioom:3:>737@G@GIFLFLKDF?>843333;@739>346538NN83AH53=G>=35DG7?GG>7<33@HC37CFBF@73fobL35;3;HH37E=3;GG37CFH<38HH95KN736ADEF?73Gbqp63=MS]\QUXRRKGE>?<<><@@GFMILJJD93533335=39<843B63BOL3F337FHC93DFBEK@3=AGGA938qssP3 8JR]]W[[TLMFB3 58>BKHKG?53:33335637>438=<66D33BKG3;I;3HF;3:GBD535CIRL536AFFD=3YspY3?Q]bbV][K=44AB=9?<6349DFKF@43<33337;34<;35;99;?=63>H83PQD3FJ435=6KC36FF=3 HN@BC=3DGG;3533qxx^39VjWff\K93:33@73:A@43>;3JLB3>E838;3=J:36EB?3<34VVF334A>>?ECJLFLFIF??9335VVE36F?34@433@L;3=F@43SLG;3;3 34z}rnoo[@3>3>634BA63:ED83<3333@EAHNPMGNINNINIOOJQMTODVRE35KG39?34GE36@F639UUHG73;33e_oZ837;7>34AB635DC937833334:FQRLHMKN@A=>=EHMQLVVOiiV@43GD3@:3DI63@F;3CXN?GA3:338kqE3=6<634CA53B<3<33336@HKHOM?845B73 7CB53;43333 5BEKFB8;D43=?3 :adh]UaaN:3EF43A;3ID3>E934AFPYL37EG;358386:@HSt{}nU[pmo3@C<63B3:@B@:5347;943333:CI>43EB3;E3^b^35ReccjhFEM=334A?336DB<43;G:35:@A@><;;<<>=943333743=EF73=I636D63[ba3 8OjjgbaM=34AB435IC3A?36EFC734baD8:=<=99ACMMKW^^SH63 7AFA>A~pt^D6QO39@IA93CG43468786533337<>=?<:;;:53=FA437D>3D;3QXZ73 B`]okhN5BD634NM38D938EBD637?[]SGILHLGMT_YZ]^UM837AEp}`4>FFZ>BMKD943:E;33338>:43543=G=3FG3@D3QffD3TolbjaF53GH43;A53 7@FC5=DFJddL87 9FYV^_a__I834mbr{n63 8Irv|_35DB734HB357633334<:3;G<3:G?37E93KffK3Baeing:3KP73?B3 6DE@=FF>85_`F3 7MUZPObb]LNKG<3_mj@= 953;~m:E<3@I6359:866:633336;538F<3GE63C@3C_\P35 :=AA~w{sN@853:G;39733335<434D?39JD343bjX3GaT[CNbfZ9FF<4?HQKP>36nn^4A;3 4xr>@BCC@835JC34:33336=3?B433AG>334DC3gjj93 6GE=DNDRxxvaT3KS835C9373EC3:433334=537C83 36JG8333L||dH3=TN8737B439IK43 ^z|h4=]om@3=BC<3M]S]=3Mw93: 4@447?43>FI73AK:3963333?63@<33ELD63>EB37onf<3FH>38KH83Jm~@3CZS39635@4337KH83 Y\}|i5gpaF3 :EC?9;==HbdZB34[3; 9<}38?438DJ;3>F93>3333:<35B4334BLI63DGA3TgsX@FD3=OO5348d| dB97HRH338735@57>CC?3 PoormfSssa37@GG@43?_cjH33W:3 79>C335>835DI?3AL<35<3333@63:>334GFL:4DJ?3PssiKI43?II7?DLJNKhthwoPZgh_GF<49;8:GB;6AC43 A`jjNt{{bl838=:46BAA43 :bf_L5yt_338BF3 :<6579::;:9GD?3?G;38933337>3<:33EMGA4BKC53=sqiN83LUWINIMGHDIf{|zi[gicUb^\RA65>936@=3 6kslB=xxQ36=<534@A@93 9Xfnju533;N35;DC<<;:<>AFPOA43CL<3:83333=:3>733?LMC7EFI73Xcle38A[XTB?73I|TcfLPaZffZhX<3:<3=C73 Qms\33o~r538?739C@=433>hkh33=M{{wk;><845;39NSG@5343@H;3:83333A73A533>HLL;CIIA<=CBHYijoMBCGJPWO<3Xv|f[334>S`cj`mdG@3>@3 Dxoa633z`5358?63 6?C?;33?n:338T343493 9GMDG=43373CM?3:33338C3C337JJMNIXUVOSNNQhkm^V[Z[W_[63b|J3 CU^oo^fLC>3 lxxL:=Qwh?7>B<53 8BA@96f35>?Y3573@K@;GC8383@J>39<3333:=3A33:KYWWQP[KAMNG\bgnUUTZ]ed[R?43?Z3;Tepqi_G3 UkicE@ME37@3333>;3@33 8BLHIINRNF8LMxrsW35Gaf[bbXcO=3Sw:38[rcmvY93 :xurH63Bd39>737l@69:8 :??d}z_95363:HF33AHB3>=96 4;=~p37::53:3GN<33CN;36HK53?93333D:3<5336EG@53>7HOM[ZWVQVzisb38FL3@R]jiccD33;pH3=Pcz}zU54Csrl;337xm{>an`38<3 |exwP5433f37;3;37HK43439;JZXS^bsrvnZZN3 9UkhsodoowP3 >;35S{}wdk{F3qXA4~^<::A923i=3Uw}a339W>534:3;39JR9339JA3@NK334KJC?>QYRkpkohZZ<3~qx::@[t;338=83933;{}|:33S>=B:37393TP93AL;38JI834C:3=3333B:37933DIJvm3 ^~<=G6f3>53yP3Xola33d338BA:38438@BNI34FH43KNC3:D535;3333D=3;433:D;36:3INE63 @lzvrk_NVZL;53 \|rtvj3=DHGE73CQ?@e53;8XuF337;3>h3;:33u3;BB<63;B?46QO43?J<3BNH43?C43>3333@A3;36D;379338JI?3Vw{wrnD\^X\WNICEA?Ue{}}pH34;889:>DF>43IS@3K37IO>34C>3<3333>B35:3B>3:633>NM53'7\ox[IVOXXPURKICdoroqox48=@GHKHHE43 iz}`437;TQ3;73C3Ersx33>|\3 48;?BCA?;63FVK3@G<3JOH3:D73:6333385?63 kaxs39:}m3<83V37C33YT35787>PO38NH3=HM<3DA3483:633335C=3 5=A<;;:98;935C735;3KR93OL;utI38?@JMIeebNPmrv|tm_G>;43?:3 7}@]W37R}Q3:<43`n3jX33v937CHX`YjfdfWbaZjdQD>53EH734OQJ38I838<>CBPCKEJDFA?963<53333EB345434:>=;;@BCBEHE@;736;3:5339MN3 5]]@:}n?37@HHQrVT[t39<3 K73kG3636>:37S:53Ltvr3337M]`ssboo^jhcfXb`\ha]PVTIKPA3COL>3C373333CD7BC836:3=OJ3eluf}}p{sU=3 6=433_334M3\{H3 7o3C733L3 ;WoyqxsoshnfROLBC==><_aTIROQQVV?734OVQ43!FFA35<3CND3Gb`37Jl{xf}}x}pnpU;33=933d{{g3mq935{3ZC3N33{I337Qql}}ixvWPC43 SZE336>CXYONB83DVSB3 5J>@EOOINIE>435936;@HDD73;63333BG635<3;FF?B<634>63GQB3Lcb[]oouyg}~uw qzT9>33n3}y3rC39f3gwuU33 6Ehnl}rQA43RaP3 AKJHNKC634KUY83 5NVQMOMA;43593573FN?3"=gosj\ooj~ND<4GuGHJSg| xeD3]3X3B_3}63lt3F zrq~\<3QbT3 =OG3>FNG?3BZZL34@TXTQM;3<3=CE93<53333DG7343 5:;9879;=?=83>A3336>C:36?73MS?3COftstjddS@9yC338koo3 6tL337v=352v73aT3Y3h tuL53KXP36JJ3>IMC7RJ67733@UTSXXB3<35?E<339833338EE398436=@:43C83337@@>83IO@3 ;XbVfqriM93 6E344338637<<:53;G>5:3333CE<3683 6?D?<>@>AF95334DD53 RUC36OS`bbZolU39l\393Yn=36V{a5PRY39373:=3JkkC3PcY3FL>3:HNYZS7XI53JB3<36>737EE433335FH73683 7=>?EC889CD@EA<73=<:?43 KOD>T]]V[B3fjS3 6oiquF37@83 8`fFK|:336633v}>33N3AD3Zh[3GVG36O_[Z=53JF38738;38G=338333=DE53:37>:5334A@43@935< @CC87?43:=3 TZTZQ]Y?433[`S35|X3o<39d:3sw33;3Sf3u3653]j]3@OG3G]_[Z@3ED3:639<73<8D9338333CIB43:434;:43A@3D5337@DI?3;<3P`[[YF53io\34^c3z>43v737H=43 ;u43I3Y]P3BZS3 74?Z]^[ZZ73IJ3:<7;<635>3:B433<3335BIE43;35<534C?B33;LF?533;;37`j]UB3ekZ3e63T`63~K3i43A3M~M3noW3>YS3 ?33:63336HFE534635:37FE33=>HXbU]U33CNVL<;3LI373<8334B7334;3336FJD83834;3>L533A936FD=336AQPX^S3395335=_sr3;<3}N3|33cj3ai3ak3Gg`C3 ;Rljfd]bRG535S]V35IB3673?63:@33<3337EHJ:353;435KA336A5334BF?3:MKSO`a389<93Sfe:37{Y43~33G3ZŰ3 n:3UsvOGQ\XkikqifdLC3K]]H339ND34:3@43@733=3335GJGB36934BH:333:C3AIAMOL:AZ[@:<=;::6SvxL83wO;33 Ĺ·a3E|53 r3?NShxess`ooftkC536SQWD6?I<34;43@439<335<3334@KKD93<3@D333>@3 CXOL939feD36NxwO3M `3p53373Jɢ3_kxJ3;Vlis~xgss[]NL[V3AVVOGLN937;53@34@33:7333?FLL@63<3>9F:33=>35FUV@3dfL3@fhX36Ĺ3 B333\ bW]3 u|E39Vvn}}oTFA63UfZ3OQL=QP?:434<;3A53733?3338IIJL@8368398EE33A?3 HLIME733S^X36}}q3gxnɿC3{I3373OɻĒȼk3px3?3AjmleU`irD3ZfU37LQPOI;@DA=:989;?=63A837AA53336=3334=LLGMF;43657885538535<;I83?3 ?LN;9KG33Ujg3t}|43Q Xbv3sP33:338Ğƽv3Q3c33AfiXB336{}p36_ZG3 ?QSR<3349;<:73>;3GMJ\abSf]jja\PPJB93843=5F?3?@3 33BF>3Jd`<3YinK343<¿UG4^Z33<3^ļ3N8:¾>33=ovueE3J}}c3@jjD3AY[C3;=389AA9A=538;3335AEMMHNNHF??;8:9;EFDGILSZZR]]TbVf_jj`noo`sgmfZN83738EI3@C336EMD36KI4HB4lo\3?w3>z3ijƫY8md ʱB734O3G6333V\53Az3gnX35NRJNN834C8:>534<>35=4333'5=@KNFNNIVOIQQMUVVPZZOWQJIGBAHGFLRTRglo`sbxh}bqWD37=I;3>F49FM835KI5T`h:3hnyK3:3 H3 k`3=33;vs?3^_3539<333 58=@GEGBGFC@::635;KSZ]xf}vw]N43;MA38E9HM?3?KBJssO3ah3\h3ħdzļ A3Ht33n33TM33 7KED:B<976433458=C=8333;36FWh{}veA3LK93FQL;3BL?TlxE3np_3pi33zjEsp ɭr73h^3@Ƚ337O37xO3@osY3>YZ<34HNHD53 ;@C>5;=>@C@@?>=99:333735Lf~oirG3GC6@4]3 dBð}Q3I33ƹz335x83aro43fsb>35ZVH3>MME;3=I3433;5333;34T}`I3M H33HXK<;;73GM;qkh>3:N3}B~w37[3C<<433;6333:36863K~t_;36NG39KNH639HL<|}y73?\3w3f3w3d 33ú}?35Ƽ33:S3=85693Mxxs^4337HA3=FAEA3LN<_isb3r}>3<3<B33t3P83Ņÿb6O33334;3:?63LtJ3;NC3DK6GE3BHB?;3Cxx3`3333TH5@3ǁ39Y3O~d3Y~hk43OffH3;@JEJFJDBC@DCEGB?83833;63334;3<;35[[;IA3CE3?H;3>NL3i`3gM37ȷm33MB36x3H U5[{[36f38{v93;I3SjZR3 7=>DDCGBD><83963389333=3:35`r}TC3JF3:H?36JG6Bi|N39{A3 \Ċ335x333t{R35g<Z3Iž>3443nR3fum3Rgj_4397335;333=436=3Sx\4F@33GI3N>3d~63\434}3x<3]ABb3yDR3Ⱦ3t43\~z3Tj@3Zob]8387335;333893>437h|_LA33EG73HNA39sn3sh38p3B38y43õvKKFǽV3Z63Bz>39`336;3NlL33?I>3 BKG33LyU3;g353 fC3p<43Gge]=u3CC39X34zu}~63Hnsh]93>33:7333;83;53Bq}_3433>3336@3<34j}\9FC3=IH3;w73_B3?yd3X4:ǗfǨ38Bg3x:3M|i37]gxxiR36;334>333<3<3P}LI3?QQ63Gp3|F3LmV33G;vĿj}Ň `3634iA3?q739Tw}wmoB3>533>43334@735:3T}J3=QQ83m}g36=3< ĤT33]Aǽp }è7 3VɷD33zM38?3>\n}|O634>433:73336B835;3; \xvC3;MN837tY3<E3< H38Mr }†±ǮY38ɿA9q333nX3;{\3 6Enpkg>3=9335;53338B:35:34 YXgn?3>VV<333335>D:3>3 B]]Bkz?3BZY=3\uZ3Vd3x ɴiA̜H3b CUʍĉ38Uauu{xvYA3333:EA93>43 5SYMC_?3CZZ=3_n3 Zu43iV ~r\Ū%ĘiRůvmR533334@CC=43;93 3SbZG:qy93CRP93c{r3\~N} ƙ}ǻ̾ˣsG3<"ʼɸĻgfK433336=FD@<53 9:BD?@??99433AYZKD;v63N]]73Us>3JZ9ċǥęC3:̲ ?334ɺfKC33334<@HE?A?ABCHGKGLPLKKMHMFKCA;33\f^BEMt433R]]439dI3OĻ;38tˑA38{ yB3JK<83[m3333477236?AG?ABFKHNHNNHG;433 Ef\NJLI}33STP3493`~^536uɽs334Ig3K=K=3Bv{^33334:434543@63 6eoG3ÓwX ĩ:35433334;3=>38BHQQLQ@33NblZG43P;3Oerv^?3?3 4Mȏ aYƴn=373Uj43~˵ÝgOq }D34=EQ[Timr`ss^ni^[XO@;33332343=35@<35AJUVNO:336glgL>33Z73Cn435;D78YƷW4338|?7̵=3CX"J̫S3̽tBbġm4Aw’`WJ=3 9NUtl}}jxdss`oodj\fbKE73333834737937A<35DSPZZC433FTbgjG=33Q43W 538:IsŘ=3A{eznjN3f`Ḃ438ƒfwmA3 I|hYWVQCFGI7AKQQ_nlyij}}pxgssboocjjcffb]baME633334973?38A=34OZUYW<33>MMZkkcE?433; w6:3s uY43\Ƿy3gʀb̊43TNJxǛI335c tk}uhWRN>=>::>>?HJQ^[bbX]]UL<33332:83@39AA53?R]]SJ33DM adkqA@83Q33O D4I h9336S̷73g\1̊43ƹkV33ClB7Tuv zwm`S@43 5?MO]]QZZH=333353B37@D;38SZ[bV737AI^xp39i3e̛ȟ3]53876:?G<348?@GCHDIDIEJFKbgg_J733@N_B3Hcī3X%̵3iĢl937FNMB43333?3 8>@ACC<677@437@436@<43F>435::>=A?A>>?]agm@33 @Ukj3Bqmu3!E3OjuC334EHNH433338;3 5A:337A33;>534@::9835eookB338mic435?AN]|`3G̶n3 7ődG:4333>NHE43333@3=<7C43=;3>53?ln_sM333^wmlPOn43 BYWxďR3X̓_~3ZU=3;LNC3333B3EH43<936=3DXsR73GixtaH?7j~|]F39Sm~J3X̓_~3Ęv_?3=KIB3333B3:C<>7::3A37:39x|dkEmd@3:feL73>bJ3X̓_~3b>3;ML9334333C36?C=434B=3A38<83=ibz{xP63d}LAh=9S`W:3LsS3X̔`~3pT53AIK6337;:9;=8333B3>C:3A@3A34;634dxxnxuH34`}}j3ii334Rn}n`laWJdlu~`3G̷m3 7ǑkgYmyQ43GLA338=4333B37B<37<>53@36:43Usi}E3?SYL5Fp<3>3JD33;4333<38B635>44>3:936<34Vx3363u} P3qU>3A{R3=VolI3:BQ3 4̻ǙpS43<[n93:739HE3367333@83>93<933:737=3:9339}_4 nZR33>t{Q3 4DI\htl{ y~Z__3i̱̐3Z jxyc53?[ya43:63CK=33;3337A3:>3A7337:3>634?336|}ZX rZZ=]r>3>434l9A3O5O{r73 IwO3;438FD3385333@93@534?5334943:39:33l}G FRbv`?334:3EK733683335B5383:;35?3;@>37=3>533@|}e7;ryo;35Or̸83da5̇43ǸN433;bR37WU3863:G?334;333:@5393=63 6@433<@?5535=53@33<6Bo}}{[4Smxm:3BYǵ~{3dʄḟ43V~ţF34Sw937i}rq734;34JC33<333:@43;335=3 6B53;8965<<536>536>334nuG39@433v]35I]shǕO3ddF˃439Ǖ^|v639ww\37oA3;43BJ433=3339A837:39<3@7<:37?9338=638=37;X}O3Qyz]B@435GS_k±Oe̵=3AÒ\'N̨Q34̻N>yS3 @iw53OzoN3873=F8334=3336@;438==:34EA734=<<=63:>3 6:CDQUTZR]VbbWgyzJ83zzzj|xp H:rĒ73Rg43~5Dqz63B=338@OWY[N^ZUTzxV36:37I>336;3334;>9438I@6537DA?=?@A@<7378357;@=6=<3 AJMINJMEE?<953Qyy}lbokmsN3 Gq{saY<3B|xǽ̬C3 6̫Ǣs’I33Ue3 5Pruƿt\YB3>43FD33>63336;>?7=@=366345543@CA4<<@B?<7334?83>FOQKC>638cxxq88GQowT35e^T7H[]o|o |ymC83DqĹh<k3MOs434f^q]U=3:93@C334?333498@7673499C:A<;638@439IILCF35fs`rC3hrR833bjj536ko85h̔C38~ xHmė 833DɢunzQD35>3?D33:<3335@5@C;<@C8C83><3CGL?54E73\ssI3Q{vsz]ikj>3KuW533ćǟŜF3;̱BNyD4Nǽe8535?=Nx{yzWF3?73?G33?6333459:636C:;=;;<86439>:37@43 59=@??><97436FHE63A;3Obms]3oBP|z~~`Q;34=QxP3 ÛǼ̿vJ3?mƠǟzǕĭ>5~ȽzbJ6hj3 6rnoCAXosqg}tW839<3>B33:?3335:>@CLCAA;>735:3 @7334>;96438?68=BBN=737@438B@8C>84359;539EI73:C43A`ooe73=g437P\z^J3gzL̙F3u fQĬE{úv3QF35833:v}pW3=Xhy}}gxXM43@73A?33=?3337=;63;935=MDB73B93@CC;73834=937FG535G:3Ahh^g93~P3 Juzw~ma?3MĉLďǥY3ǍfWƯ ĕ^8Pg43`<3 7:33ClswP:853 6OlixxpmskF43><3B<33:B5333;535?53CKD?53;A3:>>CC93593:=34FF53@A3;cjjb733Gp3Cbb]4EMfvkzs[O:3<sM[Ɩ35c\fe;333:63Essn3434r:= ǺŬV3BĪɷñZ37~43tV3793[hi`37<434?^scoN:38@38F5335B=3334<536>43;HKG=;:9AC889;=AA;739@3=633783:3;E93F?3;cffU;335yG3?s3rGĵHlĝǭu|^Ǫô{BYR35lg38yB3=34fssG34<43>QnodfhF36A3;@335B@3334<43?834@BE557:HC;:8653@;3>?<963>534C?33=E43 4CB33>abbO733A{53@x93_B<CLj]Ǥ ÿW3Kx=3gj3XqZ3LooP38;3>bjYf^>38F35D6336CB53336:38>43:GC933=D839C63583>34F;3x;3K3}5ėI3 ȕE3[3_y^3m|>34go]73=635JfXM738C3<@33:FA6333>43@838GH633@C73C3CT]]ZI43=wD3;xwt=3O ?3n@D6r`3DaWbb]E539C3C8336@H>43335<39?3;DG635CB73=D838636:33D:3>W]Z]G3 }L6643Dtsq;3n73]P3Y>XĵyQE6Ya3m@3Y=3RxpE3_je3>53 5HabT][E533?C3:@335AEF:333;73@73@HB435EC93=E<3693 :C@EM@@>:637HOZ[WG35l~{ycFCDFB@>843G};3OȽo43? n37ġ4FQ{NH3] 3]{?3463iv=3eo3G]ZB39;3 8MV]]SYM:@=34A739BFH>5333>35A3AID335DF;3;F@533<3 :A@93=>335883H}:38ĻP33=33zV3ML gKƭT3 33IȤ3?q3p43A@3afU34@3 8JPZZRVXH=53<37@DJEB5333>3:<3 5FD>336@F>437EC;4<34A93;33C8349>:437@QQKVN934DI53?63Y53Ge4334533Q33aGEqK3534r3o437yJ39;39`bB3=9368537HSLQKOOINJJHBC@H@ DFKJJIHB:3333=3C3@DI73=CH?73537AHJC:433?4335339A3 6?FHNPQNA:3 9HJCOt|sjZI39?8]3 DƸo?36<33b3ac38;3Oudz_36|`3@73gS3[bM3:<3 6<<86558::63B@3:>GMHNHNNINMNHMILLHF=93333=3E3EJE83 7DEPLF@>>?@?:438?LFGEF;63< 469@BLNJNHNIC>3 HJJYzwXNO<35>`}3 :eŶ¯Y39>334>3\~?3Vǿ=3>ſ>3B;3NZ3Fmko3GVT3:>3;939<537H<3 6::?AAJCD?B>;73333973D35BJI73?FGHID>6334:?;434A?ILJFJEGCFJMGMHMJMNED;634==34JLbqtG8VU43ACDE3 ?|©638z93eQ3WœN3 Ç<33AJ3RzC3lyl3lzH3n}}A3>]]53:A3;534::33>D534:=53333>3349953D35HGH;6@533;AIHHG@<759=73:?8?AHEKFLLMGLEEA9634>=3? Upttl{B3;KI34J\XA3 ;^žf3?A343JƸĿM3 <IHHJFKEHIG@?A>CD@<76657@835>;339EJ^m|z_j733AQF3=wzf43>Yu93H;3hN3O¿83SR33?y=Dx3FpK3;hol3TZB3;>373 9@LM?9;<;:;;753333D93<935FNLD438@FEKEKHOPGLIPMFNNHJE:?63 7@=DF\s{o}sU3@J?3 7@@GJLCD@<45y}~a3:Zlncf3N63r3GȮ3]33lti{tC3az{43gxx93MTA3=<34=53EL43333<7<37?38DLGJ<34368>>DJIIGMMGMMHNLKPG:4349@JNR_{}bmKI93 FO?@P\g_xxg}d3M\9f3 4J33=[q38P3TuhE3HVE3B;3933:JE;3333:435:3C3 :3=ILJF9373<359@DJNINONROF=;::99<=>DEDHNerun}lK35HF87F Tdlkjssbxxo}i8c{K3dsywyK73435kc3s3fv33_u3 <Ƿk33Q3S73`pe3:os[3FVG334H735ID5@7333356383<;3 54338HFMMA;34=937=JNLNMJME@DBCFA@@;CZptqwb}|]93@XYijbgmodssdxxvy}}m4eH3bqxwrXG43 SfIQ3HI38zƷI33{s3 N533B334OL39pH3lsg3@MC33LIKQA837?536GLNIOOD<3IissavqtsV<333=KC3@83333536?3 289@LQFNE:3<3 ;6;LONKQK9FXjasips`=35FOab^afe`aXS<36t~z^<=>=63 a435J33M û335?3xĸ:33WT3IC3 ;ykj833Noo;3FTY_dknoiksL@A9HT]]VbaSN>7FR:3;q|^3xL3O33a{o338343353?v93 _}}O33HooA3=OE3@G3:EK935E433336=631<9@IFPNHNNDD=7533<=3 :9HPX_hhkgn]lZA34HYZP]]MG636QWM63FRWD3 4aZ63 ^3jA=ÉE33Wz38ƴ733_A34@3 G}}f33=__C3<3333983 49DLHOOHQQKVYQZW]]Tbb`\dfXjid]EFV@=LC37MJMJM?53H}E3CJ3[~\n433F3AýE33zm3:o=3WxxG34ebI3?H@H>3@GLB3;?33334<636=DEPQJVXQZZYU]]QbWb\OC83SVOFLKNNJONEJEA76734VS:B73 3FM439DOIQE@43P>3:335Idt xm3373 H3@ž33^o3t33HC3^ra836dic33_fP3CQI83>MME<38F43333?635@93:3SVM:D8333493CV>:D9338L?37CRNZU]\RRGFZ}|}434CJPjwvowS637s|L33;3`73 Ŷi343iG3pj3 9xoi7HZ3Zka43UbP3LLKN@637F633339>3@>3:38A?733BB833;B7334JD3:AJEE;7=>37\xwiebYhl^gdXZRB;<3L34=3;3Ko3J\43x{sD33E}zu3RniN3 c}ra8AfoonYW]F3>JHHK335CKA73 9;3385oxvT3<936?<=43 Uv@5335;373 =u43`C3Gzpxv3 ?}}e5<>GOzxzsonq\]ooZji^ee]bb[]]QZZMUN?:3C?33338?3BC6353GML;33FE33?K893 A33783gd`F63A3A@3R|3>3`3u`33I3l [~:38BrtkjjbmoumyponoXWoo^if_eeYab\\[LME9436H=3333?836BC43GQQ=36C@33AK73<634;3;s<4>53979<3Fyte3?3Ay3753`3 O5MohS:AG\bW}~vjjhiooZ}yonmTNb^YWZQOKCOP>63G=34?I9KG3>33:53Hssn34=6;36:6339;38=>Gz36;3j3m|W34j38,D33J^||ttkgd]|~yeb\Y\X>q~}qoolfJBOJOG>36FB3@E33334C3@E=3HKN73AD83:IEJ99A?:53<33=33Ja`W3379D47:;93;736=933Hu38:3]a3I3U=3E|;335r{wzytyyvxzntrc953 Cxxooi^WKQH?43AJ635IB33336@34?F>3LOL48FD3CFI=43;KA3 ;37933\ooR3@F<953=3:93Brm]37;37X3oK3~b3]$34AvusQdgrzjwxf{oo^dY\_Vsvtkb`[UF<3:J<3=E933337?35BCA35OOL3>D>38GEC534EF53 93:635mooA38:<367:83Ih34?3}~O3^~p3D|=3o#jITsvpHC639DWe^woobj]ffXhmsj[YE535GB3FH33337?34DE@537JLG6GF43]ai43;33:3=?93T]3A3 Oi93C43Bz3 hTjk`3bi_ORPVMSPEEcyvhS63BE53>EB3=CE5333AH:373?43QjjO3=38535:?83RliJ3?533yB63lJ3 Lf3pI3 4fn|}f3moY3357;??AFTmkfTB=:533994D93DI533334D34ACF93CNN>HF6343djjC3;35<53;83c}}D3 7>3KCE3`re3 5~738z736 HP~}Y35dhP=AB@?>;::34<439;433ig_3 =[73J3?s?3Au3myH338_msO3HIIH43@KB33338=3 8AHHA83E@338>aff=3@3<436=;@wx`3 8>5{^33E3;pI36~t:36}q<3CMGF434_34=L[Z53EYrtW39EE93:JE533334?53 4ACHH8DOQ@753@B533@CA33FYW[3?43936NyyU=>>=93Dm}833=pso35hQ3jC3@u3EGM?33:9334=8Vf^3BMGfm`3?<36EL<3333;:37DD9WWUH?38C9333]he93ku^3 <335n|~Z3Isb3Sz`34AMJ9333>=3=63YdP3;HH7lpk3GA3FL@33335>535HVWOHH43@>338CF]b^639=3983ksh37@7363[Z3?tk43Y|X3DKG933Gp[83:b\=37HK63cmg73?H3DFJ53333:<3PVRIHH539E4334P\ZP34B3=34dl]3Pj5=3mrs;ekb34l<34onE3>GK733Si`^?Ib`43 7IJ733NilB3:D634BMK63333>:39QWRHHE373A<338\]]QG<843?93?3AonG3nsG3:833ohR34goE36shG38LJ833dog3Bwv^TK38KF:3GljM37H:34GME:33336?73 AERJHE67HB46B533FS]G9IBABC>=;>G=?@??E;9634EooB3< j334<33`o[3_F35vn?3@=335_cU3mxN3;JF83;gfN3D;37HIL:33338?63 7MUG56338GDH@>33 :ZZM43=D848:9D<4337:368:;989;<<:Kcf<3VQ3<63\qK3^tvX3:uoyzJ3?IH?33Fjj?3LV433?HE53bfY3D<3;INH83333;?53AQVI434BIKC33IZZ@3=D<38C4335:343Njh993Z938347:<9436CNHH73333=>639NSJ<3;QK?33?VMK3334;3Njj3537zqa3Ggix~735]mx}R3 5;BgnjnaLGKK8IKI335bZK3 4:33Gv~~hP3X_W53A<335:9636<=853>MGNF43333=?:3DSUD36HEJD4334RVT739DE635F833=3G[\3HK33?WrpemfgfH<<=3<433MVZkxY43P^Z:3B<4;:4368983:KINM<3333<>?63>NNI838?:IFC33FKQA3 6CI>433:F63=3Jfe3Y:>Xondn]=63=IMOJE633334537=@<636IRQA37=38IKB33GF>33>E6693B[Z43-Xhot_j\lkTG@;5txo4OissYA>B@?<8866556:;ABGCG?;43 6bshkhA3AJJA435633Fbb@3=3LQB>D:5Rztj]I7HWPC3E@437EJQQHL<333359>??@B@@A<;634CADDBFCFFDH@?943H\oo]I3>J834833O_Z3 5>433>JM=C934Outwkcc^N35I73 6<:755779=?BC?<45;B?A:63AJOIA35<3>KK;33IOM937DFLEII;:39bb>7DNW||nWP93 :93I{soh>3 4688;9;86;3 4R^ijW:3GKD36733;a_?33:<37NO?C93(:a}hgqnopoiSSNLK?=<>?>DEHPPW]SZZNVP<433339>;639>DA>45:B@C?=87443AKF>?934>3CEK933AHMA3 6@IIRTPB>985459<[_]ZW]Z{|zP436DR]}~rR53 49358=KWnwvhjlglsxesp_koajjbff_bb[]]UYWD<33336=:435?AD:349?ACBDBDAC@C@B@=<75357:;=MPL=7433=NNA38AGWRRHNHNIOJQLceaZPQXojf53BSZeffuqD3#>MHOQHOJNNHNINNHI?<4335HdhW]QKF33?333?ZYD3CNH@=3$;ADFA;749H[focikudqn^moajjddfe[baSRG:33339<638BB@37FG?93?N=HVXYU`aYhh[b_YQQL@>63333:<43?BB6346677::?BCFCLTHLGC34;:7893>LL<48 >C<6339MNG439CKFC:53DZT3axw`:DHYZW]SXJ933U]c93 7H\R^_[XRE@;?:346H96OO@?CH<3333;<36334<3CFL73 36A@;434;@JGKC=38KU][WVLYZO@96433@IK78B;>FGHG<43 BM83GNE:>BA;433337>39FD73@IH=3G6FE=::=3;537LMG33;GOMH434<@JGMH[\RHRijlYJLD;4393YfJ35Eab^Z]O;3<535=43 9CIIC83ENGRXS]TXGNINHSWVIMOMKGG=93@H539JOD>939?;6345763333@43:CF:36FHD:33@G C6GGCHKA;435;3@H879439OSM93 5;=F?3;QTHFAGDMQXOKCEI?953DM533HRJ=37:><:7789;<:889<<433339;3;EB93>HDD634AGGB549>AKBFFA@6339634FM MK<3EE@E>63;NL4@ehl>3;73 4OefeR5Uff[M83 899::<=89==9439EJBIH3>PQC336@LG?36=3@I3?53OfU9e]@3;53349?<34?IOE5DLE<=@GLA73:93@I433=PNG3D:33334?3 =7AGE:37=EEF>43 9FMB>8556B937>DDAA6;53KMMM>35=FCD<8435CMJ;o53A35ef:>35<39@=63NMAJPA83<636E9GK<3>33338;3@G6?FA=3@RJ3B35353=fB3<63:AA=83DPRQXID@7<3>3 4DLJ;>=3DNJ3<358776543333;83EG:6834KC=3;93 4:BMMML637;BCHCHDIDIEJFHF?>8537@=53EX@]bhBC:3=737f;37;3 6=CDBADEDKV]`B83873=3ALN<835GJ@3:35;>@=<<=>=963333=53AG73>EF:3@3 6?DJGMJ5EMMK;4368=>DBHDJFJJHKFKDA93:<3 >[Bfjj74;B535A337Rd9UfZ34?3 479:<3FLP?733>ML53:37=C>:6347;<736533333@36EGG=387BC63B3ETQNI73684AK534 8:AEGKFLLEB83:834UNbjj<334?833?63IVffU6Wf[83>4346;MRFF;3853<3 BLLNM=KC:3BIG3735>A?5349;53593333@358753:9FE3?3:HGMWH:33:MMD3 49>IILLEG;;83NKTY^93=5;<8WbYdfR336OK3=739KL9=F63493:43439I9FLM=?KGKD>KK?39D@834;<53:33336=3=G?375:EB3@3 5AJLGECC@8333DIG;36BKGQNF=3BI]efB3D;AS^bbO<38bfd83;93:SQ33AD3;3763:3=ELA35:386:FGKGJL=395436;>73333?43@C9363>C=3@3 :JKFG83=5AB5334HLI3DKGMMD=35@L]]S]?3WffL3;<3:PF336C;3;34:3:3=KJ<3 ;368337CINPI:3>E;347<<=:533337;35FE3@E=13?34DKEI;3;37?A53;KE=3>LLINI63:;3O]YI36>@9RV[]K43;\Va:3;=3AVD333=A3;3:34<3@KE93:34:38BOTL;3?D:33335=39C>3>A7689:;:435;337FGK?5368337@>3ALJ434>MNGMC43?539cf_<949QZ]NA3LbbX3;3DQ:3334D833=363:533AFF63;33;3438FJF:3;39A;36LH<3 6DJNND:34?3 ]ba63;TNXR735\`T@3<:3GS7333>?33=3473=3:3OQ337C33>393>8JE53<3;434CSIG834EE3333>E;3CE63=3;NKB34>35KJ935DNNMH43C]^YVMQB3M]]J3C836MI33 A66;347986893AHD63<34=3733BLMGC63BD833334B@3?A53697GHC638?73@HE3@QNOJ6335]YXZW<34RPZE36A43=QG33>99>=;7667<>:<953ME837834>3:3CEFEI@937>?3333;D;3AD; <=>H6GF>3:533>?38KK53289;633BFF?33336E?3@F633<537==ON636938;><75336F=35:BCHE@8F53333>A834@D83?NB35433>:3?JB345NO\UM3@E:3@VVO63:C43?CFC33=D937;A==>;3>F=383 9456533:F736988F533338C=35;B937FK53633:@39FC3>OU]U?3DD53EQMN83A=38D8@A3333334C?38C<3?HB4335?63J43?OP]UH35H?3?QQI83;B63@?3@D334E?34;3=3:G?5833=83CD739OQLQ:3:H734323@JMN=35D>3B83@C43@D63:33;3BI;3FO=STH33AA3 5233564:MOIC43CA53 8A8336E6333?@>634<38CB:>634D93@E43333G634:?>93;A39D<3333C631933=7333933669534BJLNC63;D?37A;3B@8B?45<36<63DB39>;34B73AF433334=B73 >?33CC3346339;338E=36DOOG3EPVWN48E3498633G7:87GMINEIA39@93=MD<39834H837?43<=36BA33338?@53 :B88F:3362334=537HA3INHI4363;?839?EL;33<3>D434>37@3;A:33336=?;43>@;B533433:<36E?3?NNK53=5335:=ED@9=?33:73<;C34;3@43@B633334;@@AA?<836=A;53;?EC3346C<;KB3;LGN938YZVCC323<73!6DLD55=EFLGLGIBB>BDA=?CCHEC?6335D66:3<6:?3:3>734AA433334=>737<@=:75357:>>;43@J=3 58=ACABHANLD@93734KNN;3?VUVL539<63>DG?==539=DCKGNLMFJFFG@>73>A;34<63:>3483=835AA433336>43 5:<=??>?=;8536JB36;?=96337?D9353?GNE3?YYU?3!27743:234=EFG9335=><8878;=;:8:895436F:39=633:>3<936@A433334<35IB73;>:43CL:3>B43:37MNF53DTYT:34;?IFI>5357886439:6B7348>;39?3<834>B63333;36B@>536?;433@<537B3<73357=E?8753?B;C:36A38937MGE3JWWN43D@;73A53<537A>53333538D45><3 59D;4337;36>83DMM733;3 5;=>>;:??534 8G?@A<436EIF3=8KSQL>339:44EKFJ=33>EE637>34<35=@;633334?533859?>6<>?:734>?5336AD8;C7357:=3?MM73>49LQQ;5GKKI7FKB5334<73>63:7359==633337833:5?>893?5338DKC3;3DMH3?33FIF4CKG7;338C38<3<37=;43333=CC?377?3=>7337RB3:37LG<37;336KL>HK433<>3>63738=43333C457BD:393?LL43;53DLCEKI33<:34=434:34<53333 @CCB:BA67434@?336C;4F634393CFB3<36HK@K<33=837=373;434<73333 8B8>>68=MCG73@533A@339C35764634LL<3;63EKB7@A933>636<43934;539<53333:A?43 ?>GB9387;:33635;63:35<535<<73333:@>35E>94?BB=339A:37@393553AKC35;34JK:KK:33=637:9537954:35<:34:>?>=;83333489;?=>?=>=;::@=3D>36B4338@<3B3589976643FK@3693@F>DG933<7358<<;4348<<98979<532?93353EG934:53;JGIK933;834<;36733334B:@?A=:43 =435=?9393 5?>>53328434KK63;35FDHK;33:737<3:33339D@839A4335;?A=:433<:3FG533;?A635D834@8349@A=83;;3;;<=855>@8359>@;536;<;363939JH3853@EHJ?33;53<3333AB53;<34:B@5EH=433478<=EGD=;7336B<3437537EC3;3637?FIB=3;>833;D3:3:JD3:39EEJG334;343333=B39=34BDKBA3<>633I63;39ID3837ICDE435:>=94338633337E43>83ACMC?543=433:F3;38HC38;;>B;<836FADI:34:936>=534;3333F635@37AMF6@@634>;33H73>37IE3:33434HE;D>3534>93953333>?39:3 :>534FE35835FB6IG39>9688733337D3:73 4?A55B536?>@63;33A>3?3H3:436HA3@D9368BA33334E53;53=@933?;3:A>934=533E834?3AF53636D>3:HB3:933335B63<435>?38D435?>:3<833H53:3@H839G=33AF63=3333<@53<3=A63B<34=A937=33I3B43:E<39C833;G=3=33334@73=536>=36E634;@93?635G39?37G>3>F63AG73<433335=3<53;A7383<835H34D43D34@B39C?3:533334=3:73?<3@A3<=633::35H3C93@C5373FB3@F83575@93333937;36@:3B@3><338<3J634C>3:F;3:6D:35BE539?B?<;<34B@39:D73:C@38@;43>53349>B:3333643>63<33C;35@H:3@G6334?93 5BE:434=9873<939AH@535C?3=C;3837>53 49=@DMPNIMPOM?<:73 DI>:>BIG>53?C63BF637>4FIA3:D939AD435938AB7393A3<33334@:3<9334<935>C=5373?5363333;A93?9335633>B438O53A=35B?3 :D63?<437AA<536798B87437>393333 8>G>::633<@36O73@A36D>36D933@;383363@4383333?637A38O838G36C=3A=3>36??432936=3633334B73B37O934H535B>53?>433=63;@53533<93333A73:834O;3E834@?8363639=4338:43333@8334;3O>3@=34:?>834=?45;=43;339763333@<33773K@3?>348>A=97648?>9=<63>533333;?338634IC3?=3 479:>CC<8637:333337B336638BF53A;348==73=33333B73393213@;=?3D7348:<953:533333 =>339289766436E43E53F36=<85387333335E538?53A<68?D737B3:<436933333?9793:J<:7 8FTLMKFEECKB5349;<<:9523=935:333335J734839K633ELH=AGB8;=:@@838>=84325963;834<333337:C4493:F:33:@739>JH3;9C==43736<3<33333453?A393;E:33F73 9JF?833:F>363=35;3333343B?5;3?D838D3=:49C@53>343=39833333 A@58:74458>A>3=34E439C6A34;3=433333 >E6369;;96443@83:?36@A3593?333338E73423B63>835L23:3;7333335D63B3A43A>3:35>333335C43B43A37@53735?333336A43>53A35>937?4333336@73;83@3<=36<;33333;=835737<3>36>3:7333336::97533>3<53A35333333=53693:843333335;32=39377333333:537838334554333333<3:43743333334;3:437333333973873316333333 478533573533333325533333333333333333333333333333333333333333333%$"2*)'Usn~x]\gagfjsnt~T `@ @0@0@@0`@@`@@@`ߏ@ @@@@`` @@@0 @@@p@@@@ 0 0`P00pp@@0``@@@pP00``@p 0 0  P0``@@   p@@0@ P@Pp`p@@ 0@p0`0@P߿@p0@pp@ ` P0p0@p@@pp  @ @@ߟP0 0``P@@p`@ @0@@@p0``  @00 @@@@ p@@ 0 `p@@@`` 0 @@@p@0p@@ p@@0P@@p@ P@@P0p@@ @@0@@@@P0@@@@@@@P@@@@@@@@P`@@ @P@@@@ 0@@@p` ` @@@ p @@@@p@@@ `Pp@ @@`0 @@00@@p`00@pP0@p@@000 @@@ P@@0@P0 p P0`0`@ @@@` `0`@ `Ϗ`@`@@P@ `@@`@p@`PP`P@@p0ߟ`@pp@`P0@@ 0 0 `@@00P0ߟ@`@@0pߏ@p  pߏ@0p`00p @p@0@p@ @p@  @p@@p@ =cbk(NQNA?M\O-% @ @  @0@0@@@`@@@@`@`Ͽ߿`Ͽ00 @  0@P`P@ P`0 p @@ @@@0   @p@`p@`Pp @  @ @0P0@@`P ` p@ Pp @p   0``@0@@`PϏ"￿``@@@`@ϯ @ 0`@p `@0p@@p@p0@Ͽ0@P@p p`Pϯ@`@ϯ0@0`p@@` 0P@@PpP`@@P@@P@@@P0` @P@@@ @`@@@@@@`P@@@@ @@@@ `@@@@@ @P@@@@pP```@@@p@ @`p@ P@@` `@  @@@ 0`@p ``p0@0@@ ` @@``0@@p @@@p @0@0`0p00p0` @@ @p @`p@ @ P߿p@߿p p@@@߿P`߿`Ͽ000 0 @ @00 @p@@`0@ @@@0 @@ @0@0@0 @@ @@ @@0@@@@ 0`p@Pϯ@  00p@pp@`@ 0 pP  0Pp0``pP0P@@ `@@`  ``@`0 `@`P P@ p@PP@Ϗ@@Pߏ@PPϟ@p `@P@``@ 0@  @ @0@@@  P @ 0p`` P ``P0@ @0@@0@0@0@@0@@@ @￿ @@0@  @ @0@0@@߿p@@P߿@@߿`@ ߿pp` PPPP @Ͽ0߿@- @߿@߿0߿ ` @@`0߿pϿ0@@߿ ` p`0@@P`@@@@`Ppp@00@@߿p@ @@`p`@ `@`@@@ ``ϟ  @@ p@@000@p@ @0`@  `@ 00 ` @@@@@ϯ@@ `@@`߿@``0@ @0 `@ ` @ @ϟ@ @@p@p0 `@@@@@@@ @Ϗ@@@@@@@@ 0@```@ @p0ϟ@@@@ @ϟ@ @@ p@@@0@@@@@@ @`0 @@@@Ppp@P `@``` `@P@@@@ @`ߏ @@ @@@@`@@@`p@Pߟ P@@@ ߿ppϯ `` @`P `` @` P0@ P0 P@ @@@0`ϟ@@p@``@0@@@``@ `@@@@`@@ P @ 00p@`P@ϟ@p@`0@@P`ϟ@p0`@p` P@ p`Pϯ@ p`Pϯ`@0`@0@`@ϟ@ @p0 `@`@PP 0@` @ @ϿP@@P@0@pP@`@`@p@  PP`P `0PppP @pP0`@ 0Pp@`@``@`@ `@Pp@`@`@p@P`@``@`@0 0 @` 0p0@`@`00@@`@`@`  0``   p0 @` p pP p@`@@@00@@0@@8BIMPatt8BIMTxt2 /DocumentResources << /FontSet << /Resources [ << /Resource << /StreamTag /CoolTypeFont /Identifier << /Name (Verdana) /Type 1 >> >> >> << /Resource << /StreamTag /CoolTypeFont /Identifier << /Name (MyriadPro-Regular) /Type 0 >> >> >> << /Resource << /StreamTag /CoolTypeFont /Identifier << /Name (AdobeInvisFont) /Type 0 >> >> >> ] >> /MojiKumiCodeToClassSet << /Resources [ << /Resource << /Name () /Members << /ClassMappings [ << /R (55) /C 1 >> << /R (77) /C 1 >> << /R (99) /C 1 >> << /R (;;) /C 1 >> << /R (==) /C 1 >> << /R (??) /C 1 >> << /R (AA) /C 1 >> << /R (CC) /C 1 >> << /R () /C 1 >> << /R (;;) /C 1 >> << /R ([[) /C 1 >> << /R (  ) /C 1 >> << /R (00) /C 1 >> << /R (0 0 ) /C 1 >> << /R (0 0 ) /C 1 >> << /R (00) /C 1 >> << /R (00) /C 1 >> << /R (00) /C 1 >> << /R (66) /C 2 >> << /R (88) /C 2 >> << /R (::) /C 2 >> << /R (<<) /C 2 >> << /R (>>) /C 2 >> << /R (@@) /C 2 >> << /R (BB) /C 2 >> << /R (DD) /C 2 >> << /R ( ) /C 2 >> << /R (==) /C 2 >> << /R (]]) /C 2 >> << /R (  ) /C 2 >> << /R (0 0 ) /C 2 >> << /R (0 0 ) /C 2 >> << /R (0 0 ) /C 2 >> << /R (00) /C 2 >> << /R (00) /C 2 >> << /R (00) /C 2 >> << /R () /C 3 >> << /R (^^) /C 3 >> << /R (0A0A) /C 3 >> << /R (0C0C) /C 3 >> << /R (0E0E) /C 3 >> << /R (0G0G) /C 3 >> << /R (0I0I) /C 3 >> << /R (0c0c) /C 3 >> << /R (00) /C 3 >> << /R (00) /C 3 >> << /R (00) /C 3 >> << /R (00) /C 3 >> << /R (00) /C 3 >> << /R (00) /C 3 >> << /R (00) /C 3 >> << /R (00) /C 3 >> << /R (00) /C 3 >> << /R (00) /C 3 >> << /R (00) /C 3 >> << /R (00) /C 3 >> << /R (00) /C 3 >> << /R (00) /C 3 >> << /R (00) /C 3 >> << /R (00) /C 3 >> << /R (00) /C 3 >> << /R (00) /C 3 >> << /R (00) /C 3 >> << /R () /C 4 >> << /R () /C 4 >> << /R () /C 5 >> << /R (00) /C 5 >> << /R (  ) /C 5 >> << /R () /C 6 >> << /R (00) /C 6 >> << /R ( ) /C 7 >> << /R (00) /C 7 >> << /R (  ) /C 8 >> << /R ( % &) /C 8 >> << /R () /C 9 >> << /R () /C 9 >> << /R () /C 9 >> << /R () /C 10 >> << /R () /C 10 >> << /R () /C 10 >> << /R ( 0 0) /C 10 >> << /R ( 2 4) /C 10 >> << /R (00) /C 11 >> << /R (0B0B) /C 12 >> << /R (0D0D) /C 12 >> << /R (0F0F) /C 12 >> << /R (0H0H) /C 12 >> << /R (0J0b) /C 12 >> << /R (0d0) /C 12 >> << /R (00) /C 12 >> << /R (00) /C 12 >> << /R (00) /C 12 >> << /R () /C 13 >> << /R (00) /C 14 >> << /R (00) /C 14 >> << /R (00) /C 14 >> << /R (00) /C 14 >> << /R (00) /C 14 >> << /R (00) /C 14 >> << /R (00) /C 14 >> << /R (00) /C 14 >> << /R (00) /C 14 >> << /R (2 2C) /C 14 >> << /R (22) /C 14 >> << /R (22) /C 14 >> << /R (33W) /C 14 >> << /R (3q3v) /C 14 >> << /R (33) /C 14 >> << /R (N) /C 14 >> << /R (09) /C 15 >> << /R (!~) /C 16 >> << /R () /C 16 >> << /R (  ) /C 16 >> << /R (  ) /C 16 >> ] >> >> >> ] /DisplayList [ << /Resource 0 >> ] >> /MojiKumiTableSet << /Resources [ << /Resource << /Name (Photoshop6MojiKumiSet4) /Members << /CodeToClass 0 /AutoTsume << /TsumeMappings [ << /Before -.5 /Code () >> << /Before -.5 /Code (;) >> << /Before -.5 /Code ([) >> << /Before -.5 /Code ( ) >> << /Before -.5 /Code ( ) >> << /Before -.5 /Code (0) >> << /Before -.5 /Code (0 ) >> << /Before -.5 /Code (0 ) >> << /Before -.5 /Code (0) >> << /Before -.5 /Code (0) >> << /Before -.5 /Code (0) >> << /After -.5 /Code ( ) >> << /After -.5 /Code (=) >> << /After -.5 /Code (]) >> << /After -.5 /Code ( ) >> << /After -.5 /Code ( ) >> << /After -.5 /Code (0 ) >> << /After -.5 /Code (0 ) >> << /After -.5 /Code (0 ) >> << /After -.5 /Code (0) >> << /After -.5 /Code (0) >> << /After -.5 /Code (0) >> << /After -.5 /Code () >> << /After -.5 /Code (0) >> << /After -.5 /Code ( ) >> << /After -.5 /Code (0) >> << /Before -.25 /After -.25 /Code () >> << /Before -.25 /After -.25 /Code () >> << /Before -.25 /After -.25 /Code (0) >> << /Before -.25 /After -.25 /Code ( ) >> ] >> /Table << /DataArray << /SparseArray [ << /Index 1 /Elements [ << /P [ 1 5 ] /Data << /A << /R [ .25 .25 .25 ] /P 1 >> >> >> ] >> << /Index 2 /Elements [ << /P [ 2 1 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 2 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 3 >> >> >> << /P [ 2 3 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 4 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 5 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 2 7 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 2 8 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 9 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 10 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 11 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 3 >> >> >> << /P [ 2 12 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 13 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 14 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 15 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 16 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 17 ] /Data << /B << /R [ .5 .5 .5 ] >> >> >> ] >> << /Index 3 /Elements [ << /P [ 3 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 3 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 3 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 3 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 15 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 3 16 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 4 /Elements [ << /P [ 4 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 4 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 4 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 4 15 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 4 16 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> ] >> << /Index 5 /Elements [ << /P [ 5 1 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 2 ] /Data << /B << /R [ .25 .25 .25 ] /P 1 >> >> >> << /P [ 5 3 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 4 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 5 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 1 >> >> >> << /P [ 5 6 ] /Data << /B << /R [ .25 .25 .25 ] /P 1 >> >> >> << /P [ 5 7 ] /Data << /B << /R [ .25 .25 .25 ] /P 1 >> >> >> << /P [ 5 8 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 9 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 10 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 11 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 12 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 13 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 14 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 15 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 16 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 17 ] /Data << /B << /R [ .25 .25 .25 ] >> >> >> ] >> << /Index 6 /Elements [ << /P [ 6 1 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 6 3 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 4 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 5 ] /Data << /B << /R [ 0.0 .75 .75 ] /P 1 >> >> >> << /P [ 6 7 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 6 8 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 9 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 10 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 11 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 12 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 13 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 14 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 15 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 4 >> >> >> << /P [ 6 16 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 4 >> >> >> << /P [ 6 17 ] /Data << /B << /R [ .5 .5 .5 ] >> >> >> ] >> << /Index 7 /Elements [ << /P [ 7 1 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 3 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 4 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 5 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 7 7 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 7 8 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 9 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 10 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 12 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 13 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 14 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 15 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 16 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 17 ] /Data << /B << /R [ .5 .5 .5 ] >> >> >> ] >> << /Index 8 /Elements [ << /P [ 8 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 8 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 8 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 8 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 15 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 8 16 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 9 /Elements [ << /P [ 9 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 9 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 9 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 9 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 15 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 9 16 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 10 /Elements [ << /P [ 10 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 10 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 10 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 10 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 15 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 10 16 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 11 /Elements [ << /P [ 11 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 11 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 11 15 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 4 >> >> >> << /P [ 11 16 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 4 >> >> >> ] >> << /Index 12 /Elements [ << /P [ 12 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 12 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 12 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 12 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 15 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 12 16 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 13 /Elements [ << /P [ 13 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 13 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 13 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 13 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 15 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 13 16 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 14 /Elements [ << /P [ 14 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 14 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 14 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 14 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 15 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 14 16 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 15 /Elements [ << /P [ 15 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 15 3 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 15 4 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 15 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 15 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 15 8 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 15 9 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 15 10 ] /Data << /A << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 15 12 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 15 14 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 16 /Elements [ << /P [ 16 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 16 3 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 16 4 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 16 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 16 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 16 8 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 16 9 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 16 10 ] /Data << /A << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 16 12 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 16 14 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 17 /Elements [ << /P [ 17 1 ] /Data << /A << /R [ .5 .5 .5 ] >> >> >> ] >> << /Index 18 /Elements [ << /P [ 18 1 ] /Data << /A << /R [ .5 .5 .5 ] >> >> >> ] >> ] >> >> /PredefinedTag 2 >> >> >> << /Resource << /Name (Photoshop6MojiKumiSet3) /Members << /CodeToClass 0 /AutoTsume << /TsumeMappings [ << /Before -.5 /Code () >> << /Before -.5 /Code (;) >> << /Before -.5 /Code ([) >> << /Before -.5 /Code ( ) >> << /Before -.5 /Code ( ) >> << /Before -.5 /Code (0) >> << /Before -.5 /Code (0 ) >> << /Before -.5 /Code (0 ) >> << /Before -.5 /Code (0) >> << /Before -.5 /Code (0) >> << /Before -.5 /Code (0) >> << /After -.5 /Code ( ) >> << /After -.5 /Code (=) >> << /After -.5 /Code (]) >> << /After -.5 /Code ( ) >> << /After -.5 /Code ( ) >> << /After -.5 /Code (0 ) >> << /After -.5 /Code (0 ) >> << /After -.5 /Code (0 ) >> << /After -.5 /Code (0) >> << /After -.5 /Code (0) >> << /After -.5 /Code (0) >> << /After -.5 /Code () >> << /After -.5 /Code (0) >> << /After -.5 /Code ( ) >> << /After -.5 /Code (0) >> << /Before -.25 /After -.25 /Code () >> << /Before -.25 /After -.25 /Code () >> << /Before -.25 /After -.25 /Code (0) >> << /Before -.25 /After -.25 /Code ( ) >> ] >> /Table << /DataArray << /SparseArray [ << /Index 1 /Elements [ << /P [ 1 5 ] /Data << /A << /R [ .25 .25 .25 ] /P 1 >> >> >> ] >> << /Index 2 /Elements [ << /P [ 2 1 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 2 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 3 >> >> >> << /P [ 2 3 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 4 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 5 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 2 7 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 2 8 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 9 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 10 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 11 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 3 >> >> >> << /P [ 2 12 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 13 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 14 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 15 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 16 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 17 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> ] >> << /Index 3 /Elements [ << /P [ 3 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 3 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 3 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 3 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 15 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 3 16 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 4 /Elements [ << /P [ 4 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 4 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 4 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 4 15 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 4 16 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> ] >> << /Index 5 /Elements [ << /P [ 5 1 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 2 ] /Data << /B << /R [ .25 .25 .25 ] /P 1 >> >> >> << /P [ 5 3 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 4 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 5 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 1 >> >> >> << /P [ 5 6 ] /Data << /B << /R [ .25 .25 .25 ] /P 1 >> >> >> << /P [ 5 7 ] /Data << /B << /R [ .25 .25 .25 ] /P 1 >> >> >> << /P [ 5 8 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 9 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 10 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 11 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 12 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 13 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 14 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 15 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 16 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> ] >> << /Index 6 /Elements [ << /P [ 6 1 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 6 3 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 4 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 5 ] /Data << /B << /R [ 0.0 .75 .75 ] /P 1 >> >> >> << /P [ 6 7 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 6 8 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 9 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 10 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 11 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 12 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 13 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 14 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 15 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 4 >> >> >> << /P [ 6 16 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 4 >> >> >> << /P [ 6 17 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> ] >> << /Index 7 /Elements [ << /P [ 7 1 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 3 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 4 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 5 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 7 7 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 7 8 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 9 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 10 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 12 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 13 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 14 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 15 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 16 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 17 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> ] >> << /Index 8 /Elements [ << /P [ 8 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 8 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 8 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 8 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 15 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 8 16 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 9 /Elements [ << /P [ 9 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 9 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 9 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 9 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 15 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 9 16 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 10 /Elements [ << /P [ 10 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 10 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 10 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 10 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 15 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 10 16 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 11 /Elements [ << /P [ 11 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 11 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 11 15 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 4 >> >> >> << /P [ 11 16 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 4 >> >> >> ] >> << /Index 12 /Elements [ << /P [ 12 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 12 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 12 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 12 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 15 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 12 16 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 13 /Elements [ << /P [ 13 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 13 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 13 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 13 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 15 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 13 16 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 14 /Elements [ << /P [ 14 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 14 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 14 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 14 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 15 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 14 16 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 15 /Elements [ << /P [ 15 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 15 3 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 15 4 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 15 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 15 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 15 8 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 15 9 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 15 10 ] /Data << /A << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 15 12 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 15 14 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 16 /Elements [ << /P [ 16 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 16 3 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 16 4 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 16 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 16 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 16 8 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 16 9 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 16 10 ] /Data << /A << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 16 12 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 16 14 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> ] >> >> /PredefinedTag 4 >> >> >> << /Resource << /Name (Photoshop6MojiKumiSet2) /Members << /CodeToClass 0 /AutoTsume << /TsumeMappings [ << /Before -.5 /Code () >> << /Before -.5 /Code (;) >> << /Before -.5 /Code ([) >> << /Before -.5 /Code ( ) >> << /Before -.5 /Code ( ) >> << /Before -.5 /Code (0) >> << /Before -.5 /Code (0 ) >> << /Before -.5 /Code (0 ) >> << /Before -.5 /Code (0) >> << /Before -.5 /Code (0) >> << /Before -.5 /Code (0) >> << /After -.5 /Code ( ) >> << /After -.5 /Code (=) >> << /After -.5 /Code (]) >> << /After -.5 /Code ( ) >> << /After -.5 /Code ( ) >> << /After -.5 /Code (0 ) >> << /After -.5 /Code (0 ) >> << /After -.5 /Code (0 ) >> << /After -.5 /Code (0) >> << /After -.5 /Code (0) >> << /After -.5 /Code (0) >> << /After -.5 /Code () >> << /After -.5 /Code (0) >> << /After -.5 /Code ( ) >> << /After -.5 /Code (0) >> << /Before -.25 /After -.25 /Code () >> << /Before -.25 /After -.25 /Code () >> << /Before -.25 /After -.25 /Code (0) >> << /Before -.25 /After -.25 /Code ( ) >> ] >> /Table << /DataArray << /SparseArray [ << /Index 1 /Elements [ << /P [ 1 5 ] /Data << /A << /R [ .25 .25 .25 ] /P 1 >> >> >> ] >> << /Index 2 /Elements [ << /P [ 2 1 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 2 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 3 >> >> >> << /P [ 2 3 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 4 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 5 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 2 7 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 2 8 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 9 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 10 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 11 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 3 >> >> >> << /P [ 2 12 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 13 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 14 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 15 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 16 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> ] >> << /Index 3 /Elements [ << /P [ 3 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 3 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 3 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 3 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 15 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 3 16 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 4 /Elements [ << /P [ 4 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 4 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 4 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 4 15 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 4 16 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> ] >> << /Index 5 /Elements [ << /P [ 5 1 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 2 ] /Data << /B << /R [ .25 .25 .25 ] /P 1 >> >> >> << /P [ 5 3 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 4 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 5 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 1 >> >> >> << /P [ 5 6 ] /Data << /B << /R [ .25 .25 .25 ] /P 1 >> >> >> << /P [ 5 7 ] /Data << /B << /R [ .25 .25 .25 ] /P 1 >> >> >> << /P [ 5 8 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 9 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 10 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 11 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 12 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 13 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 14 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 15 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 16 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> ] >> << /Index 6 /Elements [ << /P [ 6 1 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 6 3 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 4 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 5 ] /Data << /B << /R [ 0.0 .75 .75 ] /P 1 >> >> >> << /P [ 6 7 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 6 8 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 9 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 10 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 11 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 12 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 13 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 14 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 15 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 4 >> >> >> << /P [ 6 16 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 4 >> >> >> ] >> << /Index 7 /Elements [ << /P [ 7 1 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 3 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 4 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 5 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 7 7 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 7 8 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 9 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 10 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 12 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 13 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 14 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 15 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 16 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> ] >> << /Index 8 /Elements [ << /P [ 8 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 8 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 8 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 8 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 15 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 8 16 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 9 /Elements [ << /P [ 9 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 9 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 9 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 9 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 15 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 9 16 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 10 /Elements [ << /P [ 10 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 10 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 10 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 10 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 15 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 10 16 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 11 /Elements [ << /P [ 11 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 11 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 11 15 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 4 >> >> >> << /P [ 11 16 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 4 >> >> >> ] >> << /Index 12 /Elements [ << /P [ 12 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 12 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 12 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 12 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 15 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 12 16 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 13 /Elements [ << /P [ 13 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 13 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 13 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 13 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 15 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 13 16 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 14 /Elements [ << /P [ 14 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 14 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 14 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 14 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 15 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 14 16 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 15 /Elements [ << /P [ 15 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 15 3 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 15 4 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 15 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 15 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 15 8 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 15 9 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 15 10 ] /Data << /A << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 15 12 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 15 14 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 16 /Elements [ << /P [ 16 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 16 3 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 16 4 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 16 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 16 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 16 8 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 16 9 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 16 10 ] /Data << /A << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 16 12 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 16 14 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> ] >> >> /PredefinedTag 3 >> >> >> << /Resource << /Name (Photoshop6MojiKumiSet1) /Members << /CodeToClass 0 /AutoTsume << /TsumeMappings [ << /Before -.5 /Code () >> << /Before -.5 /Code (;) >> << /Before -.5 /Code ([) >> << /Before -.5 /Code ( ) >> << /Before -.5 /Code ( ) >> << /Before -.5 /Code (0) >> << /Before -.5 /Code (0 ) >> << /Before -.5 /Code (0 ) >> << /Before -.5 /Code (0) >> << /Before -.5 /Code (0) >> << /Before -.5 /Code (0) >> << /After -.5 /Code ( ) >> << /After -.5 /Code (=) >> << /After -.5 /Code (]) >> << /After -.5 /Code ( ) >> << /After -.5 /Code ( ) >> << /After -.5 /Code (0 ) >> << /After -.5 /Code (0 ) >> << /After -.5 /Code (0 ) >> << /After -.5 /Code (0) >> << /After -.5 /Code (0) >> << /After -.5 /Code (0) >> << /After -.5 /Code () >> << /After -.5 /Code (0) >> << /After -.5 /Code ( ) >> << /After -.5 /Code (0) >> << /Before -.25 /After -.25 /Code () >> << /Before -.25 /After -.25 /Code () >> << /Before -.25 /After -.25 /Code (0) >> << /Before -.25 /After -.25 /Code ( ) >> ] >> /Table << /DataArray << /SparseArray [ << /Index 1 /Elements [ << /P [ 1 5 ] /Data << /A << /R [ .25 .25 .25 ] /P 1 >> >> >> ] >> << /Index 2 /Elements [ << /P [ 2 1 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 2 2 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 3 >> >> >> << /P [ 2 3 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 2 4 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 2 5 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 2 7 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 2 8 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 3 >> >> >> << /P [ 2 9 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 2 10 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 2 11 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 3 >> >> >> << /P [ 2 12 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 2 13 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 2 14 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 2 15 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 2 16 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> ] >> << /Index 3 /Elements [ << /P [ 3 1 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 3 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 3 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 3 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 15 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 3 16 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 4 /Elements [ << /P [ 4 1 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 4 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 4 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 4 15 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 4 16 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> ] >> << /Index 5 /Elements [ << /P [ 5 1 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 2 ] /Data << /B << /R [ .25 .25 .25 ] /P 1 >> >> >> << /P [ 5 3 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 4 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 5 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 1 >> >> >> << /P [ 5 6 ] /Data << /B << /R [ .25 .25 .25 ] /P 1 >> >> >> << /P [ 5 7 ] /Data << /B << /R [ .25 .25 .25 ] /P 1 >> >> >> << /P [ 5 8 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 9 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 10 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 11 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 12 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 13 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 14 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 15 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 16 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> ] >> << /Index 6 /Elements [ << /P [ 6 1 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 6 3 ] /Data << /B << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 6 4 ] /Data << /B << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 6 5 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 6 7 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 6 8 ] /Data << /B << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 6 9 ] /Data << /B << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 6 10 ] /Data << /B << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 6 11 ] /Data << /B << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 6 12 ] /Data << /B << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 6 13 ] /Data << /B << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 6 14 ] /Data << /B << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 6 15 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 6 16 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 7 /Elements [ << /P [ 7 1 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 2 >> >> >> << /P [ 7 3 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 2 >> >> >> << /P [ 7 4 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 2 >> >> >> << /P [ 7 5 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 7 7 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 7 8 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 2 >> >> >> << /P [ 7 9 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 2 >> >> >> << /P [ 7 10 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 2 >> >> >> << /P [ 7 12 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 2 >> >> >> << /P [ 7 13 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 2 >> >> >> << /P [ 7 14 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 2 >> >> >> << /P [ 7 15 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 2 >> >> >> << /P [ 7 16 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 2 >> >> >> ] >> << /Index 8 /Elements [ << /P [ 8 1 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 8 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 8 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 8 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 15 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 8 16 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 9 /Elements [ << /P [ 9 1 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 9 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 9 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 9 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 15 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 9 16 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 10 /Elements [ << /P [ 10 1 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 10 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 10 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 10 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 15 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 10 16 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 11 /Elements [ << /P [ 11 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 11 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 11 15 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 4 >> >> >> << /P [ 11 16 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 4 >> >> >> ] >> << /Index 12 /Elements [ << /P [ 12 1 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 12 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 12 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 12 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 15 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 12 16 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 13 /Elements [ << /P [ 13 1 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 13 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 13 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 13 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 15 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 13 16 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 14 /Elements [ << /P [ 14 1 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 14 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 14 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 14 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 15 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 14 16 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 15 /Elements [ << /P [ 15 1 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 15 3 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 15 4 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 15 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 15 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 15 8 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 15 9 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 15 10 ] /Data << /A << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 15 12 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 15 14 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 16 /Elements [ << /P [ 16 1 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 16 3 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 16 4 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 16 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 16 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 16 8 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 16 9 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 16 10 ] /Data << /A << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 16 12 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 16 14 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> ] >> >> /PredefinedTag 1 >> >> >> << /Resource << /Name (YakumonoHankaku) /Members << /CodeToClass 0 /AutoTsume << /TsumeMappings [ << /Before -.5 /Code () >> << /Before -.5 /Code (;) >> << /Before -.5 /Code ([) >> << /Before -.5 /Code ( ) >> << /Before -.5 /Code ( ) >> << /Before -.5 /Code (0) >> << /Before -.5 /Code (0 ) >> << /Before -.5 /Code (0 ) >> << /Before -.5 /Code (0) >> << /Before -.5 /Code (0) >> << /Before -.5 /Code (0) >> << /After -.5 /Code ( ) >> << /After -.5 /Code (=) >> << /After -.5 /Code (]) >> << /After -.5 /Code ( ) >> << /After -.5 /Code ( ) >> << /After -.5 /Code (0 ) >> << /After -.5 /Code (0 ) >> << /After -.5 /Code (0 ) >> << /After -.5 /Code (0) >> << /After -.5 /Code (0) >> << /After -.5 /Code (0) >> << /After -.5 /Code () >> << /After -.5 /Code (0) >> << /After -.5 /Code ( ) >> << /After -.5 /Code (0) >> << /Before -.25 /After -.25 /Code () >> << /Before -.25 /After -.25 /Code () >> << /Before -.25 /After -.25 /Code (0) >> << /Before -.25 /After -.25 /Code ( ) >> ] >> /Table << /DataArray << /SparseArray [ << /Index 1 /Elements [ << /P [ 1 5 ] /Data << /A << /R [ .25 .25 .25 ] /P 1 >> >> >> ] >> << /Index 2 /Elements [ << /P [ 2 1 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 2 2 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 3 >> >> >> << /P [ 2 3 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 2 4 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 2 5 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 2 7 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 2 8 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 3 >> >> >> << /P [ 2 9 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 2 10 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 2 11 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 3 >> >> >> << /P [ 2 12 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 2 13 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 2 14 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 2 15 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 2 16 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> ] >> << /Index 3 /Elements [ << /P [ 3 1 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 3 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 3 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 3 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 15 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 3 16 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 4 /Elements [ << /P [ 4 1 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 4 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 4 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 4 15 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 4 16 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> ] >> << /Index 5 /Elements [ << /P [ 5 1 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 2 ] /Data << /B << /R [ .25 .25 .25 ] /P 1 >> >> >> << /P [ 5 3 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 4 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 5 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 1 >> >> >> << /P [ 5 6 ] /Data << /B << /R [ .25 .25 .25 ] /P 1 >> >> >> << /P [ 5 7 ] /Data << /B << /R [ .25 .25 .25 ] /P 1 >> >> >> << /P [ 5 8 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 9 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 10 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 11 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 12 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 13 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 14 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 15 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 16 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> ] >> << /Index 6 /Elements [ << /P [ 6 1 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 6 3 ] /Data << /B << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 6 4 ] /Data << /B << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 6 5 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 6 7 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 6 8 ] /Data << /B << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 6 9 ] /Data << /B << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 6 10 ] /Data << /B << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 6 11 ] /Data << /B << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 6 12 ] /Data << /B << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 6 13 ] /Data << /B << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 6 14 ] /Data << /B << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 6 15 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 6 16 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 7 /Elements [ << /P [ 7 1 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 2 >> >> >> << /P [ 7 3 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 2 >> >> >> << /P [ 7 4 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 2 >> >> >> << /P [ 7 5 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 7 7 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 7 8 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 2 >> >> >> << /P [ 7 9 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 2 >> >> >> << /P [ 7 10 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 2 >> >> >> << /P [ 7 12 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 2 >> >> >> << /P [ 7 13 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 2 >> >> >> << /P [ 7 14 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 2 >> >> >> << /P [ 7 15 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 2 >> >> >> << /P [ 7 16 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 2 >> >> >> ] >> << /Index 8 /Elements [ << /P [ 8 1 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 8 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 8 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 8 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 15 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 8 16 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 9 /Elements [ << /P [ 9 1 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 9 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 9 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 9 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 15 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 9 16 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 10 /Elements [ << /P [ 10 1 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 10 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 10 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 10 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 15 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 10 16 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 11 /Elements [ << /P [ 11 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 11 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 11 15 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 4 >> >> >> << /P [ 11 16 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 4 >> >> >> ] >> << /Index 12 /Elements [ << /P [ 12 1 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 12 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 12 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 12 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 15 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 12 16 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 13 /Elements [ << /P [ 13 1 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 13 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 13 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 13 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 15 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 13 16 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 14 /Elements [ << /P [ 14 1 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 14 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 14 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 14 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 15 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 14 16 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 15 /Elements [ << /P [ 15 1 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 15 3 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 15 4 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 15 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 15 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 15 8 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 15 9 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 15 10 ] /Data << /A << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 15 12 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 15 14 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 16 /Elements [ << /P [ 16 1 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 16 3 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 16 4 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 16 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 16 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 16 8 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 16 9 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 16 10 ] /Data << /A << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 16 12 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 16 14 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> ] >> >> /PredefinedTag 1 >> >> >> << /Resource << /Name (GyomatsuYakumonoHankaku) /Members << /CodeToClass 0 /AutoTsume << /TsumeMappings [ << /Before -.5 /Code () >> << /Before -.5 /Code (;) >> << /Before -.5 /Code ([) >> << /Before -.5 /Code ( ) >> << /Before -.5 /Code ( ) >> << /Before -.5 /Code (0) >> << /Before -.5 /Code (0 ) >> << /Before -.5 /Code (0 ) >> << /Before -.5 /Code (0) >> << /Before -.5 /Code (0) >> << /Before -.5 /Code (0) >> << /After -.5 /Code ( ) >> << /After -.5 /Code (=) >> << /After -.5 /Code (]) >> << /After -.5 /Code ( ) >> << /After -.5 /Code ( ) >> << /After -.5 /Code (0 ) >> << /After -.5 /Code (0 ) >> << /After -.5 /Code (0 ) >> << /After -.5 /Code (0) >> << /After -.5 /Code (0) >> << /After -.5 /Code (0) >> << /After -.5 /Code () >> << /After -.5 /Code (0) >> << /After -.5 /Code ( ) >> << /After -.5 /Code (0) >> << /Before -.25 /After -.25 /Code () >> << /Before -.25 /After -.25 /Code () >> << /Before -.25 /After -.25 /Code (0) >> << /Before -.25 /After -.25 /Code ( ) >> ] >> /Table << /DataArray << /SparseArray [ << /Index 1 /Elements [ << /P [ 1 5 ] /Data << /A << /R [ .25 .25 .25 ] /P 1 >> >> >> ] >> << /Index 2 /Elements [ << /P [ 2 1 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 2 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 3 >> >> >> << /P [ 2 3 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 4 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 5 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 2 7 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 2 8 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 9 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 10 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 11 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 3 >> >> >> << /P [ 2 12 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 13 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 14 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 15 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 16 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> ] >> << /Index 3 /Elements [ << /P [ 3 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 3 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 3 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 3 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 15 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 3 16 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 4 /Elements [ << /P [ 4 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 4 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 4 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 4 15 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 4 16 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> ] >> << /Index 5 /Elements [ << /P [ 5 1 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 2 ] /Data << /B << /R [ .25 .25 .25 ] /P 1 >> >> >> << /P [ 5 3 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 4 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 5 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 1 >> >> >> << /P [ 5 6 ] /Data << /B << /R [ .25 .25 .25 ] /P 1 >> >> >> << /P [ 5 7 ] /Data << /B << /R [ .25 .25 .25 ] /P 1 >> >> >> << /P [ 5 8 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 9 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 10 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 11 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 12 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 13 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 14 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 15 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 16 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> ] >> << /Index 6 /Elements [ << /P [ 6 1 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 6 3 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 4 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 5 ] /Data << /B << /R [ 0.0 .75 .75 ] /P 1 >> >> >> << /P [ 6 7 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 6 8 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 9 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 10 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 11 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 12 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 13 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 14 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 15 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 4 >> >> >> << /P [ 6 16 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 4 >> >> >> ] >> << /Index 7 /Elements [ << /P [ 7 1 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 3 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 4 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 5 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 7 7 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 7 8 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 9 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 10 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 12 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 13 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 14 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 15 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 16 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> ] >> << /Index 8 /Elements [ << /P [ 8 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 8 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 8 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 8 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 15 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 8 16 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 9 /Elements [ << /P [ 9 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 9 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 9 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 9 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 15 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 9 16 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 10 /Elements [ << /P [ 10 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 10 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 10 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 10 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 15 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 10 16 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 11 /Elements [ << /P [ 11 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 11 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 11 15 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 4 >> >> >> << /P [ 11 16 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 4 >> >> >> ] >> << /Index 12 /Elements [ << /P [ 12 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 12 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 12 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 12 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 15 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 12 16 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 13 /Elements [ << /P [ 13 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 13 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 13 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 13 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 15 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 13 16 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 14 /Elements [ << /P [ 14 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 14 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 14 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 14 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 15 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 14 16 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 15 /Elements [ << /P [ 15 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 15 3 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 15 4 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 15 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 15 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 15 8 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 15 9 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 15 10 ] /Data << /A << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 15 12 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 15 14 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 16 /Elements [ << /P [ 16 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 16 3 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 16 4 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 16 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 16 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 16 8 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 16 9 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 16 10 ] /Data << /A << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 16 12 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 16 14 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> ] >> >> /PredefinedTag 3 >> >> >> << /Resource << /Name (GyomatsuYakumonoZenkaku) /Members << /CodeToClass 0 /AutoTsume << /TsumeMappings [ << /Before -.5 /Code () >> << /Before -.5 /Code (;) >> << /Before -.5 /Code ([) >> << /Before -.5 /Code ( ) >> << /Before -.5 /Code ( ) >> << /Before -.5 /Code (0) >> << /Before -.5 /Code (0 ) >> << /Before -.5 /Code (0 ) >> << /Before -.5 /Code (0) >> << /Before -.5 /Code (0) >> << /Before -.5 /Code (0) >> << /After -.5 /Code ( ) >> << /After -.5 /Code (=) >> << /After -.5 /Code (]) >> << /After -.5 /Code ( ) >> << /After -.5 /Code ( ) >> << /After -.5 /Code (0 ) >> << /After -.5 /Code (0 ) >> << /After -.5 /Code (0 ) >> << /After -.5 /Code (0) >> << /After -.5 /Code (0) >> << /After -.5 /Code (0) >> << /After -.5 /Code () >> << /After -.5 /Code (0) >> << /After -.5 /Code ( ) >> << /After -.5 /Code (0) >> << /Before -.25 /After -.25 /Code () >> << /Before -.25 /After -.25 /Code () >> << /Before -.25 /After -.25 /Code (0) >> << /Before -.25 /After -.25 /Code ( ) >> ] >> /Table << /DataArray << /SparseArray [ << /Index 1 /Elements [ << /P [ 1 5 ] /Data << /A << /R [ .25 .25 .25 ] /P 1 >> >> >> ] >> << /Index 2 /Elements [ << /P [ 2 1 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 2 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 3 >> >> >> << /P [ 2 3 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 4 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 5 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 2 7 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 2 8 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 9 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 10 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 11 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 3 >> >> >> << /P [ 2 12 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 13 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 14 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 15 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 16 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 17 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> ] >> << /Index 3 /Elements [ << /P [ 3 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 3 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 3 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 3 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 15 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 3 16 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 4 /Elements [ << /P [ 4 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 4 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 4 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 4 15 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 4 16 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> ] >> << /Index 5 /Elements [ << /P [ 5 1 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 2 ] /Data << /B << /R [ .25 .25 .25 ] /P 1 >> >> >> << /P [ 5 3 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 4 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 5 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 1 >> >> >> << /P [ 5 6 ] /Data << /B << /R [ .25 .25 .25 ] /P 1 >> >> >> << /P [ 5 7 ] /Data << /B << /R [ .25 .25 .25 ] /P 1 >> >> >> << /P [ 5 8 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 9 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 10 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 11 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 12 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 13 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 14 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 15 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 16 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> ] >> << /Index 6 /Elements [ << /P [ 6 1 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 6 3 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 4 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 5 ] /Data << /B << /R [ 0.0 .75 .75 ] /P 1 >> >> >> << /P [ 6 7 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 6 8 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 9 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 10 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 11 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 12 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 13 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 14 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 15 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 4 >> >> >> << /P [ 6 16 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 4 >> >> >> << /P [ 6 17 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> ] >> << /Index 7 /Elements [ << /P [ 7 1 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 3 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 4 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 5 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 7 7 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 7 8 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 9 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 10 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 12 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 13 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 14 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 15 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 16 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 17 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> ] >> << /Index 8 /Elements [ << /P [ 8 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 8 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 8 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 8 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 15 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 8 16 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 9 /Elements [ << /P [ 9 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 9 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 9 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 9 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 15 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 9 16 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 10 /Elements [ << /P [ 10 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 10 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 10 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 10 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 15 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 10 16 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 11 /Elements [ << /P [ 11 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 11 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 11 15 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 4 >> >> >> << /P [ 11 16 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 4 >> >> >> ] >> << /Index 12 /Elements [ << /P [ 12 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 12 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 12 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 12 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 15 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 12 16 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 13 /Elements [ << /P [ 13 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 13 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 13 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 13 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 15 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 13 16 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 14 /Elements [ << /P [ 14 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 14 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 14 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 14 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 15 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 14 16 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 15 /Elements [ << /P [ 15 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 15 3 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 15 4 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 15 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 15 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 15 8 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 15 9 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 15 10 ] /Data << /A << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 15 12 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 15 14 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 16 /Elements [ << /P [ 16 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 16 3 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 16 4 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 16 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 16 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 16 8 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 16 9 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 16 10 ] /Data << /A << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 16 12 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 16 14 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> ] >> >> /PredefinedTag 4 >> >> >> << /Resource << /Name (YakumonoZenkaku) /Members << /CodeToClass 0 /AutoTsume << /TsumeMappings [ << /Before -.5 /Code () >> << /Before -.5 /Code (;) >> << /Before -.5 /Code ([) >> << /Before -.5 /Code ( ) >> << /Before -.5 /Code ( ) >> << /Before -.5 /Code (0) >> << /Before -.5 /Code (0 ) >> << /Before -.5 /Code (0 ) >> << /Before -.5 /Code (0) >> << /Before -.5 /Code (0) >> << /Before -.5 /Code (0) >> << /After -.5 /Code ( ) >> << /After -.5 /Code (=) >> << /After -.5 /Code (]) >> << /After -.5 /Code ( ) >> << /After -.5 /Code ( ) >> << /After -.5 /Code (0 ) >> << /After -.5 /Code (0 ) >> << /After -.5 /Code (0 ) >> << /After -.5 /Code (0) >> << /After -.5 /Code (0) >> << /After -.5 /Code (0) >> << /After -.5 /Code () >> << /After -.5 /Code (0) >> << /After -.5 /Code ( ) >> << /After -.5 /Code (0) >> << /Before -.25 /After -.25 /Code () >> << /Before -.25 /After -.25 /Code () >> << /Before -.25 /After -.25 /Code (0) >> << /Before -.25 /After -.25 /Code ( ) >> ] >> /Table << /DataArray << /SparseArray [ << /Index 1 /Elements [ << /P [ 1 5 ] /Data << /A << /R [ .25 .25 .25 ] /P 1 >> >> >> ] >> << /Index 2 /Elements [ << /P [ 2 1 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 2 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 3 >> >> >> << /P [ 2 3 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 4 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 5 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 2 7 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 2 8 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 9 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 10 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 11 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 3 >> >> >> << /P [ 2 12 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 13 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 14 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 15 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 16 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 17 ] /Data << /B << /R [ .5 .5 .5 ] >> >> >> ] >> << /Index 3 /Elements [ << /P [ 3 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 3 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 3 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 3 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 15 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 3 16 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 4 /Elements [ << /P [ 4 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 4 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 4 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 4 15 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 4 16 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> ] >> << /Index 5 /Elements [ << /P [ 5 1 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 2 ] /Data << /B << /R [ .25 .25 .25 ] /P 1 >> >> >> << /P [ 5 3 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 4 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 5 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 1 >> >> >> << /P [ 5 6 ] /Data << /B << /R [ .25 .25 .25 ] /P 1 >> >> >> << /P [ 5 7 ] /Data << /B << /R [ .25 .25 .25 ] /P 1 >> >> >> << /P [ 5 8 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 9 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 10 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 11 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 12 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 13 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 14 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 15 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 16 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 17 ] /Data << /B << /R [ .25 .25 .25 ] >> >> >> ] >> << /Index 6 /Elements [ << /P [ 6 1 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 6 3 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 4 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 5 ] /Data << /B << /R [ 0.0 .75 .75 ] /P 1 >> >> >> << /P [ 6 7 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 6 8 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 9 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 10 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 11 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 12 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 13 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 14 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 15 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 4 >> >> >> << /P [ 6 16 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 4 >> >> >> << /P [ 6 17 ] /Data << /B << /R [ .5 .5 .5 ] >> >> >> ] >> << /Index 7 /Elements [ << /P [ 7 1 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 3 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 4 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 5 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 7 7 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 7 8 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 9 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 10 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 12 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 13 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 14 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 15 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 16 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 17 ] /Data << /B << /R [ .5 .5 .5 ] >> >> >> ] >> << /Index 8 /Elements [ << /P [ 8 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 8 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 8 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 8 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 15 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 8 16 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 9 /Elements [ << /P [ 9 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 9 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 9 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 9 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 15 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 9 16 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 10 /Elements [ << /P [ 10 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 10 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 10 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 10 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 15 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 10 16 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 11 /Elements [ << /P [ 11 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 11 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 11 15 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 4 >> >> >> << /P [ 11 16 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 4 >> >> >> ] >> << /Index 12 /Elements [ << /P [ 12 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 12 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 12 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 12 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 15 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 12 16 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 13 /Elements [ << /P [ 13 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 13 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 13 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 13 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 15 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 13 16 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 14 /Elements [ << /P [ 14 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 14 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 14 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 14 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 15 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 14 16 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 15 /Elements [ << /P [ 15 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 15 3 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 15 4 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 15 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 15 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 15 8 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 15 9 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 15 10 ] /Data << /A << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 15 12 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 15 14 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 16 /Elements [ << /P [ 16 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 16 3 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 16 4 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 16 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 16 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 16 8 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 16 9 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 16 10 ] /Data << /A << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 16 12 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 16 14 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 17 /Elements [ << /P [ 17 1 ] /Data << /A << /R [ .5 .5 .5 ] >> >> >> ] >> << /Index 18 /Elements [ << /P [ 18 1 ] /Data << /A << /R [ .5 .5 .5 ] >> >> >> ] >> ] >> >> /PredefinedTag 2 >> >> >> ] /DisplayList [ << /Resource 0 >> << /Resource 1 >> << /Resource 2 >> << /Resource 3 >> << /Resource 4 >> << /Resource 5 >> << /Resource 6 >> << /Resource 7 >> ] >> /KinsokuSet << /Resources [ << /Resource << /Name (None) /Data << /NoStart () /NoEnd () /Keep () /Hanging () /PredefinedTag 0 >> >> >> << /Resource << /Name (PhotoshopKinsokuHard) /Data << /NoStart (!\),.:;?]}    0!! 0000 0 0 0000A0C0E0G0I0c000000000000000000000000 =]) /NoEnd (\([{  00 0 0000 ;[) /Keep (  % &) /Hanging (00 ) /PredefinedTag 1 >> >> >> << /Resource << /Name (PhotoshopKinsokuSoft) /Data << /NoStart (  0000 0 0 00000000 =]) /NoEnd (  00 0 000;[) /Keep (  % &) /Hanging (00 ) /PredefinedTag 2 >> >> >> << /Resource << /Name (Hard) /Data << /NoStart (!\),.:;?]}    0!! 0000 0 0 0000A0C0E0G0I0c000000000000000000000000 =]) /NoEnd (\([{  00 0 0000 ;[) /Keep (  % &) /Hanging (00 ) /PredefinedTag 1 >> >> >> << /Resource << /Name (Soft) /Data << /NoStart (  0000 0 0 00000000 =]) /NoEnd (  00 0 000;[) /Keep (  % &) /Hanging (00 ) /PredefinedTag 2 >> >> >> ] /DisplayList [ << /Resource 0 >> << /Resource 1 >> << /Resource 2 >> << /Resource 3 >> << /Resource 4 >> ] >> /StyleSheetSet << /Resources [ << /Resource << /Name (Normal RGB) /Features << /Font 1 /FontSize 12.0 /FauxBold false /FauxItalic false /AutoLeading true /Leading 0.0 /HorizontalScale 1.0 /VerticalScale 1.0 /Tracking 0 /BaselineShift 0.0 /CharacterRotation 0.0 /AutoKern 1 /FontCaps 0 /FontBaseline 0 /FontOTPosition 0 /StrikethroughPosition 0 /UnderlinePosition 0 /UnderlineOffset 0.0 /Ligatures true /DiscretionaryLigatures false /ContextualLigatures false /AlternateLigatures false /OldStyle false /Fractions false /Ordinals false /Swash false /Titling false /ConnectionForms false /StylisticAlternates false /Ornaments false /FigureStyle 0 /ProportionalMetrics false /Kana false /Italics false /Ruby false /BaselineDirection 2 /Tsume 0.0 /StyleRunAlignment 2 /Language 0 /JapaneseAlternateFeature 0 /EnableWariChu false /WariChuLineCount 2 /WariChuLineGap 0 /WariChuSubLineAmount << /WariChuSubLineScale .5 >> /WariChuWidowAmount 2 /WariChuOrphanAmount 2 /WariChuJustification 7 /TCYUpDownAdjustment 0 /TCYLeftRightAdjustment 0 /LeftAki -1.0 /RightAki -1.0 /JiDori 0 /NoBreak false /FillColor << /StreamTag /SimplePaint /Color << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> >> /StrokeColor << /StreamTag /SimplePaint /Color << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> >> /Blend << /StreamTag /SimpleBlender >> /FillFlag true /StrokeFlag false /FillFirst true /FillOverPrint false /StrokeOverPrint false /LineCap 0 /LineJoin 0 /LineWidth 1.0 /MiterLimit 4.0 /LineDashOffset 0.0 /LineDashArray [ ] /Type1EncodingNames [ ] >> >> >> ] /DisplayList [ << /Resource 0 >> ] >> /ParagraphSheetSet << /Resources [ << /Resource << /Name (Normal RGB) /Features << /Justification 0 /FirstLineIndent 0.0 /StartIndent 0.0 /EndIndent 0.0 /SpaceBefore 0.0 /SpaceAfter 0.0 /DropCaps 1 /AutoLeading 1.2 /LeadingType 0 /AutoHyphenate true /HyphenatedWordSize 6 /PreHyphen 2 /PostHyphen 2 /ConsecutiveHyphens 0 /Zone 36.0 /HyphenateCapitalized true /HyphenationPreference .5 /WordSpacing [ .8 1.0 1.33 ] /LetterSpacing [ 0.0 0.0 0.0 ] /GlyphSpacing [ 1.0 1.0 1.0 ] /SingleWordJustification 6 /Hanging false /AutoTCY 0 /KeepTogether true /BurasagariType 0 /KinsokuOrder 0 /KurikaeshiMojiShori false /Kinsoku /nil /MojiKumiTable /nil /EveryLineComposer false /TabStops << >> /DefaultTabWidth 36.0 /DefaultStyle << >> >> >> >> ] /DisplayList [ << /Resource 0 >> ] >> /TextFrameSet << /Resources [ << /Resource << /Bezier << /Points [ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ] >> /Data << /Type 0 /LineOrientation 0 /TextOnPathTRange [ -1.0 -1.0 ] /RowGutter 0.0 /ColumnGutter 0.0 /FirstBaselineAlignment << /Flag 1 /Min 0.0 >> /PathData << /Spacing -1 >> >> >> >> << /Resource << /Bezier << /Points [ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ] >> /Data << /Type 0 /LineOrientation 0 /TextOnPathTRange [ -1.0 -1.0 ] /RowGutter 0.0 /ColumnGutter 0.0 /FirstBaselineAlignment << /Flag 1 /Min 0.0 >> /PathData << /Spacing -1 >> >> >> >> ] >> >> /DocumentObjects << /DocumentSettings << /HiddenGlyphFont << /AlternateGlyphFont 2 /WhitespaceCharacterMapping [ << /WhitespaceCharacter ( ) /AlternateCharacter (1) >> << /WhitespaceCharacter ( ) /AlternateCharacter (6) >> << /WhitespaceCharacter ( ) /AlternateCharacter (0) >> << /WhitespaceCharacter ( \)) /AlternateCharacter (5) >> << /WhitespaceCharacter () /AlternateCharacter (5) >> << /WhitespaceCharacter (0) /AlternateCharacter (1) >> << /WhitespaceCharacter () /AlternateCharacter (3) >> ] >> /NormalStyleSheet 0 /NormalParagraphSheet 0 /SuperscriptSize .583 /SuperscriptPosition .333 /SubscriptSize .583 /SubscriptPosition .333 /SmallCapSize .7 /UseSmartQuotes true /SmartQuoteSets [ << /Language 0 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 1 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 2 /OpenDoubleQuote () /CloseDoubleQuote () /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 3 /OpenDoubleQuote () /CloseDoubleQuote () /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 4 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 5 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 6 /OpenDoubleQuote () /CloseDoubleQuote () /OpenSingleQuote ( 9) /CloseSingleQuote ( :) >> << /Language 7 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 8 /OpenDoubleQuote () /CloseDoubleQuote () /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 9 /OpenDoubleQuote () /CloseDoubleQuote () /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 10 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 11 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 12 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 13 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 14 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 15 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 16 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 17 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 18 /OpenDoubleQuote () /CloseDoubleQuote () /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 19 /OpenDoubleQuote () /CloseDoubleQuote () /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 20 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 21 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 22 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 23 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 24 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 25 /OpenDoubleQuote () /CloseDoubleQuote () /OpenSingleQuote ( 9) /CloseSingleQuote ( :) >> << /Language 26 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 27 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 28 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 29 /OpenDoubleQuote (0) /CloseDoubleQuote (0) >> << /Language 30 /OpenDoubleQuote (0 ) /CloseDoubleQuote (0 ) >> << /Language 31 /OpenDoubleQuote () /CloseDoubleQuote () /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 33 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 34 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 35 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 36 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 37 /OpenDoubleQuote () /CloseDoubleQuote () /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 38 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 40 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 42 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 43 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 44 /OpenDoubleQuote () /CloseDoubleQuote () /OpenSingleQuote ( 9) /CloseSingleQuote ( :) >> << /Language 45 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> ] >> /TextObjects [ << /Model << /Text (Context Free ) /ParagraphRun << /RunArray [ << /RunData << /ParagraphSheet << /Name () /Features << /Justification 0 /FirstLineIndent 0.0 /StartIndent 0.0 /EndIndent 0.0 /SpaceBefore 0.0 /SpaceAfter 0.0 /DropCaps 1 /AutoLeading 1.2 /LeadingType 0 /AutoHyphenate true /HyphenatedWordSize 6 /PreHyphen 2 /PostHyphen 2 /ConsecutiveHyphens 0 /Zone 36.0 /HyphenateCapitalized true /HyphenationPreference .5 /WordSpacing [ .8 1.0 1.33 ] /LetterSpacing [ 0.0 0.0 0.0 ] /GlyphSpacing [ 1.0 1.0 1.0 ] /SingleWordJustification 6 /Hanging false /AutoTCY 1 /KeepTogether true /BurasagariType 0 /KinsokuOrder 0 /KurikaeshiMojiShori false /Kinsoku /nil /MojiKumiTable /nil /EveryLineComposer false /TabStops << >> /DefaultTabWidth 36.0 /DefaultStyle << /Font 1 /FontSize 12.0 /FauxBold false /FauxItalic false /AutoLeading true /Leading 0.0 /HorizontalScale 1.0 /VerticalScale 1.0 /Tracking 0 /BaselineShift 0.0 /CharacterRotation 0.0 /AutoKern 1 /FontCaps 0 /FontBaseline 0 /FontOTPosition 0 /StrikethroughPosition 0 /UnderlinePosition 0 /UnderlineOffset 0.0 /Ligatures true /DiscretionaryLigatures false /ContextualLigatures false /AlternateLigatures false /OldStyle false /Fractions false /Ordinals false /Swash false /Titling false /ConnectionForms false /StylisticAlternates false /Ornaments false /FigureStyle 0 /ProportionalMetrics false /Kana false /Italics false /Ruby false /BaselineDirection 2 /Tsume 0.0 /StyleRunAlignment 2 /Language 0 /JapaneseAlternateFeature 0 /EnableWariChu false /WariChuLineCount 2 /WariChuLineGap 0 /WariChuSubLineAmount << /WariChuSubLineScale .5 >> /WariChuWidowAmount 2 /WariChuOrphanAmount 2 /WariChuJustification 7 /TCYUpDownAdjustment 0 /TCYLeftRightAdjustment 0 /LeftAki -1.0 /RightAki -1.0 /JiDori 0 /NoBreak false /FillColor << /StreamTag /SimplePaint /Color << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> >> /StrokeColor << /StreamTag /SimplePaint /Color << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> >> /Blend << /StreamTag /SimpleBlender >> /FillFlag true /StrokeFlag false /FillFirst true /FillOverPrint false /StrokeOverPrint false /LineCap 0 /LineJoin 0 /LineWidth 1.0 /MiterLimit 4.0 /LineDashOffset 0.0 /LineDashArray [ ] /Type1EncodingNames [ ] >> >> /Parent 0 >> >> /Length 13 >> ] >> /StyleRun << /RunArray [ << /RunData << /StyleSheet << /Name () /Parent 0 /Features << /Font 0 /FontSize 47.33333 /FauxBold false /FauxItalic false /AutoLeading true /Leading .00986 /HorizontalScale 1.0 /VerticalScale 1.0 /Tracking 0 /BaselineShift 0.0 /CharacterRotation 0.0 /AutoKern 1 /FontCaps 0 /FontBaseline 0 /FontOTPosition 0 /StrikethroughPosition 0 /UnderlinePosition 0 /UnderlineOffset 0.0 /Ligatures true /DiscretionaryLigatures false /ContextualLigatures true /AlternateLigatures false /OldStyle false /Fractions false /Ordinals false /Swash false /Titling false /ConnectionForms true /StylisticAlternates false /Ornaments false /FigureStyle 0 /ProportionalMetrics false /Kana false /Italics false /Ruby false /BaselineDirection 1 /Tsume 0.0 /StyleRunAlignment 2 /Language 0 /JapaneseAlternateFeature 0 /EnableWariChu false /WariChuLineCount 2 /WariChuLineGap 0 /WariChuSubLineAmount << /WariChuSubLineScale .5 >> /WariChuWidowAmount 2 /WariChuOrphanAmount 2 /WariChuJustification 7 /TCYUpDownAdjustment 0 /TCYLeftRightAdjustment 0 /LeftAki -1.0 /RightAki -1.0 /JiDori 0 /NoBreak false /FillColor << /StreamTag /SimplePaint /Color << /Type 1 /Values [ 1.0 1.0 1.0 1.0 ] >> >> /StrokeColor << /StreamTag /SimplePaint /Color << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> >> /Blend << /StreamTag /SimpleBlender >> /FillFlag true /StrokeFlag false /FillFirst false /FillOverPrint false /StrokeOverPrint false /LineCap 0 /LineJoin 0 /LineWidth .23997 /MiterLimit .95988 /LineDashOffset 0.0 /LineDashArray [ ] /Type1EncodingNames [ ] >> >> >> /Length 13 >> ] >> /KernRun << /RunArray [ << /RunData << >> /Length 13 >> ] >> /AlternateGlyphRun << /RunArray [ << /RunData << >> /Length 13 >> ] >> >> /View << /Frames [ << /Resource 1 >> ] /RenderedData << /RunArray [ << /RunData << /LineCount 1 >> /Length 13 >> ] >> /Strikes [ << /StreamTag /PathSelectGroupCharacter /Transform << /Origin [ 0.0 0.0 ] >> /Bounds [ 0.0 0.0 0.0 0.0 ] /ChildProcession 0 /Children [ << /StreamTag /FrameStrike /Frame 1 /Transform << /Origin [ 0.0 0.0 ] >> /Bounds [ 0.0 0.0 0.0 0.0 ] /ChildProcession 2 /Children [ << /StreamTag /RowColStrike /RowColIndex 0 /Transform << /Origin [ 0.0 0.0 ] >> /Bounds [ 0.0 0.0 0.0 0.0 ] /ChildProcession 1 /Children [ << /StreamTag /RowColStrike /RowColIndex 0 /Transform << /Origin [ 0.0 0.0 ] >> /Bounds [ 0.0 0.0 0.0 0.0 ] /ChildProcession 2 /Children [ << /StreamTag /LineStrike /Baseline 0.0 /Leading 0.0 /EMHeight 0.0 /DHeight 0.0 /SelectionAscent -40.87209 /SelectionDescent 9.77637 /Transform << /Origin [ 0.0 0.0 ] >> /Bounds [ 0.0 -40.87209 0.0 9.77637 ] /ChildProcession 1 /Children [ << /StreamTag /Segment /Mapping << /CharacterCount 13 >> /FirstCharacterIndexInSegment 0 /Transform << /Origin [ 0.0 0.0 ] >> /Bounds [ 0.0 0.0 0.0 0.0 ] /ChildProcession 1 /Children [ << /StreamTag /GlyphStrike /Transform << /Origin [ 0.0 0.0 ] >> /Bounds [ 0.0 -40.87209 305.67889 9.77637 ] /Glyphs [ 38 82 81 87 72 91 87 3 41 85 72 72 3 ] /GlyphAdjustments << /Data [ << >> ] /RunLengths [ 13 ] >> /VisualBounds [ 0.0 -40.87209 305.67889 9.77637 ] /RenderedBounds [ 0.0 -40.87209 305.67889 9.77637 ] /Invalidation [ 0.0 -40.87209 328.39868 9.77637 ] /ShadowStylesRun << /Data [ << /Index 0 /Font 0 /Scale [ 1.0 1.0 ] /Orientation 0 /BaselineDirection 2 /BaselineShift 0.0 /KernType 1 >> ] /RunLengths [ 13 ] >> /EndsInCR true /SelectionAscent -40.87209 /SelectionDescent 9.77637 >> ] >> ] >> ] >> ] >> ] >> ] >> ] >> /OpticalAlignment false >> << /Model << /Text (copyright 2005 Chris Coynecopyright 2005-2008 John Horigan & Mark Lentczner ) /ParagraphRun << /RunArray [ << /RunData << /ParagraphSheet << /Name () /Features << /Justification 0 /FirstLineIndent 0.0 /StartIndent 0.0 /EndIndent 0.0 /SpaceBefore 0.0 /SpaceAfter 0.0 /DropCaps 1 /AutoLeading 1.2 /LeadingType 0 /AutoHyphenate true /HyphenatedWordSize 6 /PreHyphen 2 /PostHyphen 2 /ConsecutiveHyphens 0 /Zone 36.0 /HyphenateCapitalized true /HyphenationPreference .5 /WordSpacing [ .8 1.0 1.33 ] /LetterSpacing [ 0.0 0.0 0.0 ] /GlyphSpacing [ 1.0 1.0 1.0 ] /SingleWordJustification 6 /Hanging false /AutoTCY 1 /KeepTogether true /BurasagariType 0 /KinsokuOrder 0 /KurikaeshiMojiShori false /Kinsoku /nil /MojiKumiTable /nil /EveryLineComposer false /TabStops << >> /DefaultTabWidth 36.0 /DefaultStyle << /Font 0 /FontSize 12.0 /FauxBold false /FauxItalic false /AutoLeading true /Leading 0.0 /HorizontalScale 1.0 /VerticalScale 1.0 /Tracking 0 /BaselineShift 0.0 /CharacterRotation 0.0 /FontCaps 0 /FontBaseline 0 /FontOTPosition 0 /StrikethroughPosition 0 /UnderlinePosition 0 /UnderlineOffset 0.0 /Ligatures true /DiscretionaryLigatures false /ContextualLigatures false /AlternateLigatures false /OldStyle false /Fractions false /Ordinals false /Swash false /Titling false /ConnectionForms false /StylisticAlternates false /Ornaments false /FigureStyle 0 /ProportionalMetrics false /Kana false /Italics false /Ruby false /BaselineDirection 2 /Tsume 0.0 /StyleRunAlignment 2 /Language 0 /EnableWariChu false /WariChuLineCount 2 /WariChuLineGap 0 /WariChuSubLineAmount << /WariChuSubLineScale .5 >> /WariChuWidowAmount 2 /WariChuOrphanAmount 2 /WariChuJustification 7 /TCYUpDownAdjustment 0 /TCYLeftRightAdjustment 0 /LeftAki -1.0 /RightAki -1.0 /JiDori 0 /NoBreak false /FillColor << /StreamTag /SimplePaint /Color << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> >> /StrokeColor << /StreamTag /SimplePaint /Color << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> >> /FillFlag true /StrokeFlag false /FillFirst true /FillOverPrint false /StrokeOverPrint false /LineCap 0 /LineJoin 0 /LineWidth 1.0 /MiterLimit 4.0 /LineDashOffset 0.0 /LineDashArray [ ] /Type1EncodingNames [ ] >> >> /Parent 0 >> >> /Length 29 >> << /RunData << /ParagraphSheet << /Name () /Features << /Justification 0 /FirstLineIndent 0.0 /StartIndent 0.0 /EndIndent 0.0 /SpaceBefore 0.0 /SpaceAfter 0.0 /DropCaps 1 /AutoLeading 1.2 /LeadingType 0 /AutoHyphenate true /HyphenatedWordSize 6 /PreHyphen 2 /PostHyphen 2 /ConsecutiveHyphens 0 /Zone 36.0 /HyphenateCapitalized true /HyphenationPreference .5 /WordSpacing [ .8 1.0 1.33 ] /LetterSpacing [ 0.0 0.0 0.0 ] /GlyphSpacing [ 1.0 1.0 1.0 ] /SingleWordJustification 6 /Hanging false /AutoTCY 1 /KeepTogether true /BurasagariType 0 /KinsokuOrder 0 /KurikaeshiMojiShori false /Kinsoku /nil /MojiKumiTable /nil /EveryLineComposer false /TabStops << >> /DefaultTabWidth 36.0 /DefaultStyle << /Font 0 /FontSize 12.0 /FauxBold false /FauxItalic false /AutoLeading true /Leading 0.0 /HorizontalScale 1.0 /VerticalScale 1.0 /Tracking 0 /BaselineShift 0.0 /CharacterRotation 0.0 /FontCaps 0 /FontBaseline 0 /FontOTPosition 0 /StrikethroughPosition 0 /UnderlinePosition 0 /UnderlineOffset 0.0 /Ligatures true /DiscretionaryLigatures false /ContextualLigatures false /AlternateLigatures false /OldStyle false /Fractions false /Ordinals false /Swash false /Titling false /ConnectionForms false /StylisticAlternates false /Ornaments false /FigureStyle 0 /ProportionalMetrics false /Kana false /Italics false /Ruby false /BaselineDirection 2 /Tsume 0.0 /StyleRunAlignment 2 /Language 0 /EnableWariChu false /WariChuLineCount 2 /WariChuLineGap 0 /WariChuSubLineAmount << /WariChuSubLineScale .5 >> /WariChuWidowAmount 2 /WariChuOrphanAmount 2 /WariChuJustification 7 /TCYUpDownAdjustment 0 /TCYLeftRightAdjustment 0 /LeftAki -1.0 /RightAki -1.0 /JiDori 0 /NoBreak false /FillColor << /StreamTag /SimplePaint /Color << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> >> /StrokeColor << /StreamTag /SimplePaint /Color << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> >> /FillFlag true /StrokeFlag false /FillFirst true /FillOverPrint false /StrokeOverPrint false /LineCap 0 /LineJoin 0 /LineWidth 1.0 /MiterLimit 4.0 /LineDashOffset 0.0 /LineDashArray [ ] /Type1EncodingNames [ ] >> >> /Parent 0 >> >> /Length 52 >> ] >> /StyleRun << /RunArray [ << /RunData << /StyleSheet << /Name () /Parent 0 /Features << /Font 0 /FontSize 13.80556 /FauxBold false /FauxItalic false /AutoLeading true /Leading 16.56667 /HorizontalScale 1.0 /VerticalScale 1.0 /Tracking 0 /BaselineShift 0.0 /CharacterRotation 0.0 /AutoKern 1 /FontCaps 0 /FontBaseline 0 /FontOTPosition 0 /StrikethroughPosition 0 /UnderlinePosition 0 /UnderlineOffset 0.0 /Ligatures true /DiscretionaryLigatures false /ContextualLigatures true /AlternateLigatures false /OldStyle false /Fractions false /Ordinals false /Swash false /Titling false /ConnectionForms true /StylisticAlternates false /Ornaments false /FigureStyle 0 /ProportionalMetrics false /Kana false /Italics false /Ruby false /BaselineDirection 1 /Tsume 0.0 /StyleRunAlignment 2 /Language 0 /JapaneseAlternateFeature 0 /EnableWariChu false /WariChuLineCount 2 /WariChuLineGap 0 /WariChuSubLineAmount << /WariChuSubLineScale .5 >> /WariChuWidowAmount 2 /WariChuOrphanAmount 2 /WariChuJustification 7 /TCYUpDownAdjustment 0 /TCYLeftRightAdjustment 0 /LeftAki -1.0 /RightAki -1.0 /JiDori 0 /NoBreak false /FillColor << /StreamTag /SimplePaint /Color << /Type 1 /Values [ 1.0 1.0 1.0 1.0 ] >> >> /StrokeColor << /StreamTag /SimplePaint /Color << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> >> /Blend << /StreamTag /SimpleBlender >> /FillFlag true /StrokeFlag false /FillFirst false /FillOverPrint false /StrokeOverPrint false /LineCap 0 /LineJoin 0 /LineWidth .23997 /MiterLimit .95988 /LineDashOffset 0.0 /LineDashArray [ ] /Type1EncodingNames [ ] >> >> >> /Length 81 >> ] >> /KernRun << /RunArray [ << /RunData << >> /Length 81 >> ] >> /AlternateGlyphRun << /RunArray [ << /RunData << >> /Length 81 >> ] >> >> /View << /Frames [ << /Resource 0 >> ] /RenderedData << /RunArray [ << /RunData << /LineCount 1 >> /Length 29 >> << /RunData << /LineCount 1 >> /Length 52 >> ] >> /Strikes [ << /StreamTag /PathSelectGroupCharacter /Transform << /Origin [ 0.0 0.0 ] >> /Bounds [ 0.0 0.0 0.0 0.0 ] /ChildProcession 0 /Children [ << /StreamTag /FrameStrike /Frame 0 /Transform << /Origin [ 0.0 0.0 ] >> /Bounds [ 0.0 0.0 0.0 0.0 ] /ChildProcession 2 /Children [ << /StreamTag /RowColStrike /RowColIndex 0 /Transform << /Origin [ 0.0 0.0 ] >> /Bounds [ 0.0 0.0 0.0 0.0 ] /ChildProcession 1 /Children [ << /StreamTag /RowColStrike /RowColIndex 0 /Transform << /Origin [ 0.0 0.0 ] >> /Bounds [ 0.0 0.0 0.0 0.0 ] /ChildProcession 2 /Children [ << /StreamTag /LineStrike /Baseline 0.0 /Leading 0.0 /EMHeight 0.0 /DHeight 0.0 /SelectionAscent -11.92103 /SelectionDescent 2.85144 /Transform << /Origin [ 0.0 0.0 ] >> /Bounds [ 0.0 -11.92103 0.0 2.85144 ] /ChildProcession 1 /Children [ << /StreamTag /Segment /Mapping << /CharacterCount 29 >> /FirstCharacterIndexInSegment 0 /Transform << /Origin [ 0.0 0.0 ] >> /Bounds [ 0.0 0.0 0.0 0.0 ] /ChildProcession 1 /Children [ << /StreamTag /GlyphStrike /Transform << /Origin [ 0.0 0.0 ] >> /Bounds [ 0.0 -11.92103 211.39064 2.85144 ] /Glyphs [ 70 82 83 92 85 76 74 75 87 3 139 3 21 19 19 24 3 38 75 85 76 86 3 38 82 92 81 72 3 ] /GlyphAdjustments << /Data [ << >> ] /RunLengths [ 29 ] >> /VisualBounds [ 0.0 -11.92103 211.39064 2.85144 ] /RenderedBounds [ 0.0 -11.92103 211.39064 2.85144 ] /Invalidation [ 0.0 -11.92103 217.5479 2.85144 ] /ShadowStylesRun << /Data [ << /Index 0 /Font 0 /Scale [ 1.0 1.0 ] /Orientation 0 /BaselineDirection 2 /BaselineShift 0.0 /KernType 1 >> ] /RunLengths [ 29 ] >> /EndsInCR true /SelectionAscent -11.92103 /SelectionDescent 2.85144 >> ] >> ] >> << /StreamTag /LineStrike /Baseline 16.56667 /Leading 0.0 /EMHeight 0.0 /DHeight 0.0 /SelectionAscent -11.92103 /SelectionDescent 2.85144 /Transform << /Origin [ 0.0 16.56667 ] >> /Bounds [ 0.0 -11.92103 0.0 2.85144 ] /ChildProcession 1 /Children [ << /StreamTag /Segment /Mapping << /CharacterCount 52 >> /FirstCharacterIndexInSegment 29 /Transform << /Origin [ 0.0 0.0 ] >> /Bounds [ 0.0 0.0 0.0 0.0 ] /ChildProcession 1 /Children [ << /StreamTag /GlyphStrike /Transform << /Origin [ 0.0 0.0 ] >> /Bounds [ 0.0 -11.92103 386.62268 2.85144 ] /Glyphs [ 70 82 83 92 85 76 74 75 87 3 139 3 21 19 19 24 16 21 19 19 27 3 45 82 75 81 3 43 82 85 76 74 68 81 3 9 3 48 68 85 78 3 47 72 81 87 70 93 81 72 85 3 ] /GlyphAdjustments << /Data [ << >> ] /RunLengths [ 52 ] >> /VisualBounds [ 0.0 4.64564 386.68121 19.41811 ] /RenderedBounds [ 0.0 4.64564 386.68121 19.41811 ] /Invalidation [ 0.0 4.64564 393.24927 19.41811 ] /ShadowStylesRun << /Data [ << /Index 0 /Font 0 /Scale [ 1.0 1.0 ] /Orientation 0 /BaselineDirection 2 /BaselineShift 0.0 /KernType 1 >> ] /RunLengths [ 52 ] >> /EndsInCR true /SelectionAscent -11.92103 /SelectionDescent 2.85144 >> ] >> ] >> ] >> ] >> ] >> ] >> ] >> /OpticalAlignment false >> ] /OriginalNormalStyleFeatures << /Font 1 /FontSize 12.0 /FauxBold false /FauxItalic false /AutoLeading true /Leading 0.0 /HorizontalScale 1.0 /VerticalScale 1.0 /Tracking 0 /BaselineShift 0.0 /CharacterRotation 0.0 /AutoKern 1 /FontCaps 0 /FontBaseline 0 /FontOTPosition 0 /StrikethroughPosition 0 /UnderlinePosition 0 /UnderlineOffset 0.0 /Ligatures true /DiscretionaryLigatures false /ContextualLigatures false /AlternateLigatures false /OldStyle false /Fractions false /Ordinals false /Swash false /Titling false /ConnectionForms false /StylisticAlternates false /Ornaments false /FigureStyle 0 /ProportionalMetrics false /Kana false /Italics false /Ruby false /BaselineDirection 2 /Tsume 0.0 /StyleRunAlignment 2 /Language 0 /JapaneseAlternateFeature 0 /EnableWariChu false /WariChuLineCount 2 /WariChuLineGap 0 /WariChuSubLineAmount << /WariChuSubLineScale .5 >> /WariChuWidowAmount 2 /WariChuOrphanAmount 2 /WariChuJustification 7 /TCYUpDownAdjustment 0 /TCYLeftRightAdjustment 0 /LeftAki -1.0 /RightAki -1.0 /JiDori 0 /NoBreak false /FillColor << /StreamTag /SimplePaint /Color << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> >> /StrokeColor << /StreamTag /SimplePaint /Color << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> >> /Blend << /StreamTag /SimpleBlender >> /FillFlag true /StrokeFlag false /FillFirst true /FillOverPrint false /StrokeOverPrint false /LineCap 0 /LineJoin 0 /LineWidth 1.0 /MiterLimit 4.0 /LineDashOffset 0.0 /LineDashArray [ ] /Type1EncodingNames [ ] >> /OriginalNormalParagraphFeatures << /Justification 0 /FirstLineIndent 0.0 /StartIndent 0.0 /EndIndent 0.0 /SpaceBefore 0.0 /SpaceAfter 0.0 /DropCaps 1 /AutoLeading 1.2 /LeadingType 0 /AutoHyphenate true /HyphenatedWordSize 6 /PreHyphen 2 /PostHyphen 2 /ConsecutiveHyphens 0 /Zone 36.0 /HyphenateCapitalized true /HyphenationPreference .5 /WordSpacing [ .8 1.0 1.33 ] /LetterSpacing [ 0.0 0.0 0.0 ] /GlyphSpacing [ 1.0 1.0 1.0 ] /SingleWordJustification 6 /Hanging false /AutoTCY 0 /KeepTogether true /BurasagariType 0 /KinsokuOrder 0 /KurikaeshiMojiShori false /Kinsoku /nil /MojiKumiTable /nil /EveryLineComposer false /TabStops << >> /DefaultTabWidth 36.0 /DefaultStyle << >> >> >>8BIMFMsk 2 ,5B;GB@?pGEJDC;8:?SRMPVRKT_\^]\\`\_`rprquuxrcqqrsv~ysrx}t|~qmvtqf[UV]bcmnkicbXDNZOOLJJGLLLWXNSXYPNPJ>?:884.)g~@4"%#ZcaQGT`Q-& +8?=G@@?oGGHBA;6:CSULNTQLY][\\[\^[_`sotqtvzrfrrrtw~rt|~x|}onsrrfZUVabbmpdhg]WDLUNNJIFFIGLUUNPXZOKSIB>>8:4.+b~>3"%" `caRHP`Q-& ,=@>G@??mFFG@>;59DTPMNVONY]Y^[Z[_Z\^pnqksrvpcqrq|vv~zrvx}wy~okstrfVQT\acjqefg]XHNXQMILHFKHLUTOQW[OKUH?==883.*gB5"&#`daTIP`Q-& 33333333333333333333333333333333333335764333333 5=>@>>?DG>4333333983?J<333333835GE3333353353CH3333353433F333332738334N<3333364337533;Q433333<39733KC333334D7339T33M̿f33MffY334<8933S=33fY33f@3@f3̪332347833<533463GM3233Ỳ33f3f3̪335423=33763:X533f33f3f3̪33@33<3RF3433f@3Mff33f3f333@4335;3CV535333Mf33f3f33338?33?34UG3533Y@3Mf33f3f3333E533@3EY:36433@3f33f3f33337F33>53US432833fM3YM3YsY3Yf333f3Yf3f333fsY3Yf33=E33@638^M376333M@3Y33M@3Y3MM33s33Y3333@f3f@3MM33>I533B3@aI36:33M3f3f3Y3f33Ms3@@33f33333@3@s333:M=33F3GaI3434<3333@3f3@3fM3Y3f33333Y3@335KC336E3K`M383?433Y3ٙfs33f3Y3f333f3333M̀M33@sY3Y3f3343KD33C<3K_O36739;333ff3@3M3M@3f33@M33f3f333ٙ3s3Y33@M33734P=335K3P]G3>3C4333Y333s3f3f3@3@3@@3f3M3f3Y3ff3f3@33939S4333I;34\^=3<537A33Y33M3@3M3f333YY3M3f3f3f3@33333;3JF333DE38b^43B43?933 689765323f33M3f33f3MY3MM3@33f3f3f3@333MY3MM337838V533DK34543EbR34C3G4334<>832331f333f33f33f33Y3f3f333M33f33@3NC334IL43:94323\_>37B34H33=A6323e3Ys33f33f333@3f3M33s3f33337>3AR33=RH35=5393Pji3j`dVNC53:E39H33B@333ff3f33f3f3s3f3333fM3f33AKD=536;EOZR@OT93E3Hj b3LNZcem`Y@3N36L339I3s33ff3f33f33MY3f3333ff333 :DLPRSSOI@63BB39?36Tha>39JZjf^E3L43N733H;33M3M3f33f33@@3f3333M333<X3573>;3_Y39T_jXA3J83I?339J3M@3ff33f33f333f3333333RF34<:3B93CbU3:VbiP83I<3?J33CA3333f33f3M3s33f33333M33;^838=3B834ae63BYgbD3K;35Q8335N73ff3Y33M3f33f3Y3Y33@f3f33333Y333JX639=3A=3M`G35P\gR53O93FH33CF3Y3@f3s3Y3f333f3f3@3Y@3YY3333M@3f3f3f333TW73@53=B3>^[43Bb\\938N739Q9338N83Ms3ff3@@3Y3f333sY3@3M333333@3M3sY3@3334T^?35A36K38^b638^cU934O_N3HK33KE3Y3@f3M3ff3f333@3M333Y3333@3f3@3M333KgN53F3M736\`<36Vd]73DUDVD>38QA33EM43٥ff3f33@s3f33Mfff3@f3s3@s3sff3333Y岀f3@f333>c_J53G3BE38[\@3 7ZY]7:QG5335Q>3CQ;33?P;3sY3@3f33f3@3M@3YM3@3333Y3@3334NabJ3G435R53<_X>37^cZP736V93MP933>PC3M3@3f33@f33@Y3@3Y3333@s33337QhZ93G53CJ3EbS83;]qU3=U35PP833@QG3Yf3f3f33Y3@f333@3333MٙM3@f333@c`@3J434S=3;Q`I437WaYG3NE36QR:33HQG3YY3YM33ffY3@ffM3@ffM33Mff@3@ffM3338^aE32453N3>S633 8BINPQQihVRNC63D4339Z^L3DS34F[FCK>E[AVB533333:``5327;GF38CI>438TS736=34=DWZM53`:3M[E333333D\U3RE?BBD@837P[?3:83C^T3\@3A[[Z9333333U_@34Y34I_O:3=53U^:A\q^KC=43?G:33333336`^43;T3=Z[QA3>3W^ a4343JU337;735?D733335337`T43OH373CRiahQ=3B^^>3KZ36CQPKM;34UJ334636F=333343833O`B3OI3837JdblT=3QWT3\O3 7EPPGD433B^<3326<;23E?33335638633@ZK3OM3<3G`ilO73C`_;3=f<3?LNQK54[P347434853573I93333:3<335]\4NW3=34M`meB34T]S3QW37LQHOQX>338<63537236M3333;35<33QU:Ca3>39[blR43LbZ73<\E3CPXqX33;=363D@3333=3?339BEFDA93M\E8c<369967;3Kj``:3733?ME:34<@73CVF3\M337755734Xb[QQ;338@3L:3333A39:338MF53 :<33A[P3O_43=34?A539Yjg;3RY^8383<33@S6343YdK3HRJI433;E35V33335D3A833>V73K63X733334I438F35WB3?WR6GU\ynNOX`fYI83?A3J>PccO3KL3E[R93CUg\\:3BNLP439N93[:3333;H3H83MN3 @Q\TE73=iS39J[aS;34O3PgO3E[O537MZh^bF3OSSF39P73[83333@I433>G3:]73SlS3IgH3>VeQ533G<3dgb3BUP637E\`jabJ43>SSH63;Q:35\53333>N86N53QM38;3:KYRG3X]73A^^>3=H3dgb3:NV93AXkajc\F3HMUG3?><>CHD5RQ<3?eK36ScF5Q34?PgO3QW>3Abmal^R<3?UUT735LVB36N]@IKHOISQJMDC:53333IX?43GW3 6:95339RR83Ve83KbMT38]e>PccO>I33CNI3@cldm[B3PUN@3ADPPabJQQLRMUURWOXQ[QKA43333?G4=M>3VK3\bgH3@fgB5QU83;[ejmZ@3>LTS43;N[tn_Yfl\JHF@A??A?EFOO[U\YZP?43533339M5335GPE8334c?3CQN3^43HwM3?ei\B35]c\MPC34O\ll]E35TUUB3 6BGQQLQ_bZlg_53 6;FM]X`YK73:3333463o\C3Mi_j`<38MOV;3 9HSSJRRE<343FE439K[YC36JYcYI3;43333 4:>=;;>EC83[xD3OPD3Zb533:6333348863UZYO3HI@3JY?3FO3G[@3;faU3;PejZ=cA34;33EVVR33@HSSPOC6383<`438SiK435Id]Q3=53333^X7WP3QC3DbL3SE35WP34XlY3AUsj?3=3 37OKO?LUPQSI6373KO3CgY:38W^^:3A3333ZS37_NCBKIPSJPHJH>>9334QQB3;YL36^933H\@3Ql\63NYnjH3?33UVXSTUUJ;393X?39a_<3Ea`@3C3333Z^JTex[OWQUUMRLQQJPKOKAOKA37`X3GY36SO3<^k>38QUkj?3A33K[`^KUI5358@U36_`=3:``E3<33335BSvv\UZhnEFAB?>@?FILPJQQJ]\N<3WS3[I3NV83ZmL3GqSTjZ3B335N^]\S=3:4TA36`]935]`N34H3333:M[`XnpF;59bA3 7;ELL\\SQO>63\^3Ag53=VH3>`a43 Fr{q6K^_N9O3 ;>GFMJPILC@E39RX[`_E34>GO39eW43Qa_:3H83333 8RXbWO=Jb53SX3 8UWYQKQQD73RT63_N34SK3UlH37[jhw\43@fjJ35=KOTSUSXS[T\W^d[O=3:MVW`\WG3>@U53@jN3@\lN73I>3333 IXcVG433CiA3>d<3QLEJRRISH83W\93Mb83OW736d]43=\fjoZB38fj];3;GXY^__YXQPK@:79@Laa\YM8hlbWKN?3D`h^3:JX`d``]WYRYUZbZcYL@3C=BNbehZVODEPLM3?HP<35[Z35J\d[I<437BOJ63333CZeL63`X3Lh43ORO34FRQNSR=O[B337aX3>UH3\e73CgbkG3QR>3PjjB3;EQ[^bZVD>7535;CPXb[BL53>\ouiI3F[\X837FLN83GdE3d=3MRQ3 6DSSRM[WB37^a836NG36_Y3@ime?34RRC=AECD>>\`kNLW\]RG53 >UcZU;UWPak`>@X[_A3:EQQD43\b539@CCB?:43333 :;:943OcV73=\L34cM3GLL53 ;NLU`hN:_c;34RQ3DhH3Ckbe<3HZ[stxh_H93^pkS43 BhfOQE37JK935cV368733338MD43KjJ3D^L3@dE3BSSB3;]y|sR63MR73Yb3 5OO>3 6FMQJHz~RROI=3FX^psWU G<4>|pYL?P@3Pb:3:CB<97;63333>P;3BjM34^Y;3]X3=OMD34Kr|oUJU=3GP83]S39^dj^`J43PSF337NQKFHSUvdaEIQLL?3R838eV3@cV3Kh?36RSQ38[caSPLVA3MW934_L3[jneS63NSI3@QIP>CPSLDmmS4@HPKL<34KLXXE6_N3 8[huQX^a^UA539cU36K83333=T73W`733Q\H336^[3RSS63 :a]JIUHBVVUIB3JU83;eF3NavgD3DKKDMRN7GSMI43N_kS33>JQLH83GYYNL338bB3QXxu39FUf\P<3YU34M733338U;3AeD3 39`Z>33K^E3KQM<3<]]D3GNC3>UKVVD3QV:3>]>3;g{o<3 DT\TNI6AMSN53 QleJ335DKQM?3:Y<3E^633YmfrG36HXcS<3Xb63I=3333PF3\Y33@^]835a^83@QUI3 :VcD33NRB33;V;36QQC3@_;34`rx:3 ?\\VK4?URJ63NejK3:LJQI43DVYYK3< QM33cnZ[_;3B][P63MX;39N3333CT3Bk833NUX73>bY43 =UUQ337YcE3QR@3?VVJV<3;MH><3Bc83Fz;3 L\\Q38JUT:3RedO3FQIO:3=YQOV53> 8]76mbYV@Z83KY]<3N`A3K=33334Y>3^P33R^Q83N\S35UTO84X]J38LJ83>MWWU93?QL3C=3=[833CxB3 HJ^\P4OSL=3 IjgYEHJIO[WL<3RYC34 @KIFmSRO3CY93=U^C3HV@34U3333IR3;b:335L\W94X^O3ENUFMYU43=QQ5359MZXZM>86BJC33CG63;^=CVfhW3 CUUVQNCUUK34B_ss^:545?V[^A33AYW53 6VcM43CUUZ`[63$@JJ9CIRMRK\]Z\\KQZYRA?99IMGEFLudO>af93 :KRRATWWKQ63DUK:?``_:3 7PTVD4NLXYD333#MY`PWOTKKFHR]\^UQZZVJROMG;;?@>VH3@]V3 4QUQ;8V\[VA3=SO:36[b`F3 7IP[P[[QL433Ozg^[V3P]YL?@HEKXql]J@DSW_^Q<3CXOQ[SM3 :GOOSNTOF]7X[53B3FUFHaW>3HVE3HP3333MW3`433@Wmgg_]jVH\_SONTpcbPQU[ZMG:37WZ``F37FOS^znM3CN[ll^NUPZRR;356`aZ3 5G`[knh`^F3LYYe^[i[3F3OW<9X]D23CXM3?[3333TO3^33 =Q]VVQSWPM;[\S_roO34BVZPRRJQD93@[]XT636HUr]F63 6\u{]>39WYXVWI3EU@34BlzxrgI@><=AGKC JYYdPNLLI:3;3=OK34R`F3@XQ35g63333^I3Y633#4OW^G734GUOQSc]\\gokXR33GQQ:BJQSKSM:3Y^^YJ38i_MT@3U|vU3HWZHWWR53KI38X]dpkkqW]ZVWTI> 6MRZqa\H4?EB734B3MU>33O`B38PT63\F33334hH3R<33:Y\M63B8JPPjiepp[VLPH37AF3;GLSSNN=337U`[YY;3Tfi[VUB47V~gO7334QLU8GMUF3CP3 NQMWPLVWE:9533UsrcE34=@43A39MO438O`>3VW=3I]3433336aD3HF33A][>37?339I^gx~_df[WZMKA3 6BKUUKH5BQYTF3 ]SBh]LWU\sbWM3AXXS:>XXU4338X43 6[\\X@9VRJ633V]prO35@3@3KR=746TW73GNF37g>328533337dE3:O33G^T53D53<;TtaOfhoj`ZQQH3 6FSOUSNUTVNU[>3 WM33:KQ733>[K3CUQ3O\37633338jI3S633K_M3E35XZ]Q]][U=LTB437334;3RP93J\@3:PM938aF3=33335bK3AH33J^H35G3AQ`Z3 68Gdurxh_B53CS``P:Z[@3 SO5K[gZhjc`K3EYWT<=E4UYYH335T:3KXNT\=3DOMH33D]\33?QO@43:437>AMH36RT53NRE3Hd:35<3333jT3O933E`G3:C3R_f<3 =Y`istreffTD953 H_^WQM[ZMF3Sd_`\>39bnpgKCF^fcM53:7BYWN:33@N36\]]YE37WWV633J]V3BNMB83:A<46PN43FWA3ERK43U^53@3333]^37N43Y]^[[=6ONS73>3JSYP3KD3J]>3KWV?33O]P3;FNKD>:9:43GN>34UU437KQ>37\O3@43333Ua433LQJ3D]=3>73333Nm?3;J83P\53N533Nf]3%EXYYX:38CKKPKQQKa`fbu{ilj^Y\][YH=:X>3 JXYFOVY\ZYL376QYPI35LB3UYNX]?34WXX:33@^>3466565IL<3[T3463>83333=cQ3 :PWNMLJGB>93;b>3:K334RtE3GE8OYYMV;38?@LOK]Z_USeovd_SGB63YI3 4YTP8CYY^WWA35?OZ[>3EH53B^UG3KXXC33I^535;>HLISQRSJRQO]YI@<53KN934NPI3?e@39?CJJYNZR[RWML@93B53333f`36863:IVUNJRTUX\gf]QB3NOM33R^W35@HJUULUULSRQSKRPPZVSJQOGNWE3CMI<3U38?KKWWRXRaT\V^W`YbZcVRB73G3333OjA39BB@ACHJMMORNB538FWefAbeB3AL3>\g39IM437XYZ\VLPULVVPV``XQbdetxO@7333K__ZM9334@OWNVVNVUFC;3 JO@335=C\^RRE:3AQN>3 7bI?EQQLRMIA436;3:ERf]]?3E:3333^j<35=3NmmXaQ=38U>3HcS3CRQJJUUS_^a`_WLVT``ZXOXaddcmqM[ JM?BV43R[[I3NY^V[L3J[835Z__]LD3IOM@33Y_ ]3:JWMWWMVQB:3GQF3 CNMLURI834GMP73 5[iPMPOC<435=38J`fS:37K3333D_W3:34=BDC@:43:OM7L\cV:39UB3F^N39SXZSKUURZa_^^S>;73;XXP;<=@IQcpa[ L[[XaJ3X[[C3V[__[[@38[[ZB3K_Y43JYYL39_ UQNXXNWUE73GRI3 >QH4BLWOE3>QQF34=P^fRL<3B34NadE3L93333_h?343 ;KNHDBGLT[UE43V^333>VfL43BYYT3D^ `b]YNXXO>43BKE36JI3BRXL9KE56633=NMNYlI3D39VjO33GB3333Aa_36IE63@U^K636hD333@]^ZD3GWR3 8KRJSZZSB63 4QRR[[W933X3NabbaCSFM[Pkpb`\:337MOSIVO\O343B\B3<_ZN^_N3:VPK5^X[``ZYWH;3GSM3OP836G[T@:LQQJ6FQQH?WG3>:38=<:53IkV?M3333[aJ3;G53 =Zk\QW\XasG<339mm:3 NUZ35GJQRRKWTG35H[RA3VXX53@^ba_IR64?MYT[]rm_cWC3=\>P\@3534Z\\S35Z_MP63;[Eaacc]UK93EQK3EI<3?T^XQL6OD53ZL34H38A:3@jm933339cf=39A34DUX\qcEDGem_l_P@3RSJ[83 GJ[>KQQJN=3QSF3 4O[[UT\HJMO:34WW^a^CF3 4BZ\bvhc\]WD\9;[\\M53 433K[PL733P_<38[[]`cbccW93JRJ3DQD38Xm[Q:43XS3@A3?@3IwS335333L\^834B3AUK;336]Z73[G3;O ^ebDB\83IT43LQZ_IQN<3JME3NVP\[YYB3T^ccbJO35DZ_th]]N_`\\53IXN\J3373>V]]D3KT_H34[_`ccca^3KSK3>KC3Ddm\Q=3QO3H<34>E;3QGiG338333XeV73?537PK634[X6g;33@YgsW3OQ3JVTjRA43QUJ3A\^a\G3K^acaNL73K^dsi^P_aaW434U]9435]RH`^N^_T3;]``_bb_L3HLD3?QL3 53^^ac^O?3N\dffacK;3E]]^T3R]_`MT7334RTR3?ZJ]cbbR?3\^``][C3LX[S4Qkrke`__I6[dRS:3BRRb`:3A[Wacd```W35UUD3=NN:@LRKQK33?Jh^@93VS3C3PC338dB334;333:[cX=3:35L43Ty:334_G3V\PQRH34K=336?JUU35S\bT^O63OT]caRK3LXWU33CbjmolkibHU^^O3B`cca`D3C\^bb```E3=OK;3 8FZYSRORHA437enV35PI3?B3[=3H\33>333;Y\`B363H73;vU33>`;336ZaN3;OXgSSQ3EG@=3DNM634Lac\`^^Z@33U_^aa^[3O]]Z3N\^b_WV`^93?d\``M3 GQW\^acc``^53EUWA=CIGSRUZUSRC=3GjpS33;WJ38M3[:35^A33>3338Z`YO439B38acC333If434TeOOQN3F43\RY433T^3 4Tt_O:37SS>535:G[YA3=[ac^^WZ__T`_`ce_C3HRSR3U^^\Q_P_ caZ\43:XabbcdW3A]EWcQI:36BKJWWOV`\[VMUUIKBDMJ3?QWcge\;3@Q935]839\33>9333IV]^J93D3TE\C33TX36JjnK3RSB39MME34Y[^N_c_S]aOP3M^ 833S\]Z3@Y_cbB?aS^cdA3I^M]]L8baM35BOKXXSVWVW`^QC=:43HSL3KMJEjqYH63;PN534^;3A33E3333`B3?a_;3338C3335D[\R[P?5354566443;63;QC_=3Y[3 CSU>AaZ43GSR3RVV3>[@B[__Sdlca`J3H^<33V_5334M_PdbcbbUc`_I3338ENPQPKC63VL3QccJ833F5333 8IW[TXWGA636;BFCNQRGS KSSNMMJCB?;63;53S9ZJ3X[3 @WQB33QWH3@OM73ELN=3 W[[O36M\Mddkd aQ>93AQRR@33U_63A^abcddccb_TRUQ3<^TW^S45^abaca6336JZMYNH:3>VVJ3;SS=3@[]D3MV3DIa`GaR;3?B3337IMXXOWWMKBA=9;93APS63CWVK;3 D^63KZC443;M]K53;I3334AKSWRSUPRRNR\RPPKQ KQQHQQOPRRKSNSSMULULVSPTKC633<34QEW :3Sc33MXM53HXM3SUJ38WWR36Y\\L3S^b\adaQa dccZ?4FUY]CMab \ddbdcd\8^_43L_ ^<39abdeec4333@V[O[[ZB39WWS3PTG34MQKRQ936fDLW;38QV83=M6333'6ADQUKRRL^QJPPLPQQJQQHMHDA@=<@??AEFDPSUKULVNVHOC?3BOZA3Tm7=PX:37\Y7EKP73JMQ=3R\\Z53`abcdbUa dcedba]`_`]bdcbaa[Z_:3 EXP__B36PbbeV335KP[PK73FWWG38UUE3EME8PMQ:3Ee`733EW<34FL533369?DPGHCFEBA@>985347?DHHVLVSRWI?3MbJ3EgET[E3HZL?UUB3GXXJ3A\ZPE3_`^\ccY`aa`c\ccbb`__ccb cbdcaaY`\PO73:^_^RH33T_QacdcF33>X\QZ[U<36UMN93CLL:3 7NQ;37OUQ;38o}h<33>U:6ESD333@:36dXRW539\T7TUI3;XXU34LU][533]`_KY`aZa bcddbbV_adbdcaZWddca<3V_\63Dc`cdS733AU\OD3FXXO3QUR3IME38ONVB3 @}kgKaQIB=7668?34>JUMXJYYM;3QK;FewY3683@[O=VVJ3DYYU3 6\]]R73TWUTR@_O3 Babccb7`cddbdb\JbbdY[<3:``P[N33Tcdec_J33T]PK53FVML3MSK834OLC3BXXO@35Ux5346643N=333I43AUXXVRYD<3W R33bc>=<73QX>SOL836XYY=3LRP\N8a`[6_YRR8339\TQSC3[dbcY\HRbc[bccK43V` W533IbcbdcX_=336UL]J34WYYD38VVP3BQP63=MZ[L;3@]kI338N333M3?ONYMXYO;34QI34Xv^3JXG@VVG3HMQV434Z^?a]3F[__G3U`>3Tcddb cdbaQ3IddcdcZF`F3;Zcda]M338X^[R\C3AVYW43IMUA3Wc\@6N337I3337J34=@=85563>PPYXKXC39OE3GXRaV34UW@HLPH3LYYP736\^QYbaY36_733H`T3UG3Tb`\TS:3_bddbWYSON63V_`ccL_bdcSUPXY35U__S[@3=PYYF3DUKM3DSS@34BL`Yc\cYWYT\]aj_UC3@A33C83337P3A?3CVXS[PB;MD3UX3PeH3AUS3KWUF3G[=3 4Y_bd^TQE33:V` 834L[aaI3TabdcbN9b >3`][X?PYJacddcbda`[?3L_D35W[NM536UWW=3FSJF3 4=HMVYYbX]QKB53B=33;>333T3@>34D[ZJ[VTF3bZ3DeQ37OL8:KRX>35W[ZN83@_cddbbO3[`I33Oa X3HZRQ\PVWJ=33bD6b@39YSdcdc``63NVU__L3J[?3IPWM3EQSM43A<337A333S83:F3?V[[MZ[\_N6\O35ad53QR@3HXXS43CQP[R3S^cddbK3I`Y53@a78^bB3]bJ8b=3Pbccdbcbddc`Q3H__ZTO3BOX[N3AXVK93IUNK63=<337?333GI3K634GUU[[]b_GdP33[a=3KRD35VVNL3J[F34bdG37`XQ[O34`a^TI3]bP3Wbb]I;b:9bbdcdcc`>3?__U38Y[RN735UXXF37NPUP639@339>3337X43;F3RQ\\>3>Wa\_aK39aN3=bFBbbWS?[cSUcYLcb4OP`cdcd?3V`\Q^<34TQW[M3EYYU:36MUOUK43D433@333<\43O43GVZ_^}o\A@\U3>JH36VOST43B\Y837I[`C3OaY>3[bY5NVccTUc]Qc]Qc]DccYWcd]348L`D3O\\RL53=QYYJ35GLVVNC38>334@333QP34P3=_a^vpRSVd`3?PP53;XYYK3M\[NZ93;FNQ`a``[=339aXQ`^5IbbaVDUcbKcMcaVcXWcNc bddcddA3N`\`W43F\X838WVLS435BSVSQQ:3@533=43337^D39M3H]^wuO]`lY333A\bM7WNYc`Fc KccbYK[WSOXcUcS4Zcd K3>cdc^a]833K]NZ[<34RYYX737EUWOVV@434A43396333?cB339Z]PZY83Rb abdcaaZ>3AbYX=ac_TTQ\fef_fcfb`SU[3 bacdb^VbC3T_O`c[McXTefbfbfdfV@3 QccQYZ3?bcdPbb\@36U^[O]J39NY[\UEQYQYYOXXM73333:YiJ435W3 >QQYf]_prb^W73>QQ:3BK[A3?]^^\UC3Ibad]SbE7LcQaURefdfdfefdfdfcfV:3Bc X8>abcaddPabbN34>BNYabb`WSRJJLOK^a[ba[RYYMYYVC933334Jk]F43U:3 4HLUbD[mn_^^W73?QQ:3C[NH3 @^[R__H33TbVbD>cKafcf aXVNMMWV_eefcfdK^cH@_bZYUb%bTXD=MT[T^bdacdd]\]]R\\]^bba^[[MYYPK@433339\cbO93NE3 3HRRkHRss_^J53?KJ73D[L\\I3@K_M;RbKWb PcTJcc`SfafeXH935ESdfedY[ccVJcRabbZ65Xb Ybdd`a__[ad`daY\]]P\_cZbb_T[XGG<3333=QidYK;3 4>AUbIHEF=;533433 LSTc\\h^^QX__O3IQQ36D\\O\X:3<^ccb_acba534H`cUXfeR734Kcef_Mc I83:L[Rbcccd`d`\aY:643@[Q[\\G3333413;IP_[e\d]__WQIHZcFIKNVPWOUUKI<433 >SLYp^UNRZ_K33IIH3473CMZ]][A334Hbaadd`_]dcbH39Qc^Yecf`D3:[feb`XcX6:YbOaabcd_d]R638J]L[B3333635686437a?3 7?CNQRRJPG833ESTvlI3W_E6RRJ393 33CManh73<^__U53DORQIA73?3;L]cdcdPbXB?[``Sc]F63OcW^cfX43>Yef^E3Lfe^LcWbbUD;G^aQ``a__`M_cbdZL837;AFCNQSJUUJTRKJHC;833332393;]R35@HPQJI8334X_Z`U43@_Q438]bb_]F36;D74?X` abdcddc^V?34JW[a]`L64ZcaWffdf^638Sff`G, %@[ff[=3TfeefaYcH7BXbWaa`Q^F37IM_addbcddcR^^\UB?;63 5>APVWNVVMVMUUKUUNSMSQB?6333323673@`P34AOJQQ?433 P_fhg^U43=33?]b_ T33:<:HXc]T`QbdcT_L637TaPbaJBJbcPfd<3Ddf`0!XffO34afTccRCH[bSaaE73 :Qa]ddbda`_Q^[Z]MRPMEA@?>9::;483H__^aP` YZ^a`XZ__]H?3@ZX\b^]c^MP]fJ3Dee@ 1afP3>fcNIZccUbaPaS:3BL_P`aa__\U^S]O\R[X[ VYYXVYYSWXXOWMVSKEC@9886799:?AFNLRRKQQLF:33332543?3E`];3338E[`_U_SN84>II\^N]N\P[W[RYQYPXXVMGA93 ;DFQQIQQC<333323B3A\iL536JONRJ539IAJ[eVN@OWlb_ckfH3\_^NP@3?X__O` TUC433BY_VcVfeE3>ee.afJ38deffa]c`X_L736GY]]`O__S;3449IM`aQ`^J>349>=EGJDPPQNNRQPFNJF<=73:CPQIPB3333532434C34543B_hfL93;NLSQ<3:JR\\Q[P59:834CVibjbaTRJJEECILegqr_`XZM;33CP^aWcba`_G35DVaNbTc`fa3CfM4fP3XfWc^]bU_SA3=PMPE33335835:634:?OE34;942=EG@;78:?G<37BTWh^g]g]e\d^cqmq_O<33EWZa`dca^_]839BXbbZ]cVfR3Qf,f^3EfQcPbbWE538HRQE53333=3 8<>@BC>788D536>43;LC73D<434;DFNLTNQKIFQNPT:33 DWdbccbca^_E38GE]cPfI3_f\f93]ccbcc^H3 8?>INSVT`bbQcQf=3?fI/fL3bfVacPaZTM?>63=TWI43333B3LP43NF38?35338PM\[Y@43JV?9ccaSD65?U[[O[[ZW[QB?53;HVR_O_Q`Z`aSbXcTf=3?fJ0fL3bfYcTbXaR`Q_TG=3GTY7337:>A;333E34EK=3\R3I3;N>3LVVQTR=3 HVVM3E`bb__E3?IX[[P\ O^`\aa`Q^__R_U``ZRQPKFAEB?:CEHKNbfB39f[BfF3 4effdRTMDD?FLSO[aX`P_R__[J=3RZI33:E5333G3;NB3@TO834I3BL63DTMV;39BE?4Q939X86S3A?3>Q433CT7AV R4336?GEW^_O_W_`RaQbQc_S^dff:35`f! ae=3 `ff`\S`ccTbPa_G=35@Q^R]SYZG53C=3?XT433?A333G;35OB3OI33ID3=J3JG335VH3Y^ XVQK337LZN[PQ=3 8:@DHEORTVJV ISPNK?AAO`NfL3EfXBfR3@f S`TDII]bbaYaT_`WB37@S]]P\KD3E=3R`E33O333:I3EO3]A33BK34O:37X5334VF?^ SQQ8CU[[TXZJ636TcVdf_3Zf6ec73SfPcW<336V<38\;338G63G3HL33NVG3338O8343HO3;[733M[V3@P53V?339VK4Ya_]^P6Y]_YWTJ63]^_aaIV\\^ZJ537?S_aaWb[]c]KN]fK3CeeB 3bfO3>fdKNYccWbMT93=I[_Q__L534GO[K436O35bT336Q333CP83733=U63 =b;5ODG<3?X33OR<3693 R`baX`^^]^YK3:@R\`[_aPbGDLacSfd<3Ccfa2#ZfeM35afQccS@J`bS`a`I435I^S_IA34J[PXYS83O73Td6336T333BT?3573GP39\EPJ43AWE33EV?3ET3699=OYYWL>3GB3I\?339S333O[OYYB3?L3>eL33@O3336KWF63=`G6434=HQhT37Mpf73KX43;L7?FECCEGKLE<3CE43:CO]V@UP3 RhTMRMOGD>;843CWX[SNUSRUWaX[abW?3 =W[\L[[WV[[N\P]V^^[Y_S_YQA?638K^aRbO`INc`Rfef[83 4RffdffZ[cWGbQb\:33>K`M]C3 333AOZX@R\R4563567635\d^:OR\bYPB338]D3CNcuRG@736LVVS65>CSV_bdb_^A34SNG4;BCINQHUWXMZ QYWTKNJF7438GZaVabb_D5Oc_Xdcf`E3;\feb`YcY;NbNaH33C^`V\__O@S]__L^`cdac``^T]P\YX[YbQYLYYVDB73KH3T\339\43338HD\?5634;FFdI`RL>53D^83=TSWPj634NUJR;3Q^cdccYKOA433NSS434DW``RaQ\G43CacSXfefS834Ldef_Mc I9FabS`aaQ 4338RW`bcdW_P_cbacc`U]OUWXUSW[[S`a_^[YYNYLXXR@;33 QbNbccVQ^VffefcV935N`fcff\XZNcO`]83=KHMSNMNF@83FUH3@^93 >IR[[YUPI@638TVP73aL3CMRUI3IUbY9@TWSUX`ZG?636SqfbA34dG3^ffNA3639LB3[cddccbbac_ddcaE35S^^QZM3CZ[[O3 ;><=?VVQ56@L@35CRMUKP<3KZ36hH33?gG333:RA3OM338MacdcbbZTcd^ba\a`__Q@34QSZ]]M3L[[R@393GNPK3BN639JUMUB73D]3Cm933;cU3338P:3>V83HkxlROMHbgEDHMU__OB43F\43<633563>@3F]B35gT37QSSH733P_a_PO:39U3G`TVaX9Y`Tbb]:EbUZc[HcQc_J[WSOYcWcUAbcbddcYZaccdcdcda]J8?__QZ^=3F]XE34SNWX93=3NUU>39R839CTUNQR>3Ab3N]339a^53335N835TB37Y`e?9@LwfKJFA:34]M3>;93D636ZQ3Kh=3;PISO733I[aa_[D37MLJ3;_``]QA]aa]R]:gA3<35C3L_63 7]Z33:QRRE6338O_`_[P39V63W`_ATaU86]bL8VTccORc]Qc]Qc]AccXbc bcdbacdbddba`>3;]_I63ET\F3BYYKC3AUUC3CN39OSKSN:3Cm533793@37bF3IdIAQJRJ5337UZ\`^U538V73M Y``Q`\Waa[:3KRbW3NbbSN:YcVUcYMca3NNadebc bdca^dcRY`\N[83@_]N]Q3B\\ZLC3IQYX73PUJ53S>34@SKD63Dd3P]33Gh[;333J53Q>3Cef=36\f@3Qg?3;63;733O^3XoWQOA37TY\^WQ937VVT83<__ZS]` U\W63FaaO_^78abW4OPRTGNUW\RATRPO6Fbdc ba`Oa``VUW__S3ES^E3EYO[[>34TYYL3=MSC3PJRRN@43Ic35dD33;UiS73337B3?L3H]c<3:ebA34ThD3;737:34bF3;UnnTA3 PYY`_^E<;73;RQQ73U__`_T`F43AaP<3Ob?6b?Vbb]JLK<3GO3 6DLQQKPG9[S37^C3@U^fO:333D37M3SeY333;b;bD;bcZ=3YcdcR33:YL_dXV_L37N[]]H3IR[[P39X83PSH38]3 6DHQQKSsW<53SR3=NXd[U9333D3@D3 8_YK33;[jT73?f`L6E434B;3933`C36FVK838APPIQJ835Xa83CjzurdYX;3337VgcC36X_eNF3 5@43273:i53 4J`SQQJPI:3 H]<539Wmqj^Y\ZH3BXW<3DW39`d\Y]C3K`V3Pa<33B^`aZ9YSPO8Gcdc:3WdcW3G_]Scd`N3H]XNQ34TUNY<34VWW636QR=3SH39<@?<536YmMPJQQLRMPMGHLjKGHNQ]Z_^\QA4333@3K53NXa<3 O^iU>3346753>VfmZD733>433423G^3 7BKMXkeQB:3 A_cULul[MYYTQD3FZDFWWV3 8N__cdd^F73O_Q``X633BSPaaO3Ba\Baaba_acdcQ34`dcddcZ533ZW3:>IOKRLUUQ]oaQ[V\\XTF?3333>3L34YcX=3>^ambSEINJB63 @SsaaZPD943OQ48VcdcaM636O_a_ddbM638[\\Y63=YYTB3;NMP3ALK3IV3<36HP;3=gJ3 7;3LT363 9KnlL?CHHJMME:3333A83>;37WZ\P634>NZXbW`[osW\WZ[Rcg_gbL[>3 B\NZ\ldXPTW_sM3@J@3 599<=?:;9734RWh_WH35BIPS[[R\NXGC]D33RN34=53cv93333:7:37@37Q^UYB323:?HIRifWS[[QXXPWZb~kH838CTs~g_ZVHWOW[>3 HQ>:BIOIVVMVIW7AWZkWV539>??FHGTXWZ[[O[[ZSZN?33M] 933E^^S\_J3?_^63;Zddbd`@5C`U3S__ccbc:336\]]X@P\\TW[TRV[K35VXX?3DTM;3EQC3[H3933DddO3333643473D363EW\ZP<3#4PO34638YV=5> N[WRPUUKVVQVLW5IWiWW=3HXXNYYPYW\Zb]M[WL;43P]]V33E]^LC3G^__N3C_`abaabI33ARPQH3 6Z_Vdebc^E33M\PN=3>UR[U^[Y43FVMI36SUH3DQD337i?37`W:[A333345363<:3 233;UQ[[I:38UG38@P\dRU[c__hdci]XVHFHRivXKVVG63?d_YS[aWUMUULVVUTVVNW3IWa[W<3GXXNYYQac_NPJC<3 >YQQD:U]P^^Z=3:_TQZ:34PJ``cdc^S:33J_H3;L^debP][337T\\N3=V[RXc_U<35NWW<3RUN3>LC33H^43Q^I3CZ4333353243A43 23324CYUWVH93@X;37cPRJQQE<3>PUUK[vfTC7339EGSVgiY[VPFGA:;736647=?@3?W`ra53@LLDLSQE=8323G\B]YSR63K_J37V_]O`cdcda_^433T_@3C_abdbG33P\\[635KT[_`[R3CWWJ3HMI43@PF33WP3HbS433ZE3333236>327FVXNWK<43PQ3 M=3;W]_a`83 6RLM533BUU73KUWTRSD=43;\?39O33?GQUXWYUUQPU@Ha@CKQQJRQFD::P_\;3 6OWWZjN433663KUa`\SYV;3QF3Q_3?U`?3:i733335:53164=MISUMRRFE>7533ST3J?@EJS]Z]Z^VTLVM<38fcQIQQD@538]dV83;AYD3Cab`]\[A43 Q^VR@3E_\O_ V76YcdcO833?_J34Udeed]O433C[83U__VU83 ]\QE435>IL;3;I]bb`\P834]^^Y3H_[T_Q433[d\3K_F36[ec`baJ337[C3?^_aYU83MO536SS@3ARCPY63?[SK3UQ333353 4;GPJQQIPPIQp\QMQQJRRV`SSJSRST>CQ>Rf?3:XSTOPA53EDOPHQkfQKQQHRQaME<63NQKOh;3 3PM7DRKOA73>]gZ9353 4@NUX[[X_VJ3ENU^Q]L_\<3 R_^cN335TPSW3BdcU33B[[Y3LNTVRXS63=VVB33OSD3IVaX439L[[B3Gh3333<4378=QkIGHDGG?B?<5@?34QNJb?3 3PZ53:FQIPE>43@ccW83:3QWPO73>c:33338;3^X37@3AQ=JiF33;\G37ANIQMQQGG@?NieV3:>@LQQ]XWTYYKN?434KOS<3393B]a`\^R43 Q^`d^]D3U^^Z3D_Zbca^S:3JYYI3 5PMJ4PSQUA336\X3?437?>633PlF33EW?3>Nbcfnjqpimuyv}~oeXQVVQWZJE<433<`caQ[S=3DYYP3 IWW?33AUVV:3;=63IQB3?Z]X;35?EPKRRD93E`83333E53OeB3;53=@@733PcA335]R3ARd\[G332723;`cc`]H3;]UA]_]]X3I`_Z][OL933:RQN3@NL?3JVQJ5;PUHMQA3CTSUX434:>FHPPJQPC83Kh43333<=36`b43;53IQQ>33[m?33=5;73?TaaR=33?<33CYVbP8D3@=DD?BUV\McXLHQQKQNNPFD63Y^3333H43I`O3:3IQQ=33\c9336XbbIRbP<3 :=33F>QVYY3>;3=XOF63 AYYPD533583P^ca]S43 6Z\VJ33BR`c\N839I[__^ZJYOYOZYX3 8VVK489>BXVYWU^RLUUISRT`e\T_bVQIQQHPJ>93\Q3333:C34bf?363EJI935mj33Jba>@3 @33CC3OMKL@3C34][53@X`^43=3C\_bb_3J\C33;\cc`T3E_ _LBUPXYX[ZT63 6de83GPP=3@dZ334Ob<3;537N37U9Q7>53G>HS534DaVH3>38LS`bbS34OY\V3UacaB3O_ YS<3=TYT`aaMKA6=@NRJ__ZSSRQUUH[_ZUY^NBMOTUYNHB=V`A53I`=3333L43Na^43JPP:3SlP36K^AabbY3;33L;3>UUS3;R9:3>M<33IN34AJKFXXQ36;3P[VW`UG3H[TL?3W^Z_G34W_R,W_[833=Daa_TZ[\\VTSO^_\POKHJH8T]\VUUYXGANJQI@39XP3T`433335K3\lT43GKM73]eB3B`Y_?>OK@73;35S33?MKE33AIQ8AIOF53MB3AOC53`[U735XY83 73K@34TUU;3DJ93>?BJE3=WWK35A3POO[ZVWZ=3C[UOI39XNUXPQX73F_#R[PHQ_^\E?536;ELI^_YUUNSLSSKUX^XUYD438^R34]a43333;J39fi]937KMH?R]\]R634UY93F_I33339N39[la?3=RQ@Se\3L\^8333RaB343W83ESSC34R343:M[D3AML=3D733S[N9Y43IR[Z;3 WZYYT43=YYS38VMYV738SYYM3JYYO;3?VW L=35TI]`bbK3Stc;3:^e]C35dggd53L`N3333@M3 CYiiV?3?UU]gT36eY533 N_S33DWPSS93\3K:3;LG@VVJ3 9>5WkZYD33:YYU36TYYL;34RVMU534PLYV73JXOM53U]abcPB36TYMK43L^b\I3A]^B3?ZS733337S93 7V\gg@QilO>83Y^:33R]W56gOKL3Z83@B39MfePBB@?93:K[jW5336MNL3ITYY?3JY938XYYO34OQXE335Q``X[\N5337UFISN3HXJUZQ34QI38R^C3333LI3>^]Bz{xgR3DcE33L`^:gfR>3QE34I3ION743JYX^S36XXU3LXRQC33QUO34WYYWP=3WXX43DXC38VXOJ3CRXXC3OZS<33>SZ]\OXWC38RN93;TY83R[V53Pf43NSX63333KQ43nzuhgg93Ek8336`un537c53F3MQI3?YJ:Q533LNO6IWKXG3KXXU73MXXM;3FUZ933EQLBZ\UUbmO7ARQ43 ;YX;33E[]=3F_<34I[Y833335VI3;i|ugg^3<3`R336QWlqSC73YH3E3;UT>3L NW;3JE33NWWKW@3JVMW:34OJWU<3=^[;33OUP38RL[o][LMJB3=\S>3@][C3=iF34OWO>3333=ZA3 JQmkg_;=fV6UU;36X K339T53GX_YNWE3GWWV;3QWWN83IE334LNF3H`j[PZ`\B3C^T;38\[E35cI38PRW=3333GY=3 :^yZ8;33Ab[aXY33%8QQF43PbC;CHIIHoP8338=7>FLMFBBEFB?GUV:3BX@3P@3G[][P=3HRQWC36QNTU=34J[[J433>SS:3JZXP]^_TA334M\T83Y\P3bL3?QWQ;3333NZ<3Jm}g636Ues_33EQQ=3OaH3Ee6338;3783CSR993DTXW53DPJW__\:3GVVPA3 5LVVQE:<:<;4K`K33GSQ3K3>Z``^NYTI\YO43UZS3dS37@GGDD=536GUOP833335RY@3=cwiI3HiL433=QIE3J_S43\R335=3CSS3535WSOG3BqQV_[V534HPTVB3 9FQerlvfb[``=]`]334PKA3 8F33=Y_QX\jxdI3SZO43\O33=MH=438??:53@QLUK433336RZK53Pu~_3=oYbW5334MQO63B]\<3;hB33>3?LL333:GUcaTT[`UPQRJW[VK?3AMadae]kpvko_``<]`]33ASS:3E633IQKIdsv]YYTB3NZS83^N8MJ7369983;LKRP>33334OXZ>3FesiA3BYBbZR433FJL?3 ;WaL633Ig<3=3BSR3DW69GUTVukNOfcTBDSjmuv\A434?Pabg`_PJA<@PNUUC94M`M35333HKJ3 9A339JO8Nhj[LYOUI=3O]T?3hUT=3HM\_j`hRG73 4LUOSQ;4M^^M63533>RR;34D3KPBP^F3?QYOXKF=4IVK@34ma836CHPPHN=33334=HVZZ\b\]^QM<36N[bSA436Zard@3AR33D]YN336KKN53 JUUK@334I^=3633FQM3 6C433>JLM_B3?ONWXXQWLZaVJ3A{B3 5:CMMQOMN>433336HVWOIB>;?AGRXbe[O9;Nc\^J<3O_qq[3>T3I``B33KQO93=SV^RbhF737RR:6?FK^]_bcU93 LI3?[^VUQ93 7=DFLIKC=<3 DKSSI73X`S356338TS;34<>4337PQJaD3(5GSXJXZZK`b\]ROCDCjp:88:9:=?AFFMQJQQIQL;433334GXM?436GWf`U8;Lb]eZTH@963NbXMVE38W3QU]?33DJOB39IVWkugIB;:654459;QTRQMQM^^gX83>ZGM^^WE43 49358>=CC@C>=83:OSLRE?X\B339433ETQ@;;535NJJbI3%6BR^jx}|kfXVMUd|qUMSSNSSORRMQQKPO@:3333=TL83OGPPIQLRRMUOWWQRE@6334?PRJO\bX33>333QROOQG9334B637N73 4>Q_aT=3YfOOTR\U\KRMUOaedT[ph\WYH?3GS639M^_XH5IZL=4369973333L63JcmG3<_e[B33Zl `>llboq^L83:N3GS:9=53@SYRCVYYW=3DB364348433?PRKRQ@53@C:3<=@?53333>B3LjaE35Og]\:37Zll^:6ET\tbmlb\@33FB35P[ [YA3MQYkX>3;MK4FMOQ93E?3DSG4ISSMD63 4?EHKJRWEJTVH73AYdTfb3>TVI338K\TF3?U3IX3GnqA37<<>;63=97;:9643333I53Llg5536Id^dG36C977>BDASDCWblla_A3L:3L[[[ Z9434NdiZ?34OO>@TUU3J83ESH7RM;3P<337HZP836Oer^8FNJ?DNV^K93JH3IV533XtYL3D:33334F3 QB\khG3?QfeeQ73 EkoI?:558J<3BUij__?K93Y[[[D39QmceOA8345CNM:U43N34S7:33=p@MS?3>3333;?3Xlk;Tj\P63Srj34I3:Ofj^SK3X[[[D3;N`jdj\YLI@=87553 7?DCCK]bJa_\639G39S<3Q=36KacRD83\|ygqaWM635><53G_CMQWBC93D;356S83CK3 ?Sbea^ba^nP=433@=3U3K^kTE36MSE3:3 Xgo[[W7N[[X?53;BMO[VbZd]cc]bW`SK?438;3 @bEQSS54;@536I335FR7HSL38X3 8?CGGESilsT3J3U3 U^^_tQ@33CXV7373@VfXI>438BMQA435433333C43AOWX`W^^QL<3734]UQSS83 =533E83AISSH5JSL63V:34FpiZhJ3B:3P534L^^hhQbN@3IUR4353;WaY=37GN93473333B3:D@:327Fmj3B3@WThlI33>[[M3 5>HYY[\PR@753SQQJN63:3??6KRKQSF338>:4EB3RB3Ci_Y>T^lHR`V`THXXF3Gh]D37JG73:33336=3PlU32Jjc3@3 8M[^VQPc\D333MTS@3:LYS[XMA3CQ`VS<3 2B?=JPRRD936PSR63NH3G|h44Zc43N3@A363ET^K36N3C7457>`b=335V\W43GWQXXK@35@?WaSB34A>CQQIN;3JSSB3LN3IrW33=cK3O36L393F`^C3 K3>?3335TaW]B3>3@Za;3@ZSD34CVWQWP73:;3QbSB35=@8KKOQD438LJQ83MR3VS333S_433N43K53:3MbU?34G35F3=RmtcA3YiL33335;3GcV3XbC254686334:33;Z[bK635833B^W53L^[535BVWNTG53>439aiT:948JQOE=3CRRK3N3^xB3339hD33R43@=3:533P[Z93G33E43FiykF3SeQ33332673_mB3cjB3 4:8<33?ZcZA3:3HbK39]XD3 7JPUUH;33<3 Sde63:OJOJ534NQJ=3QK3i};333WZ33U37B3>3H\[63F339@3:`{lQ43Gc]43333453;c_3Za=37C9@c^V7353Oa@3H_^43@SPPRD:53 AVhR;KQQA3239JQO63YH35{u33Bf45U35D3@?c[73E3C535[|h\>39ff63333UlL3dj=3;3C``T436WV4337`^@35GRRMF43?Q\hbNM@3EQQD34fC3@sc33 5`?>O34;??=?B3GcX:3B4334C3634Yrl^U:3^eA33338d^53Yb<358=_dO53D]@3L]W3BQNQK6335QN\ne<34IIQ@3A`73S\33XHIKA@;89=JNEGB834c_?38;34A43 8335]b^[eRB34@?TV3333NjL3`g<57799;B;c`O3633WX3>bb63235T]d`QG;54]jjU3333@B?3RaI3:83 8445433Ij@34QV]P>3WY73BMKM836bS3BgEOR33Ro43 =9339F:39`a837:383Y_434[jjS3333;eY53BeP3UhH233;X<334dd73@Q]PF37bO3>PPI93Nd=35\Y4OY336kZ34@3DETiI363=dH3>BT:33336]\=3:bV3FjU4533TE3WZ<3:QKP:3De=3 23323?JOP>3;jW3Pa<3Fd4333XhE3A3;mkE3S^53EjQ33334UaD3\d63Xc<1633MO3TeE3GQ=STH33VV323;OQLF534c`93 EcE33<];334X[V>36?3CdTBI:36hG3Yh833334PdE3 M]A33@jU33533=Y633K\G3>G4BMOJ:9VYU;3?_>3234537DRRJ=3XbG3@aJ34_E38Z\9Y539;3Sk936AGD;3Ma3EeO33334PdE3 =dS33Sb=31334RB33HgO39PQK53GQ\[V33WR323 6334DNSUG73LgW3A_M3YTDcZ93A]3MbJ3333=UZN636XZNd:33GM3<`P3ARRO53=]ZaMNX323253373 6BWiq]R[SUG?63SKQ:3;bd^Oc3237523!;`ja86BPS\T^V]QQN^eYKOYZgb^V>33:c>>L36P?KZ383Y@36_b833334<>734;BLHB<74335;BKVWK83[~U3 8AJQTNS_OoaKE:3234QUU<3C_`bp:325734O^hSDD7334=DQQ``tsq^d__cSN>3R^N439S?3KU363TC3:``833335;43 9AHNRUVZTOG>43@~c3>LSLB93IUjQ39BG:323CLUI3DffzL3!235325236K`ceC337EIEA@@FMTPH?B@@:63AA?:434DG?c@37GYM63GY3QE38Wb?333373?c^W93@XO833NvW637A353EWW?3M}r_536HYb[eO>3:BG:33G_:35BLW\N;3?a3PA35OcK4333323?e=XT539=SeQ>;73VaAL>36?3573:WPL3fuj]434E^cZ`I;34:<=>@A<43 3G@ZQ@Wf^OB53a93R<3B`X;333323Bh99XR43 ;HMTZhp\NNPTNF=43 db36EK?5337:35;63KXX:3Qahp]:3>\bY]F433[jjMO;3RH3X436O`M93333<_:3=VN3 ;KRXWKHY[<35 ?;37NSN3TB[gg^G34>@56T`X`I33Tji>3@W39Q333338Y;33>;G[X>QXYK@46UX;338EK:Md@3679:3F[[93Z7=\fgA8Y``\;W`P8337O?3W=3HC3:GVR>3333BD437:[ VDG5334WY<33:Jjd383N[S35Z33QWT5P`X3EC34FS:3333ef:57P[[E3FZK33UcJ:353G\[53N>3P]PV`]33QK39V739M3;R<3333 6]ffbKaP>C93:^W33=jN5G6353NSM36S3:Z`J_`E33TD3@R43435L839OB3333 DcDUW=CVkiuA34Z\933_]539C32332236^^B3L?3U`O:LN?33V@3@Q73835J:3FL93333J`Z93 EXtbE4CBLJ33O`@3@632423=V]73?I3BY\4LM:33V?3;P@3:39H838GH;3333H\T37WVH7YbbR33F_K37>32103N`Q3=L35abA_`A33S?34DLD:364:38CB43 6AFECAA?>=;633335>CIQPSYTXRLIL^S3YR3>b733E]P3@31323V`K3BI3PXKUX?33PA39?FEB53 6<>;<>?B>5348433335?JURMJIDCEDGPRatuSK?3N[7:b`933I]N3;53144323XY@37H<3Dc]_b@33LD35A>3563233335BNMC;3 4XdKZX^TJ73 RMFAH`_DZW83:T\E387332513323236bb936E438\X^aC33JB38>383333=MH<3G^933;LX_UL633MI5hf834NZ_?39O]P93 583693322139WY43D3Yd[_E33L@37;373333BL<38]E36G]_UC3KJ4MLIMC:?W^F6=GU]O<34799321343?c^3;83O\_cM33N;3<323333EG53MS37Ma\[W3?3Ge^ZO33S43473333DE38W>3B@YltaT3PWE337>353BdX3=3A_[d]338O3333?E3GR38ahva`3PW>33B4353AaV383>g[X\534:>?@?<433E?33338H43TC34^dwdZ;634TT7339?363@bW37:<@E=<83;bUZeD34873:DD636O3333G73:[43B^th?[]?36XM33A5373=e\3:37g^F\N3437H@3I;3333>@3GL3 JV;JK6S[_Q63?Y>3337A3836_^35838aW;gc43?LE;@??33337D3KC3 8[`;8O73>[X[=3MP333><393df43943:iY3S^B33EcK3HbC33IhQ3L33334;63O833Yj=3G63333493K;3M^?3@I435PYE3MB36L34B43`c323X_43CbV3A6333383E?34XS3E34RT=33EF35M3A83Wc9353j^3YjC369;;8J>333343>E3>ZH3FB35WQ53@J34O634A<3GjK35>fK39]f93:BFDAADCTKJF@733332435L3N[63DE4336`Y36Kh?3Fd[439C=43F7336H:3HV7>I3I?35@H93Xl<39`d3OlR3<3K3=B43333239G39[G3 6BD:337UE>923?<3:CJA53;dX3@dN3QmP3;63J35A4333323D<3@U;3 5;AGMUYVQ^eZW?853 4JQBl83H@3;dY53 Kg<3>D8<>>;43A^`S<34:4437@373333 8?[D77433:?3:h:3DF3>gV53=fG33=H883?U_M34323B43533336S=36?3;f=3:L3>fT536`R3A3AYZ831436=33337X=3>39b@34L53;bW:34XW633A735O\;3233;833335U=38636bB3I937[\G3RY934C:3HY;33;83333Q<3;23_C3E<3J\W>34QY:38G83FV63383333P?383[C3A>37L[UC439TW87EF53L33653333NE33443XF3?>37GV^QHB=9H^XEMI935U;33333CK33434TH3?=3 7BGKXgiTE=53CK33333:O43;HJ53@:39DSRA35T433333M<3353203E>?A3C737@HNSOF;3L<33M3fM3fM3Mf@3Yf3Yf@3@ff3f33@ff333 CF33414332236K44H63D39HHA:53DC333f33@̙f333@Y3Y3 MM3̙3f33MM3337O73363D=45;A536@3AE53>F3MY33f33@s3@3sf33Ms33@3YM33333̙3@3Mf3̙3@f33@3Mf333ED52423:G6545BPGEDCAF>4354323D<3f̲f33Y̥@33MM̜T3@M3 f3f@3f3sM3fM̲@3M噙f3 f3Y̲s3Y3̙33̙333f3f33̙33@3̙s33M3MM3f33 @33s̍33@M3 f3MM̲@3M̿Y333K8334325H633ELH69;8=<6332587532313?;3f3Yf@3f̀sٰ333̲3333ff3fـfٿ3M噙f3 M3Yf3M333f33Y3̍33̲ff3ٍ3fY3fYf33sf3ٍ3 sٿ333̲3fـfٿ33YfY333931223?3f3f33f3 9f3@33333f33f3f3f333f3f33s3f33f3̙3@3f3̙3̙3f3f33f@3f3f3 ̙3@333f3f33̵333EA13:A738D3;938><329323?3f3f33f3 >f33@s3333f33f3f3f333s3333f33f3̙3f33̙3̙3f3f33@33f3 ̙33@s33f3f33333 D?34543345;>93=3@43327>5:34:3MM333f3]M33M333MM333f3f3f333 M3Yf3M33̍3̙33Y3f3@Y33@3̙3̙3f3f3333@MM333M3f3f33倰333 ?F6236787423?738;34;93573̿33@3@3Yf3f@3433333̲@@f3f3f333 f3Y̲f3Y3Y3@3YY333333Y33@3Mf3̙3̙3f3f33@33@3 Mf3̲33@33f3 f33M33Ms3338E73213@43:63?2393@3333f@3@3333@f3f3f33@̙3@s3@333@Y33YY3 YM3̙3̙3f3f33Y3YM3Mf3@3f3f33335C63@3<387383Yf@3Mf@3f3hf33MM3f@3@̙f3Mf@3Yf3YfY3Mff3Mf3Mff3Yf33@ff333@43>43<39353f5B43MY3fsٿ3fM33MY3335>3;53;32553Y@433f333335<53863934536;:333338623235838363863333346452233936362343333338434343f33f3MY3M̲s3M̲M3Y̥@3s̍3Y3̀3̿s3@̲Y3s̲f3f33M3f3f3M̲@3M33@33f3YM3337325342333f33s33M@3sfM33Mf3ssf٥3̲f@3fs3fss3 ٲfM33fs333f3̙3333fM333333̙33353432323YfM3Mf@3Mf@3Yf3f3@fM33 s33MfM3Y3@3ٍ3333333MM33̙3@3s33MM333333s33̙3Yf33Mf@3Yf3f3̙3Yf3Yf3Yff3Yf3f33f3f̲33@3Mff@333YfM3Mf@3̙3MfY3fY3@ff3336343@3333ff3@s33̙333@ f3f3f3 @333ٙ33ـ33@M3s33̙3s33s3@@33s3333̙33Mf33Y33̿@3f3-̙33Mf33̙333@f33Y33̿@3M33ff@3̙3333̙333Y33@33Y3f33f33 M333335342323̿33@3@3Yf3fs333333ff333̲33@f3f33333s33f333YY33f33f3̙33̍333f3̙3f33f̀@3̙33̲33@3f33̲33M3@3f33̲33@3ff333̲33@f33M3 33M3@3ٲ@M3f3̙3f33M333ff33Y33̲33YY3f33̲33̙3@3333@3fM3fY3333fM333432332313MM333f3 @Y3YM33333MM333f3f3f333f3f33@ٿ3f33f3 ̙33ff33f3Y333f3̙3f33Y3̙3MM33333̙3̙3f3MM3333MM3f3Mf33̙3̙3@̙ٲ3f3f3f33@f333Y33M@3̙3333̙33@33f3f33f33f333232313f3f33f3 f33٥3ٙ3333f33f3f3f333f3f33@@3f33f3̙3MY3f333f3̙3f333Yٲ3̙3f3̙3333̙3̙3f3̙3f3̙333f3 f33̙33̙3̙33@ٲf3f33f333̥33333f3333̙3f3fY3f3f33f33323f3f33f3 f33YM3333f33f3f3f333s33f333@@3s33M@33f333MM333f33s3̙3f3̙3333̙3̙3f3̙3f3̙333f3 f3@3333̙3̙3̙33@3f33f3 3Mf33f33333f3333̙3f3@3f3f3̙3f333233@33ٍ3f3s33333s33@f3f3f333 @333@ٿ@33 3333MM3@3f@3s3 MM333333Mf33 ٙ33s33@Y3333̙3̙3f3 ̙33s33@Y33 33s33@f3333̙3̙33M3f333f3f3333Y333@3333̙33@33ٲ3f3f33@33f333f3Yf@3ff3f3333f3f3f33fff3 s33MfM3Y33Yf@33sfٲ33ff3Yf33fs33@ٲfY33f3MsfM33sٿ33333̙3̙3f3 ̙33sٿ33333f3Yf33̙3̙3Yffٲ3f33 33f33333Y3 3ff3333ssMYf3M3f3 f3@sf33f333s̥f33Y̥@33f̿s33f3f3f@f3M3M3ss3s33M@33Y̥@3s̍3@̿s3Mf3̿s3@̲Y3̲f3M̲Y3s̍3f3f33f3f3M3f3s̍3f3f3f@f33s̿f33f3f3Y̥M3@Y3M33 f33Y̍Y33f3f3YY3f3f̿@3f3f3 M3Y̲3M3M3 M33@̥Y33M333f33M33M̲s33M33333f3@3f33f3333@f3Y3Yff33Yff333333333333!"$"! $"&'% ")6pŷS6SSD*SDS''SŪ$(DpSSŪ/pSSSŪ,$pS'6SSSS#0pp6SSS1'D'6SSS!&5'~SSS"32S6D6DpaDD~~SSDppSSS~aDDppS!;-~6'D6'D66aDp'pSS'66# #>,6~SSDS6a''S''a%"*?+~p~'S'S6DS~Dp'$ !.B1 DԌSaS~DS~~S6p6'aD~DS~%! /B3SS~'~66'S'6SSԌaD'6)$4@,!DppaSS~''p''S6SDSSS~',$@B# Dpp6'6SDD6SSS''%!"ID S6~SS6D66p'~SSS'pp6D660!%,I9 "SSS~SD~SS6~S,$%&CF$ # SDaSS'~S6aS#/+%#RE ! SaD~'SS6'SS/!,/1+81#!"DSSSSaDSSS!7:&72$$QRR=!""SSSSaSSS#$(;;+7RQUKPA8,"# SSSSSapSS6S $!$,41".2!/R J57DQT_PI)&%#aSSSS6DSSS !%'(*+*'"%%;PI% 5J][R2&&"~p6p6SS''S6~ 7G@!DTcL-&#$6'SSSS~S3) )J<#HZdC!'$!SS6pa~S6@HL.Pe^2)(&SSpD6SSDD'SS~pD/< 3F.CWgH-"#!"D'S~aDS~SS'D'DD6'SSS8= #DA1`Z[$,(&6aSS''DSaD'6~'6aD':E% %AF!]fR$-9-#%$!pD'pS6SSSp'6pD'pS'62O7"&?D!Rk` $1&2%!'!%pԚpSpSS'aS6pSSpS'~Spa'apaSS~DpS~'~Sp%NK4# !=>% ZZa!+&1"!('aD'SS'6'D6'D'7OP4"(!>9#!dmP+6%'& 6p'S'S'D'D'a=YJ!" $(?3'WjV"8(''#DSpSSD'~S~'6Ԍ6'~S(TS*$)0=+:m_@3+(($'"D~pDD~6S~SD'S~S6'S~S66S~S''S~S6 PW1'*,53 #@lp1@(*(( QU2& &'%03,! _iT9)&-$$,&TV/&   #%''(76,+*#!&irM*:#/#"&*+)!Z\&-%#.* LrNI"/ ,!#]]&& #./.[A&0(5@?2*Irj_E@]iwyf|[C,#fa+."5=HFB>,Urrg,Y#0Hn|f}yD"2 >hC1,!/7JGO?/W9$()U4W}k|B'/!!jX4-):QJT9$8rr1:N$P~|ou8/("Pp75.2OMY?%Td^R@ )YcW$6!3eI530LX\;8pm+(c& Drzq"6-$qn5=7N_U+WjWHO(qfD4!&X`*)I!HR`@Gna#'Y6SG! !" RtAM#7^SS")\l@N]SrK '&"=hEF6" %[aK&bmL9k,7T;%(# ;u\8K  Lc_$MZd")iD69.Hj>!# -0t]\/ UT]'J>*43%2""8%:yl)7@j^66AKTG4 :*D`_B=?Br^&*dC0!Vc*D`_B*9HgU)R]S]G*yJ.2*3MXzlj}k||mydweuaO8#&=2;hi,Z?8eV(S_e9,de0"qz)#KV\_G(Cu 6[eqynaZFG>cb4^~tN6?A5,>4$4V_n\H !! 1FMp]!bJ<][$5OcL)O=bSaS%.v7/fm[:)'/@?)D\mX>!!CZ)}U]k!7&nS(`a? fJRT=Vcc8g'djxT);#/GC!;d`Z,@F<3ekIC\.+3Bl5#YSF8cM&Y-ZIg~T#>;T4>gZGLE:5T8nF7+dWG`HOc* *sHsj$,/+TF!"P[X# IAI?CDZVmtbv^i`EB0 P(`HBHt6<]K{sc6 m65" OM$3]X+!M[Lez~xcyk||l}jlroOtN!pa-?c]$M\&+fc*ppg#"2MP%$XU26\tfunuJN@D=>DE[esnm|<aZB0Xl'G]7JoEcM "~>0"RO!QT=#&IfoezD-M( (9[quB$nr)O4tM%LO 3:RT>"> 2:PN[R\LP=5'/Y%+ ZIAUQ"# "O\n]P.:YXmX=/d-&Q$ w[mkf-ht&6Mdy%NH%M\aQ ]cQ$8_ukYRF3'"(5GRlb[D"; *=b-3VM7'$T`c6X>Q;tvb(Zwh`$Tc-%S1Ff9-T7&\`THk|D0T^Q1ckl\i]dn_mZD- 3IgvWWttv"(RQ3GNC0"#*%2UhB[P8Y_~A[u=PF:|VDN,XS_2D?aa.6Y{I5%(7IVdV/';g_+"$&7a5#2BFB;510013.%=Z_)?g%'U%y &Wxq>OP%jWGB)Y_U)H.6?;>31QUuuq_$ +M`L42X*GA '(!Xa%((%# !"! AaM *YBU:btv% 9zrh#QU$}y+P.,[QU$(Dbirctcv|c'(NYdB`JL $,*'5Z5%?c@]cHW]?]\#eg 2F (K]S#>W]k`0+*)2Xe,| -c[$$eR%!:c95bD+[1PP8'r~)?H $UWH?\`B, }E $^yogs}rc<^=8 ,"-q&Hh%! (,`<`Z'RL>~wYEdor<rt\N8 :GQWTH.$mS%,DQNc@XT' %b[( GuwU,[`g,b-MQC+;]\cvpi,*/6H' Qh&4$/JC71b(E}zk+-063)*1{dH!Id91+@$D Beut=RjiP9?UQekGMbkx9Rz5ay|C7;> 9rn %8  $=HRuE1/'GH,lox|ptxi}#bP a;<:%6>1 +B@<*`*,N IqK9bT+IlE.72<B4qyfOu|cu|zxc6+`)\vDT}YI7oq7=>9 *?:c_&,,Vx"fy2#W`7Bw[&D:4> ,Rqckmy_b/rtfeRqX0I$$gx^$ %W'2j(4$&4! !$%! %,,[}zwV#4gaPg<;weRD/8#K^kB!Sg{xxttb4Qorx7n+uwH`udk",+0|~241--+$ &(yg!  d|<Lk7&fr!G/O/1 %\cI +h}vsvf'N_6`uzz<+74VnQN{( v*dx_%0 zywPZ,hqOo0vy43JI+)'1`_-0iypM$Roog#P] ;3+otYw LC4 &I0o%Od|; [e#RfOW'M,-:^Q!/6gxd %^|z@ 5-M|8zT O.!^&Vh E%3om0kOH|p\C"nmUI=my2+zme 8/"et*y$Ir&$*!z'&@%%) ou2Mt6-mh.U2M4"&;Z:"=cdQ',`J!U5I 0-@WgO~sY"e.o{>XwdU''Cxe_hp}T5Z#V>*3Y7 g|`& =wi9! gvub4MdaZ*1?!"YPz5 )'[(%j &&  &y!En<R}gHUJL'&X:,lpEyWxjT]PFn5!9Lnec5@4'}z+ m&"k@rG~"%$!!!`zCon*kATBAP$PD!E{v"'${YW}oriYu ->Kbfmf^I jZHD&-7~~&|sL!#"! SbKd:mg2Y(9_'$=M%gR%Z6/Uqpnh{nnqecA,1 m^tj% zD2GA $&&'#=oi,yf?ft9VL&T= *0/11/-) #R'%r.c[/{y8-DInzi|t`E9!1& -UL=B"#NboSh!!8CctjmlI:!Zh+|h-i-+:CTQbWo^lY]IF2# YR(33/+/037=Nc^m&* ;i4$ 8A~~x"IfkttqpdpNRyk<R)>^`yyiwcqdtdrcpbn_mWM2#=`+ !##%&),*#.AQU*PS* &>n0kx )ssǶtI(,X=Qz5 !" Z|15y 'X[UN<=4350sXyqE' qv!:\$2Lm}e|uwoQM93& %+7?UYk^gI-"*WF 8A]]N,S|ZI"GsvƼklH$+#]}}bjüm!z}F,Alv4 K{{_R8 m~J%?R~}Q-M|F !kCFZk}jYA &5KfXW*!Rc&8]]EO;$.bMUnp v~ưw mvE#+i{vl. rVg}xJ 5kyyP3c` Nuoh|tV&bz( !ut}zN6!;ZaF"$0UL!%&'% #:86GN@ 1"]yE"1pD6):8:=Kgƥ u^2SJ-Tnku/ {{]*bi @aD_ycFC`Bs: >X[0$Wb* '+(&&*08A;+BL&?O2 4$rC?Z}[3%y/"ryx Ơp<r&rM?PV {CSp[&kkChwV)oZ"'%=yx|O!"G`=# -\Z%#'AI!v%9\Įm1[pZj=5dxs&X!jN#)ZK#bg)&57@\P+*.NXIYM;)3.> cnK:ppz>^ }fky}6,$ SĮX18v!ov'{7,Ś1lnXX%u5 j_ *Z=@X^! "2+NKC.": MVS.&<-5 tuk|:lw[yPſk)!X{"j|m@XkbŽrqBoUT>[X#"+U0TiR +(NKN")I]`?/1mM lQamſ~+o 3 $`u7oirXDs #:&hk$&!##/0P !QgZ*TJI7l]H //'z?yhYAŴXyo4\wq);}t{6b9r /WEeQ][$(&)??%e_\"&(^U9=;`S.)//m(iGmD"ryg x4S1Nȸ!W=z2LsprEho82ri!/$K(&`mZ+%Dm#E-&]W> >{i'm$}$|Ž{;sRW~P¹STV@~r9 +c~gN ! gR!7 .B'\dl5#!jN$F!U_E4vi|c"#V{y&rįGwz1Dĩp bŲ ZN?RhdS?^^.yV(:B&"`laP He3/M MiQxv58pn-!" S=qIJ:rƩ# ųx¶P,ǽf gĿs,FNuws>"t{V'Di=,:/5IppX0!:LY;F Ww1'?FL=ŵƫRdü0ŽN_~c2'ProygnOVynEzay0#/;?D]qrJ&!40`5=@ #dJR1vwZz}v +H ¿P>~I gys,k"M|rU<5 fr nxm@L3 1/= %!,fkjrI,*'[ZIE funv\(`vh`w`-n49ijzöZ bntž&-gnukQh{8rg&ql:LXM=3.,/4=6"B'#?> =qtau]9!"$&.7i,DF Gv{94m`aA JOžjf;!t~¼g< JŻi,bnS1ypFE>.79971(:02AA," %ImufwsN?! &9O^W{d r{vvlUPE6&/!aECG ;ylEP]BIw,\u}B~#uwĺ}>/KG#I~8!IJ$&kv{d5Al6=PU2:'+@?*@2 #L[wwdyxf_FG9-4/->A@W^frmqjwyu~w`J$$#Yi IU%[xV&nj!+ONh/i}8$pDZm'?ZJfC)~ hžR ^\$sw~BM%Vh3 )C-:'.;,$;IGEO[`Zssyg}S+!6k8@_1av-"og#\q'pv?"Ŀľ1 XM#u#op*``,XYyZ+ulo/+E>%2"%#-@MHZaP^ZPKIB1.",GVeiuYD-qM0[0fuEFnOEOalN[ ~y(0czv_C;'x|.Ttt2 (|8(j|s1QZM" .#*!#:Pb{l^)bM'WSal(sb'k6s!o 8&Kˆ)L~X]}jzZ(kewC %WOM1G6-'" $.;.$#9Wrd/s__t8StFW:uw[d\kX,\Yw w[S} I&·w}= D4b73cydU! -?J: 29;@E>;:83/%&%Alzlw7b U"Wh9u\>jV '(I| P*e61{w}kp ^xvvq0 ~vUBuw]89R'#OZ9u feXdw6~v,$Atx)#-.L^yb "\<&vmU+Q&2[suQ+(HJ'&%G}zx}6gU_VSwNKbfvD \_? x]WY1u,UNkyMwW%#y`0p|d%/gu, *TjRbN ra$n#@&vT;o(tu K\rjS4&ERJ'&$&ArT,iN>^N\Lsy;fufr)#$*_7oG9#Pi"rKyk0 !HXpahH8$ ,u89|SVn)aZPfQ,'/yxO­zDTVU`PWD;. 0XnUk]2eH&md)2pC"z, Hûqds]}|wb8N"A/~%uqjDixYw 0"Dwv^Ibg z}DfRdc#E()H`*9r|bzP~zMp.gyr%()$aYmJYb+ e|O#|sn_W)zras]21-?E-y)"`*y%8"=SEgA Sqd@L#[ O*Xr"s-LkJivC}xut#q^*+!J}@m'!1("-Q'aM1`T @jd%~ Q,'fNu>!nz~rsK(kQ~t">j!bw}T54'>ogD#6pv|02Snx>.x!]Objk Gj]++t$O5B*&c `;,l`}&"q <Ek'nTadxly f;+q}: **\K$I)&1 17nm,tM$z." /3V aixzzme>j(ZbH$~S 6t{ws,)K3(|i(;4%A1,y<D:||sv~ 4^Z}` _we$6i~w4(ID, To(4yu3?|Q>u*;Knhz}@rs?uB#}m0|]}v,!CU30 AO(C5QpMCQ_P'fsu|-G *;rp@Nylnu}t{T/4ZL01 jvaUR(E4T}d GeO;c gcc}aWA%Rgg%#(uvI>k8x[(I|X(bržQF6& #CO{xvr{wQE$%E6N|oF\R:<C 2a ~Ŀo$(uaJ^o3JP7hzvJ\V( 2ľŽzv]KIGA/358-;DE[qopw}v|~]J"+G;gw~v0@uuH=" gav bBDhs[JjRl8m\x0Mm~ xt[RI0,.((023EL]zvtu`3,HE!)Ww+?ef{~ wcN/ 6XblV9 'FT5'lzn#'L;Ou xz806asyEBzNHN8M)[(f($Yz7 :Up]z}vaqO-&Pete% ,^n|j@ 0@@ZdnVzz^{l^>>)3UiO *LWW8!8}u:*IZtt_u]/cth8"j3Eu \aKhkaNms< {sO[[9&\v}]./UT`J8+ )jRJg_rpfjB& 0z~¿|6m z- 57 yvN/-mj}9 -E_WcXZHG;<474>I{pajO+CfĿ_Qq~IVmE={qvR'"!! ".EKcVfXgYi\k`pZ+Iyȼ*/JqpIMtsR*_}zP  %!!%25B@MELB@?z|4IĻX)XSqX*3oO\)[h|f ""$ 6%ſu&'3Ca|iC,nQ rmI, A|g]  $"2pLgvDųc *B?aqup7zgH j~S2 0JQYcmC,nP s|ePL?Ti~q}j=asL!"& !,&#"&Ww9/P[D9*&%WuſhbYOGJ[U{Y)4nSJ!7LUzi.&ct5#"&+# #"#(&w\ 0$>ǹroJNuyO)(8bzH BmV#'0(  ,U)K <8y~HXl{U".`G&!>$$(%-'%2 Kcup:,xv?%Ca]}zuv-75 x~vZ<$Id! 2fZ "' ,'$!$,(#f q)r{? ,2GTaXu~e a}tme?DDnjbMoq> x|N\_L(ItV!Tp<'#"'7#!&&7]E 0Tm)%}Z/&wp55bs|z_ 5m>$+`X$$*8#"*-|< >nwV)"PN7Q,Y)CJyOSr)%Yn( %'#'7'/,'8"0p&k$6[x}HQ,iww4!L= IG$4aF*&*  !;)/.*?)3^Aik$)Ccm^HnUi:bjo- ;dq a~qr)kT. '+ !?("$*+-$<=$0s2GwWMfx4GS;epxC`_ eiJk-+Pk1 )$);&'%"2%$- +9$03?ľU/+1>KXzf5L#'szM An5z4%kd; (Wj@}rB&#?]-2)$,&A521,-0; $5QUtwluoF#xwa{vqf wi. Yxq7Jd~e*X}f*v% )E@24;?80$<' B^~tTC&$t##AUùQ|e 6OSiyhz mwj\,,\O!mM25oo\PzIrƾƽsYN(-+JV?  +)E-B4."(@1fisU_{n7ǥrK"~VyVNzu(`j ^.Sx + ĿƼ{uJ6!9FW/52 1/,+./19==E*E'94RasF"Y'hE@Ĵ[14c>vms}+!gjo)4d,6i´Z)(?T9;&DbA$ ')'(,1/./($*8,&A "+19751,'!%^fZ$N7Ryjh0KfE%$@FVHFE5+!.@'3==4+""&*'-\m=@FJyf'EVFZ}zchf\Qfcacuxqf&JUVe jgg_w@{LĿ3\K$l#Hnm{o9CHVE)&34.)"&4&,:IHS:*%C(EA*I=*$%0[h)4T6v}!&\ GZ}H2Oa2x~uy+Z ~M7},b{i@2&Z*Uou_KC(OH>A"/+('%;TOP*H,BJJ3'% )_`"!`26p%~? Ix|ZL'4~p2vhqt{= hrL> uG:yXT% 5yJ"  J{z?;7O;2P )*-8TVF!4D-;;JJ+ #^^"JM-|#5j:uvj4=^uev~fG:""[3p@ztu"xlL<V!uS~ :#'! #Twp;2B[3(T/* &%EU\1"F- %3A@3.)"S^&5V&2u*#<\u |#j ginwykc;(hFuqJa{o"+1kwQ)+G,^!"RA'+/Q^M+'&%BI&$).4=>2&,B7]2_F,g*41]..RZu`znCb)C=_\ {/{A0/U|C(M9K!PM&) KTZ& *WE**(#D3!VH:c'7k}'gU)xsm4zH|.7k5eg G,bi'2yn 3,pyO'TI;!QR #%$>\Y.-V2$P) >] SR6\$-}2$J("f)lvrtC @5i%Y_NsTKU&01~oz2+]"U%&UR#!'4cT0xT!:Am~I4SL,&IdE %8Wb'!UQ*@W-X28N G%$6'XEw7q@$?`7,BL^*K(Gx5w;# KkIDS0B%M\`5%HgP "ZR0>[; "!6U'&%!%Ym_oaUY_PH?-<(9Y' W,7b5.C Fj'at&evDuq;-5 &Xurb1NBE)/P^fD#!& KiV$W]85^I!!! A@%(" "KslWOk7!7,')-19DQL>,>&x8$yjcv=42N29 w1qq'zfj/-eE &Whrf;!8*HWkZO$!! !_WB#LaE)\U;"Q-"*&*Lhm-Yh!79"2@C,?wus!\Ŭ"nz,0; 9-}0B-2*pIstk[jD# Iogu|bQ5#)>*?Mh`mZJ$ " /kj.G_Z0KV^;$!Y*GY~nh4 =a*%]h(<;!W1Qkv8J.ur,X0_ĸvcy}:#'(==0&esmj}lleOSH`HHKV\pkmldP2$ GYi)>SdI* )KdYO4 1L 'F_i{o||N2 2flTWzW+<'^ -x²^'x#KyrJK s 9eðMtR+ mMyX6:  %'QK3Acwg}h||kyqyeuisre]?0%Y+)UYcK5!#&$  -Ea^cZB5$8:%1GPsxo|e}jH3 fmm~Qmn47i !WǴE u%$Dh$=h#&zǿw',#?T8{yLso4C&+(f;%36ELMbOWHOA8+$!Qmi*;VbgV@&!'#?GfZm_mY`U^nwbuewmwy]X:$/1mq9*:857 (säi O9?w3 }q"'0=q-auek9165L-+CY"*1$#dbg58PifebG:* !(!'*.DJd^p`rtzarZZK2#11 CFq06ja?dW0 #OƾV({)1r{2 "~$-pY7y0UJ"rk/6I'3 VW )-$!$ZpjA0Cgffm`n\aWQJDLEEJ?2&$%$)G-5-1Yj_nKZ)l(Lp~!2w#Sx67<~8 'Űs&/u6v@'xuB:D (Of7 ##$&'#!!][pU ,H]^n\penpatiqu^wv\_R3A$ %:9W^aJmG !02<@E36/(d#Ng|aTX9w^/iF{`n`xr/_w%dvCC>[iUrbm:'0BEXdYfauudwwfyup{a1 0Jepuizbg/ `A3Qh~lwm(M!1CFG^fc~{Dw .[hC&5CP /%Ln!FUz;[RP66kV3! @itn]/+ !0GUmyj|vz[<73413:@FY[Zdc}A#d`.#Bxqt"h@e{uv8^tPauPaJ~` $Pw}?B ^yk&gUXd* gW#>',f\uuM,/'(@l}p}~l{[LXSS\PJH7Cemb$>xv|k;bxslG. BX4=22}g1ia 7rķt,{>÷<"|<|EtS9WPd?(? BristN+!4']u}iY:CqU)0Yc_bM78)'$*=DIF#KusXgbLL=.bS%ml(yGPV%#qVoewlG]OC@nUA, $JutbyZ4.0 .$9u|nk/?duy,Kb5 ^'&$#"$" R46 'hƵ!GD80 &ww"P*;lQ']/9kY%1? 1UtyrtuM;8"/CaI9F-TqqbV3*_2&`s8;Njr\pg}*uœ# eID7@[I`3]o1!Q4b\y|g}zZX@+#33,+H[pwy<Zk[J"%y)9MQ+ VĽJ JX{)%ſ|.BksT+, ~IGgMe@JbsN5G'?WY}dsug kwY;${n6P" bY'P}hzJ(B2 H{n[|s9 z MÿQv{$=OXY}r])Uuu=0X',e. 2[jpjG1>zqq""Kjw tWT.r,fǾ;? "\}< ?DuxwaoOI9kxda%'T"A<J<2U.,tG)LzkyecIE]5BLsqzG s;P ǵZQž4og #yp;Ydrl_;:nxju?&Y%!+J& VK0O,Zf"3ZatwzrxP&4_ ?}9}b]ìJev {2K}Kf|U1~R$Ctts{K&+a&A>)D@&9Y.?a1,Ecgr|\Y;<z{@9Ž?ViDM36?&iR5typ/"DW}k}}N+0V !5K(JR ]nnAQnM*$T":1" Lz! &lRŬz..gn} .o,1CRulkhjC1TD!JO&Zmg3^[Dn-2 ""~xn<  67G|Sķn R5ŽX pR$&?|{dsr\cK/$f= $OQ`=)UHLn)+(+*"*24~xg,vŽſSz 9?ypN(?L{ofyPxuaP@lz=#:])%7LIk2A`>Dg4n_+B-%),$$6bfwGb2,WZ"Mg2;ZU1(0#Nyt@!y/j9 <_l8 kvpf +6EHM]{Q>4 11 W.Ui#)MW`3T}}Fd^&<\P&cW!< ;0*(#l7  9/4Yq]  {$ ey[~Z7DIFC?6337hU\[g=OggP;nI'I^XJYiwQ`Q4`H1iP:&+qu3('! !xp2v~w6b73p5b v|W{?)`5(?,H2g"]`'# 6caT3x|rf[&'bF:dM50VO8&#$|vg H<,w*.wl9;wy _7#loL4,VcggdIpN% .MddL+<||keIZK B[H+A1?$%"0j ~W5%s8x#t'Swb_ ƒQ3Vsn\l.YZ/3lY") JTff-[J) HQ" GVK[xns> GK !2n (vzukFl2,}YawF"y!3(hzNv]G;$\r;$+XV1fF.T0+C/"5Bt{6$"{rJnx5}o:.rn,|-stxoU/n^1LX'd4at^40! OanfZ&(fN$O"PoO5jPLOM@84B\8:;846,' >9' p*c}Za8|.H>v|]eS8l\+.`Y8)ght3%1 *xd $.`WcHB%-a?X/!*.0/-Z8 $&%" !" @mu)PI) a@dU$|@FgfFB5;KHeZ#X;0)AzQ(KpKhqo 0l~,C~r}i>{EY=. \ Bd^@C[%=vu-Yr~wq\A2(Sd;8-& Kn^EF16R\q2Ng|L&HgiPB3-%$.8wyM<`xX !0>BNIRHVMYUY]N_QFMppj``S$";-%#! /cmj:>;2 rmyZN+!!/a 'Yco{J.%8JmcpU<&[tng91&Jlq*/R9D_ceb< Pw,d|`-+L`[3)@^\_C 0__)$*?TVGG$$puuuB =^UW>+ MuN"&*2+.G9$;D}j6MggN-5$!G1bp:G`_#EaP@@^X# 8ORF7%puuuA";S`YcRO>9-(" 9zg&!"1<, 3KO?-X~hYI$!9 Uqj84/Vyk%&%"Y`3&,KR? 6ON?&A5Quuur&*8PSdVfXgZi\k^f_DA. [v6mu{! !"$-$* '>RXSRXZWpN+6Jr6%"alG "18>@920/01/&M`([_3! $>MNaul#Yuun6%/@CVQdYk`mlfn\pXK2 CwS# #"_'fs3 (.451Da~E#4 _rrqr>%Awr$&;J<-""')  %X``?#OS%!Y{vzi)$, Mn!  -3L[bp_rrZP-cz. !Mjg"ls&33wc`7 0Nrrpq9nQ2Rh`">H?##& #0+!0]Z5ebw{`04uuU /Dghrt[a7Kpyo{('ps_-A2 ZP0$1uv2@`'#*0i2]rm?nZ/%%.*4KV'"!=]rK!)!!5^`naqt=9V; "#HW.?T< 3kp^b-"BD!fthGlbwwX<9O Ok}6lR./7c%S6))>ol; $*Rgh5@X6  ^ZFY:Un^j7%;?7q]=Aqtiyh'jQ%ojX,vn+/3MX?M)&InY/""+O~u7EX52SCBM+(]`nG &=6OrlBwydyS.w+nd=Tq1Y: W,- K__$#"9s=?T<M]+NV)-]m\3*?,&qe< %Vl||Y2 $4~mj"|m=50j*BE0 =`_!$b|O2SL"PLCJ%"/iaW!/>#Dok?unu}P M`7qL3n&<-~+Q1!-j\!" Wq`."YY?Y5LR$1ZcP53"ol2!Z}}eVDuwG\YI()vk I'". +fV&  QvvaR%QZ*OHAJ")_hC&8#If[Jrll$ ;jjK'F?b?.*)$&!#S^- T[]\iK0+*CF7V4GO$##b^F33-nn 8}z+#GOg}tvW,26?NoO747" !:b;[M+NZd[E6$PaaF"QD>G%M_J$3W^; 4x78{U;^H=~l|.I4)PeO0@9!'bK &_? 4QTd[J.a">I);M)=cP2(FmQ"{iG\4@s%2PEP\S.P*"DV*6^)%0+-a",N:3G-(]T"(3.]UA?UX Owqw-L;)O-JO7S "!WGINMaaB!K@(I5Hd5/kk E] dFEh.7P$C@HZO>!A_'%S2'-E"AA#F;2cG-$TY)1p24f(Fly}@#VA6H"7h?K)XF">L0a@9E)@GKY%(*Ni7^~=dMM5z~kURN  +H+([&?B7".V0 #U0J\ 4G* 2@&*aE.@[9>^Nszh4/4+X*(U}}`6EQ1&E/[4DE8BS# 6L/X;3E) "E7BU&)!9gD0|k!_LDPou|T&8WD%A1QI.OE 0V?L(L\"4A&9;RS"'1[A%Z~d [|-]#(dxkx_iM)>.?yW;*$T+8$QL%7; -A(,^3)*fMh}ek =cV5/k^B%/9&/H_x;/3T'C8P3!38.799S"#%&ZEE}}r H !HizcubdE2!43!2B]YL1AH'"*5QDHP% !"! "-9.-9VR,"'bL8tcz04XS!%WST "=\`t`r`jRQBJKH?ERTfZVH)"W((, 4C=%JM %# !'.0*9d?  $()''.,XE$!q||7Hx"BXcD# 0>XUm_ocn_k`_aIA)@J'/!3=8(!GH #&))*-+(%#dF%)%#4bA #Gb{ZJE=^`b1!#! "&+-0-40/%T6(3 1=4*"CG #bE$'*#7V3 (xy^"X3.Gf\gC# !"&Q')7.-?2(>H$%K;3 -'=a5 Kyy9]!=ZiZiG* "/J!(1:>1 %G1%5G0'M"20*5(ET"% +tb\o{;dm\e?'  /(A9&>MD5'E2 'C:!)P1- #%),7;.%&()'" WT!%Uww*9ou(0cn]b:CRR47"6,42?."F /) &),*%#02  $% $]9 #" #$[h^:,usB/2Yp]kA;RR$&:/ 29."?! %0.*..& 12!$7T(Euu)>1t6"apph+_pQ"7%9"&#)3/ (*1.#%34#SRXud=\j_Qp`+6)K&2-#/)7JJ=1/05"(T5+qc:%/&nrAfp5;4!#"%,IJ*11#(7+?N%Ftr/"VqT]pj713'* AJJF0D0"";6$U7"R_S3(epGop;:*".%'  )G*9;#(:HGK$9:GE  rr9+!ZpO(IM/:&!,$"%.C? "5KA(&%-,6G& /cq!!(6_eIL(9#) ##",?8,,+8??3,F1MpT)ln3np46$!$!  !!  $('(,),*&&,<6,)"?*B6]pH %L\D[a01$""  $))%$$!!"!#)+6GG-(!&,?>.A3\`1"6main1-&  &%! 6>(2160) )&#!*>='966>* nn%""`Ygn7,%&#*<*392,%#>;/9<#/;2  &Z]!Yk_e9+"!%8'(8:3&$$.,#%!!69''3:/ /mcH]cmF,!#,0->:=E2$',@E4.2%!3kW1_Zk_*"&.>@F>=-1 "1gT*gVX\$ #.#% #1% !)"!$ #TF"Q9=];$ ! ,  "%),+'.2.,  $'  "&$ FR$5T%;W?###-!%"!2/*!*&"#" !' ! [GND5QE"!()""(.% !&'"5V.,J-+HK(" (#" 1FK BB;N;"," 4""OB 2N"!'DD8!  -!2!"%P=#L.$%9A1( 2%$M;D7 %;9+ /%"I= <; 0:)/ #@?+6< )8(.!".>9"2:#'3',! .;4&36!"+*&"+!)4:/'"'72"%#/!$(# $&(/;;,"#('#$#,-",%" !#&)($'6S6S66S'DSDS''SSpS'SS !"%#""# !Sp'ŌSpp'DD 66ŌS66&!! !"6DS'a'paS6ap'D6~Ō'6SŌ'S'6S"!% "(%%#"!" # SŨSDŚ'66ō2'6 S~Sp'~Spa~6S6Ũ'6⌌S SDŨaDŌŌSSŌ'Ōpa6p66~S 'a~'6 S~66Ũ'6ŷD'%!%#! ppSDS'SpaԟŨppSSSpSԷ6⌌S 6DpS~6pSD~ŨSS~S~DSDSaS~ ~paԷŨSpSԷDSD$#$# p'~ST'p66DaSSa~ap'SSŌaSŌԌSaSS'Sa'Dp66Sa !!" $""SSS S'pSSSSSSpaSSŌ'SŌŌSSS'SS Ō'pSSŵ! !! SSS S'aSSSS~apppSSŌS~ŌŌSS'p~S Ō'aSSp !  !!66pS>6666SSS 6DpS~6pp~ŌDS'D'ŌŌSS'66p6SSp " ŷ'p'DSS'~Ũ''SSS~ SDŨSDpD~'DD~Dp'6SŌŌSS'~' 6SŨp'~S S66a! $'~S'~''~SSS'Ō'a'pp'DDD D6ŌŌSSDD66S~'SSp! DS'6S'SSJ66S''ŌS6S'DSDSD6SS6S6SSDS'SS! S 6Dp~SaԷS66DD~S~~!SpS6D6~Ũa6Ũ6DŚ'a~Dpp~ŷa'ŨDaŨSS6pSSp6Ũ'6p'pSpD6pSpa6'aS66~SaaSԚŨS'SaSaa ԨS~6pSaSŌppS6ŌDS66S'6S'DSS'S6 a6S6D'~pp66Ō'a66ppaŌDS6S'DSSŌDSDSDSSDSSSSŨ'6SS'DS66S'Ō6SDSD'SS'~SS'aŌ' SSpS '~~Ԍp'6aŌaa''aŌ6SDŷ'S-Ō6SŌ'SDŷ'6pSS'ŌpŌD'~DSS p6~ŷ'p'DSSapSSŨ'SSpa~~SDDSSŌ~SŌSSp~'ŌŨp'SŨ6'pSŨp'SSŨ'S6 6'ppԨ'6SŌS6~SSDŨDDSŨŌ'~'S6SDpS666pS 'DD6p66SSSSS'ԷSS ŌpSSpSppDSŌSDŌ66pŌŌS66p66S6SŌŌ'ŌԨSSS~'S~D6'ŌŌp'SSSSSSS SԚԌSSSSSS''SSŌ6DSpppSŌS~DԨŌSŌŌŌSŌSŌS SŌŌŌ'ԨSSS~ŚSŌSSDSSSSSS SpD6SSSSa~~S''a6'pSppp66pSaŌSŌŌŌSŌSŌS Sp'ŌŌŌ'SS 6SSSŌS'pSSŌSp'~Saa'SSS '~~'Է' pp66'S'pa 66pp6Sp Ԍa'DŌŌS Ōa'D a'SŌŌ6SSSDp'Ō'ԨSS~'SppSDS'SSppSpSSSSpSS a6S6DD~S'paSԨS~SpDSSap'ԨS~DpS~p6aS6~paԷŌŌS Ō~paԷpSDpSŌŌDSpSԨS S~D pSpSaa6DSp6S S'aSSaŚSDŚ'S~ŷaSpSpS~'S66aapa6'pDŚ'a~'~ŷa6S~ŷa'ŨDpŨS6ŨDa~SpSppSpS6pSa~SpSpS~'SaŷpSppSpSDŚ6'D6 SpD~DSpSpDDSSŷp'SpSp 6DŨpp66 6'~ŚD6Sp6~6~Ũa6~Sp'SS'SDDSSDSS3333333333333333333333333333333333333465333333 5=?@<<=@A93333334;93;A8333334334;34=<333337363393<=3333356363343;:33333;3:33>6333339633:5335<33333>3;833:8333335G7335=33M̿f33MffY334>993343=63433fY33f@3@f3̪335;<33<5337838;3633Ỳ33f3f3̪334763<338635>3833f33f3f3̪33>33=3<83933f@3Mff33f3f333=335;38>39333Mf33f3f33337;33>3>93:33Y@3Mf33f3f3333?433=38?538533@3f33f3f33335?33;43<3=33fM3YM3YsY3Yf333f3Yf3f333fsY3Yf338=33<43A;398333M@3Y33M@3Y3MM33s33Y3333@f3f@3MM339<433=36B:38=33M3f3f3Y3f33Ms3@@33f33333@3@s3336=733?38A93435@3333@3f3@3fM3Y3f33333Y3@33<8334<3:A;383A533Y3ٙfs33f3Y3f333f3333M̀M33@sY3Y3f3353:833:73:A<3673:=333ff3@3M3M@3f33@M33f3f333ٙ3s3Y33@M33:3;533>3<@93=3E4333Y333s3f3f3@3@3@@3f3M3f3Y3ff3f3@33;35=33<63@63:537B33Y33M3@3M3f333YY3M3f3f3f3@33333<3:83338:34AA3>43?933 8==<;;623f33M3f33f3MY3MM3@33f3f3f3@333MY3MM337834>3338:368838A=34=3F4335?@:432694f333f33f33f33Y3f3f333M33f33?3;8339:3;<6323@A635;34E33>B737g3Ys33f33f333@3f3M33s3f33336=37<335<935?536EA3:637C335D<3g3sY3@3f33f33M@3f3333f333:;3<336;>635A3:8<:3<38A335F93Y33ff3f33f33sY3f3333ff333:>34?A8?>73A436E>3:439A334D9333ff3f33f33s3f3333ff3337@8378AA:53<93;835937C33@=333ff3f33f3f3s3f3333fM3f33:?:63458;?=7<=43B3:E B3;;?BBFB@73;35E338E3s33ff3f33f33MY3f3333ff333 59<=<=<;9738837<3>DB634:@FEB93;3F533C933M3M3f33f33@@3f3333M3335?3593;83A?35>CG@83:43A;338D3M@3ff33f33f333f3333333<834;93<738B>35?EH>53953:B33?=3333f33f3M3s33f33333M335@437;3<63AC38BHF93:53E6334D53ff3Y33M3f33f3Y3Y33@f3f33333Y333:?437:3;83;A93?DI?3<43=>33=@3Y3@f3s3Y3f333f3f3@3Y@3YY3333M@3f3f3f333=>43<438;36@@39GEE634;436B6336D63Ms3ff3@@3Y3f333sY3@3M333333@3M3sY3@333=@634:34?34@B34FHB63?33@=3Y3@f3M3ff3f333@3M333Y3333@3f3@3M333:D;3<3?43@A534CJG438>8>8635A933635HJC<34=53=?5338A;3M3@3f33@f33@Y3@3Y3333@s333345338@<3Yf3f3f33Y3@f333@3333MٙM3@f3336DC73643:3=535=533=53;4=JK934?34<=6335>>833333 4BB:3347:934:3 :;3469>?;735:33FIC43=834;?935:><533333C938438636:=>:643445=;3<3ALA34A368@7>7333336FF39==936>B:34==35939@A=734<@63863:369533333334HG35>36??<73<3HL 837;39>B@;843;3@LI334F?=FIMNGND>43=83346333334HG4339:35=@CA@?843;43 DLLI8334D439@JNHNM>535@533 4:534:<<=><533333=I?33;93735:=CAD?:353D;5736C3:CNION>439>339?835;>533337335JD33;9384388333373;33AK;3;93934:CBE=63CGF3C>3 7DQQIG4337A6338A?3;933335738633:H@3<;3<38ADF;43;KJ737H63?LRVP53@<368436<736;3=53333;3>334LK3<>3>3;AFD83DID3?B38PVLXC>6338=6336734;3>3333<35<33DF67B3>35@CG>3@KG537D;34FYZ[D33;<453:53973333>3=3359:<<;63CL>4B53479955:3;FBC537EJ>3AF3F[S[F336A3483<3333>3<5336;8639=73=H?3@:3499657:B?:435EF@634GJA3;J73?I\]]@337=3:53333>378334:83 9<3334<734CCF7335;3333;6389337=349LI33=C34;3:73EHB53;ID;36FG736?C:3RbWV5337<3>33334>3;5336>439MJ336C;3<3:435CFD39EI>38EJ839CA:34SdfU339<3?3333;63?335>43:HF3=E;:;9<73;39HG735HH<3>GJ737?C?93>efb>38>43?433334>35<33>73?IG;<@BC?:43673<7?GG>3==3>LF638=D@@53J^^e635<53@533337=3<53;3 =GG=8336G>35:@C>63;3?H>3?MD434;?D@B93djjS35<43?433339<37;35A43EQG3;G;36?E>3853GHF3>JF4348@AEBB:3FjjX935<53@33337=53<3<;37934:GKC3AC438CD73693GHF38FL737>EADB@93WaoV36=835?33335;@634A43 4:;9679983NM;38G<34@G;3<37?H>3IN;36BFAE@=63Ioom:3:>737@G@GIFLFLKDF?>843333;@739>346538NN83AH53=G>=35DG7?GG>7<33@HC37CFBF@73fobL35;3;HH37E=3;GG37CFH<38HH95KN736ADEF?73Gbqp63=MS]\QUXRRKGE>?<<><@@GFMILJJD93533335=39<843B63BOL3F337FHC93DFBEK@3=AGGA938qssP3 8JR]]W[[TLMFB3 58>BKHKG?53:33335637>438=<66D33BKG3;I;3HF;3:GBD535CIRL536AFFD=3YspY3?Q]bbV][K=44AB=9?<6349DFKF@43<33337;34<;35;99;?=63>H83PQD3FJ435=6KC36FF=3 HN@BC=3DGG;3533qxx^39VjWff\K93:33@73:A@43>;3JLB3>E838;3=J:36EB?3<34VVF334A>>?ECJLFLFIF??9335VVE36F?34@433@L;3=F@43SLG;3;3 34z}rnoo[@3>3>634BA63:ED83<3333@EAHNPMGNINNINIOOJQMTODVRE35KG39?34GE36@F639UUHG73;33e_oZ837;7>34AB635DC937833334:FQRLHMKN@A=>=EHMQLVVOiiV@43GD3@:3DI63@F;3CXN?GA3:338kqE3=6<634CA53B<3<33336@HKHOM?845B73 7CB53;43333 5BEKFB8;D43=?3 :adh]UaaN:3EF43A;3ID3>E934AFPYL37EG;358386:@HSt{}nU[pmo3@C<63B3:@B@:5347;943333:CI>43EB3;E3^b^35ReccjhFEM=334A?336DB<43;G:35:@A@><;;<<>=943333743=EF73=I636D63[ba3 8OjjgbaM=34AB435IC3A?36EFC734baD8:=<=99ACMMKW^^SH63 7AFA>A~pt^D6QO39@IA93CG43468786533337<>=?<:;;:53=FA437D>3D;3QXZ73 B`]okhN5BD634NM38D938EBD637?[]SGILHLGMT_YZ]^UM837AEp}`4>FFZ>BMKD943:E;33338>:43543=G=3FG3@D3QffD3TolbjaF53GH43;A53 7@FC5=DFJddL87 9FYV^_a__I834mbr{n63 8Irv|_35DB734HB357633334<:3;G<3:G?37E93KffK3Baeing:3KP73?B3 6DE@=FF>85_`F3 7MUZPObb]LNKG<3_mj@= 953;~m:E<3@I6359:866:633336;538F<3GE63C@3C_\P35 :=AA~w{sN@853:G;39733335<434D?39JD343bjX3GaT[CNbfZ9FF<4?HQKP>36nn^4A;3 4xr>@BCC@835JC34:33336=3?B433AG>334DC3gjj93 6GE=DNDRxxvaT3KS835C9373EC3:433334=537C83 36JG8333L||dH3=TN8737B439IK43 ^z|h4=]om@3=BC<3M]S]=3Mw93: 4@447?43>FI73AK:3963333?63@<33ELD63>EB37onf<3FH>38KH83Jm~@3CZS39635@4337KH83 Y\}|i5gpaF3 :EC?9;==HbdZB34[3; 9<}38?438DJ;3>F93>3333:<35B4334BLI63DGA3TgsX@FD3=OO5348d| dB97HRH338735@57>CC?3 PoormfSssa37@GG@43?_cjH33W:3 79>C335>835DI?3AL<35<3333@63:>334GFL:4DJ?3PssiKI43?II7?DLJNKhthwoPZgh_GF<49;8:GB;6AC43 A`jjNt{{bl838=:46BAA43 :bf_L5yt_338BF3 :<6579::;:9GD?3?G;38933337>3<:33EMGA4BKC53=sqiN83LUWINIMGHDIf{|zi[gicUb^\RA65>936@=3 6kslB=xxQ36=<534@A@93 9Xfnju533;N35;DC<<;:<>AFPOA43CL<3:83333=:3>733?LMC7EFI73Xcle38A[XTB?73I|TcfLPaZffZhX<3:<3=C73 Qms\33o~r538?739C@=433>hkh33=M{{wk;><845;39NSG@5343@H;3:83333A73A533>HLL;CIIA<=CBHYijoMBCGJPWO<3Xv|f[334>S`cj`mdG@3>@3 Dxoa633z`5358?63 6?C?;33?n:338T343493 9GMDG=43373CM?3:33338C3C337JJMNIXUVOSNNQhkm^V[Z[W_[63b|J3 CU^oo^fLC>3 lxxL:=Qwh?7>B<53 8BA@96f35>?Y3573@K@;GC8383@J>39<3333:=3A33:KYWWQP[KAMNG\bgnUUTZ]ed[R?43?Z3;Tepqi_G3 UkicE@ME37@3333>;3@33 8BLHIINRNF8LMxrsW35Gaf[bbXcO=3Sw:38[rcmvY93 :xurH63Bd39>737l@69:8 :??d}z_95363:HF33AHB3>=96 4;=~p37::53:3GN<33CN;36HK53?93333D:3<5336EG@53>7HOM[ZWVQVzisb38FL3@R]jiccD33;pH3=Pcz}zU54Csrl;337xm{>an`38<3 |exwP5433f37;3;37HK43439;JZXS^bsrvnZZN3 9UkhsodoowP3 >;35S{}wdk{F3qXA4~^<::A923i=3Uw}a339W>534:3;39JR9339JA3@NK334KJC?>QYRkpkohZZ<3~qx::@[t;338=83933;{}|:33S>=B:37393TP93AL;38JI834C:3=3333B:37933DIJvm3 ^~<=G6f3>53yP3Xola33d338BA:38438@BNI34FH43KNC3:D535;3333D=3;433:D;36:3INE63 @lzvrk_NVZL;53 \|rtvj3=DHGE73CQ?@e53;8XuF337;3>h3;:33u3;BB<63;B?46QO43?J<3BNH43?C43>3333@A3;36D;379338JI?3Vw{wrnD\^X\WNICEA?Ue{}}pH34;889:>DF>43IS@3K37IO>34C>3<3333>B35:3B>3:633>NM53'7\ox[IVOXXPURKICdoroqox48=@GHKHHE43 iz}`437;TQ3;73C3Ersx33>|\3 48;?BCA?;63FVK3@G<3JOH3:D73:6333385?63 kaxs39:}m3<83V37C33YT35787>PO38NH3=HM<3DA3483:633335C=3 5=A<;;:98;935C735;3KR93OL;utI38?@JMIeebNPmrv|tm_G>;43?:3 7}@]W37R}Q3:<43`n3jX33v937CHX`YjfdfWbaZjdQD>53EH734OQJ38I838<>CBPCKEJDFA?963<53333EB345434:>=;;@BCBEHE@;736;3:5339MN3 5]]@:}n?37@HHQrVT[t39<3 K73kG3636>:37S:53Ltvr3337M]`ssboo^jhcfXb`\ha]PVTIKPA3COL>3C373333CD7BC836:3=OJ3eluf}}p{sU=3 6=433_334M3\{H3 7o3C733L3 ;WoyqxsoshnfROLBC==><_aTIROQQVV?734OVQ43!FFA35<3CND3Gb`37Jl{xf}}x}pnpU;33=933d{{g3mq935{3ZC3N33{I337Qql}}ixvWPC43 SZE336>CXYONB83DVSB3 5J>@EOOINIE>435936;@HDD73;63333BG635<3;FF?B<634>63GQB3Lcb[]oouyg}~uw qzT9>33n3}y3rC39f3gwuU33 6Ehnl}rQA43RaP3 AKJHNKC634KUY83 5NVQMOMA;43593573FN?3"=gosj\ooj~ND<4GuGHJSg| xeD3]3X3B_3}63lt3F zrq~\<3QbT3 =OG3>FNG?3BZZL34@TXTQM;3<3=CE93<53333DG7343 5:;9879;=?=83>A3336>C:36?73MS?3COftstjddS@9yC338koo3 6tL337v=352v73aT3Y3h tuL53KXP36JJ3>IMC7RJ67733@UTSXXB3<35?E<339833338EE398436=@:43C83337@@>83IO@3 ;XbVfqriM93 6E344338637<<:53;G>5:3333CE<3683 6?D?<>@>AF95334DD53 RUC36OS`bbZolU39l\393Yn=36V{a5PRY39373:=3JkkC3PcY3FL>3:HNYZS7XI53JB3<36>737EE433335FH73683 7=>?EC889CD@EA<73=<:?43 KOD>T]]V[B3fjS3 6oiquF37@83 8`fFK|:336633v}>33N3AD3Zh[3GVG36O_[Z=53JF38738;38G=338333=DE53:37>:5334A@43@935< @CC87?43:=3 TZTZQ]Y?433[`S35|X3o<39d:3sw33;3Sf3u3653]j]3@OG3G]_[Z@3ED3:639<73<8D9338333CIB43:434;:43A@3D5337@DI?3;<3P`[[YF53io\34^c3z>43v737H=43 ;u43I3Y]P3BZS3 74?Z]^[ZZ73IJ3:<7;<635>3:B433<3335BIE43;35<534C?B33;LF?533;;37`j]UB3ekZ3e63T`63~K3i43A3M~M3noW3>YS3 ?33:63336HFE534635:37FE33=>HXbU]U33CNVL<;3LI373<8334B7334;3336FJD83834;3>L533A936FD=336AQPX^S3395335=_sr3;<3}N3|33cj3ai3ak3Gg`C3 ;Rljfd]bRG535S]V35IB3673?63:@33<3337EHJ:353;435KA336A5334BF?3:MKSO`a389<93Sfe:37{Y43~33G3ZŰ3 n:3UsvOGQ\XkikqifdLC3K]]H339ND34:3@43@733=3335GJGB36934BH:333:C3AIAMOL:AZ[@:<=;::6SvxL83wO;33 Ĺ·a3E|53 r3?NShxess`ooftkC536SQWD6?I<34;43@439<335<3334@KKD93<3@D333>@3 CXOL939feD36NxwO3M `3p53373Jɢ3_kxJ3;Vlis~xgss[]NL[V3AVVOGLN937;53@34@33:7333?FLL@63<3>9F:33=>35FUV@3dfL3@fhX36Ĺ3 B333\ bW]3 u|E39Vvn}}oTFA63UfZ3OQL=QP?:434<;3A53733?3338IIJL@8368398EE33A?3 HLIME733S^X36}}q3gxnɿC3{I3373OɻĒȼk3px3?3AjmleU`irD3ZfU37LQPOI;@DA=:989;?=63A837AA53336=3334=LLGMF;43657885538535<;I83?3 ?LN;9KG33Ujg3t}|43Q Xbv3sP33:338Ğƽv3Q3c33AfiXB336{}p36_ZG3 ?QSR<3349;<:73>;3GMJ\abSf]jja\PPJB93843=5F?3?@3 33BF>3Jd`<3YinK343<¿UG4^Z33<3^ļ3N8:¾>33=ovueE3J}}c3@jjD3AY[C3;=389AA9A=538;3335AEMMHNNHF??;8:9;EFDGILSZZR]]TbVf_jj`noo`sgmfZN83738EI3@C336EMD36KI4HB4lo\3?w3>z3ijƫY8md ʱB734O3G6333V\53Az3gnX35NRJNN834C8:>534<>35=4333'5=@KNFNNIVOIQQMUVVPZZOWQJIGBAHGFLRTRglo`sbxh}bqWD37=I;3>F49FM835KI5T`h:3hnyK3:3 H3 k`3=33;vs?3^_3539<333 58=@GEGBGFC@::635;KSZ]xf}vw]N43;MA38E9HM?3?KBJssO3ah3\h3ħdzļ A3Ht33n33TM33 7KED:B<976433458=C=8333;36FWh{}veA3LK93FQL;3BL?TlxE3np_3pi33zjEsp ɭr73h^3@Ƚ337O37xO3@osY3>YZ<34HNHD53 ;@C>5;=>@C@@?>=99:333735Lf~oirG3GC6@4]3 dBð}Q3I33ƹz335x83aro43fsb>35ZVH3>MME;3=I3433;5333;34T}`I3M H33HXK<;;73GM;qkh>3:N3}B~w37[3C<<433;6333:36863K~t_;36NG39KNH639HL<|}y73?\3w3f3w3d 33ú}?35Ƽ33:S3=85693Mxxs^4337HA3=FAEA3LN<_isb3r}>3<3<B33t3P83Ņÿb6O33334;3:?63LtJ3;NC3DK6GE3BHB?;3Cxx3`3333TH5@3ǁ39Y3O~d3Y~hk43OffH3;@JEJFJDBC@DCEGB?83833;63334;3<;35[[;IA3CE3?H;3>NL3i`3gM37ȷm33MB36x3H U5[{[36f38{v93;I3SjZR3 7=>DDCGBD><83963389333=3:35`r}TC3JF3:H?36JG6Bi|N39{A3 \Ċ335x333t{R35g<Z3Iž>3443nR3fum3Rgj_4397335;333=436=3Sx\4F@33GI3N>3d~63\434}3x<3]ABb3yDR3Ⱦ3t43\~z3Tj@3Zob]8387335;333893>437h|_LA33EG73HNA39sn3sh38p3B38y43õvKKFǽV3Z63Bz>39`336;3NlL33?I>3 BKG33LyU3;g353 fC3p<43Gge]=u3CC39X34zu}~63Hnsh]93>33:7333;83;53Bq}_3433>3336@3<34j}\9FC3=IH3;w73_B3?yd3X4:ǗfǨ38Bg3x:3M|i37]gxxiR36;334>333<3<3P}LI3?QQ63Gp3|F3LmV33G;vĿj}Ň `3634iA3?q739Tw}wmoB3>533>43334@735:3T}J3=QQ83m}g36=3< ĤT33]Aǽp }è7 3VɷD33zM38?3>\n}|O634>433:73336B835;3; \xvC3;MN837tY3<E3< H38Mr }†±ǮY38ɿA9q333nX3;{\3 6Enpkg>3=9335;53338B:35:34 YXgn?3>VV<333335>D:3>3 B]]Bkz?3BZY=3\uZ3Vd3x ɴiA̜H3b CUʍĉ38Uauu{xvYA3333:EA93>43 5SYMC_?3CZZ=3_n3 Zu43iV ~r\Ū%ĘiRůvmR533334@CC=43;93 3SbZG:qy93CRP93c{r3\~N} ƙ}ǻ̾ˣsG3<"ʼɸĻgfK433336=FD@<53 9:BD?@??99433AYZKD;v63N]]73Us>3JZ9ċǥęC3:̲ ?334ɺfKC33334<@HE?A?ABCHGKGLPLKKMHMFKCA;33\f^BEMt433R]]439dI3OĻ;38tˑA38{ yB3JK<83[m3333477236?AG?ABFKHNHNNHG;433 Ef\NJLI}33STP3493`~^536uɽs334Ig3K=K=3Bv{^33334:434543@63 6eoG3ÓwX ĩ:35433334;3=>38BHQQLQ@33NblZG43P;3Oerv^?3?3 4Mȏ aYƴn=373Uj43~˵ÝgOq }D34=EQ[Timr`ss^ni^[XO@;33332343=35@<35AJUVNO:336glgL>33Z73Cn435;D78YƷW4338|?7̵=3CX"J̫S3̽tBbġm4Aw’`WJ=3 9NUtl}}jxdss`oodj\fbKE73333834737937A<35DSPZZC433FTbgjG=33Q43W 538:IsŘ=3A{eznjN3f`Ḃ438ƒfwmA3 I|hYWVQCFGI7AKQQ_nlyij}}pxgssboocjjcffb]baME633334973?38A=34OZUYW<33>MMZkkcE?433; w6:3s uY43\Ƿy3gʀb̊43TNJxǛI335c tk}uhWRN>=>::>>?HJQ^[bbX]]UL<33332:83@39AA53?R]]SJ33DM adkqA@83Q33O D4I h9336S̷73g\1̊43ƹkV33ClB7Tuv zwm`S@43 5?MO]]QZZH=333353B37@D;38SZ[bV737AI^xp39i3e̛ȟ3]53876:?G<348?@GCHDIDIEJFKbgg_J733@N_B3Hcī3X%̵3iĢl937FNMB43333?3 8>@ACC<677@437@436@<43F>435::>=A?A>>?]agm@33 @Ukj3Bqmu3!E3OjuC334EHNH433338;3 5A:337A33;>534@::9835eookB338mic435?AN]|`3G̶n3 7ődG:4333>NHE43333@3=<7C43=;3>53?ln_sM333^wmlPOn43 BYWxďR3X̓_~3ZU=3;LNC3333B3EH43<936=3DXsR73GixtaH?7j~|]F39Sm~J3X̓_~3Ęv_?3=KIB3333B3:C<>7::3A37:39x|dkEmd@3:feL73>bJ3X̓_~3b>3;ML9334333C36?C=434B=3A38<83=ibz{xP63d}LAh=9S`W:3LsS3X̔`~3pT53AIK6337;:9;=8333B3>C:3A@3A34;634dxxnxuH34`}}j3ii334Rn}n`laWJdlu~`3G̷m3 7ǑkgYmyQ43GLA338=4333B37B<37<>53@36:43Usi}E3?SYL5Fp<3>3JD33;4333<38B635>44>3:936<34Vx3363u} P3qU>3A{R3=VolI3:BQ3 4̻ǙpS43<[n93:739HE3367333@83>93<933:737=3:9339}_4 nZR33>t{Q3 4DI\htl{ y~Z__3i̱̐3Z jxyc53?[ya43:63CK=33;3337A3:>3A7337:3>634?336|}ZX rZZ=]r>3>434l9A3O5O{r73 IwO3;438FD3385333@93@534?5334943:39:33l}G FRbv`?334:3EK733683335B5383:;35?3;@>37=3>533@|}e7;ryo;35Or̸83da5̇43ǸN433;bR37WU3863:G?334;333:@5393=63 6@433<@?5535=53@33<6Bo}}{[4Smxm:3BYǵ~{3dʄḟ43V~ţF34Sw937i}rq734;34JC33<333:@43;335=3 6B53;8965<<536>536>334nuG39@433v]35I]shǕO3ddF˃439Ǖ^|v639ww\37oA3;43BJ433=3339A837:39<3@7<:37?9338=638=37;X}O3Qyz]B@435GS_k±Oe̵=3AÒ\'N̨Q34̻N>yS3 @iw53OzoN3873=F8334=3336@;438==:34EA734=<<=63:>3 6:CDQUTZR]VbbWgyzJ83zzzj|xp H:rĒ73Rg43~5Dqz63B=338@OWY[N^ZUTzxV36:37I>336;3334;>9438I@6537DA?=?@A@<7378357;@=6=<3 AJMINJMEE?<953Qyy}lbokmsN3 Gq{saY<3B|xǽ̬C3 6̫Ǣs’I33Ue3 5Pruƿt\YB3>43FD33>63336;>?7=@=366345543@CA4<<@B?<7334?83>FOQKC>638cxxq88GQowT35e^T7H[]o|o |ymC83DqĹh<k3MOs434f^q]U=3:93@C334?333498@7673499C:A<;638@439IILCF35fs`rC3hrR833bjj536ko85h̔C38~ xHmė 833DɢunzQD35>3?D33:<3335@5@C;<@C8C83><3CGL?54E73\ssI3Q{vsz]ikj>3KuW533ćǟŜF3;̱BNyD4Nǽe8535?=Nx{yzWF3?73?G33?6333459:636C:;=;;<86439>:37@43 59=@??><97436FHE63A;3Obms]3oBP|z~~`Q;34=QxP3 ÛǼ̿vJ3?mƠǟzǕĭ>5~ȽzbJ6hj3 6rnoCAXosqg}tW839<3>B33:?3335:>@CLCAA;>735:3 @7334>;96438?68=BBN=737@438B@8C>84359;539EI73:C43A`ooe73=g437P\z^J3gzL̙F3u fQĬE{úv3QF35833:v}pW3=Xhy}}gxXM43@73A?33=?3337=;63;935=MDB73B93@CC;73834=937FG535G:3Ahh^g93~P3 Juzw~ma?3MĉLďǥY3ǍfWƯ ĕ^8Pg43`<3 7:33ClswP:853 6OlixxpmskF43><3B<33:B5333;535?53CKD?53;A3:>>CC93593:=34FF53@A3;cjjb733Gp3Cbb]4EMfvkzs[O:3<sM[Ɩ35c\fe;333:63Essn3434r:= ǺŬV3BĪɷñZ37~43tV3793[hi`37<434?^scoN:38@38F5335B=3334<536>43;HKG=;:9AC889;=AA;739@3=633783:3;E93F?3;cffU;335yG3?s3rGĵHlĝǭu|^Ǫô{BYR35lg38yB3=34fssG34<43>QnodfhF36A3;@335B@3334<43?834@BE557:HC;:8653@;3>?<963>534C?33=E43 4CB33>abbO733A{53@x93_B<CLj]Ǥ ÿW3Kx=3gj3XqZ3LooP38;3>bjYf^>38F35D6336CB53336:38>43:GC933=D839C63583>34F;3x;3K3}5ėI3 ȕE3[3_y^3m|>34go]73=635JfXM738C3<@33:FA6333>43@838GH633@C73C3CT]]ZI43=wD3;xwt=3O ?3n@D6r`3DaWbb]E539C3C8336@H>43335<39?3;DG635CB73=D838636:33D:3>W]Z]G3 }L6643Dtsq;3n73]P3Y>XĵyQE6Ya3m@3Y=3RxpE3_je3>53 5HabT][E533?C3:@335AEF:333;73@73@HB435EC93=E<3693 :C@EM@@>:637HOZ[WG35l~{ycFCDFB@>843G};3OȽo43? n37ġ4FQ{NH3] 3]{?3463iv=3eo3G]ZB39;3 8MV]]SYM:@=34A739BFH>5333>35A3AID335DF;3;F@533<3 :A@93=>335883H}:38ĻP33=33zV3ML gKƭT3 33IȤ3?q3p43A@3afU34@3 8JPZZRVXH=53<37@DJEB5333>3:<3 5FD>336@F>437EC;4<34A93;33C8349>:437@QQKVN934DI53?63Y53Ge4334533Q33aGEqK3534r3o437yJ39;39`bB3=9368537HSLQKOOINJJHBC@H@ DFKJJIHB:3333=3C3@DI73=CH?73537AHJC:433?4335339A3 6?FHNPQNA:3 9HJCOt|sjZI39?8]3 DƸo?36<33b3ac38;3Oudz_36|`3@73gS3[bM3:<3 6<<86558::63B@3:>GMHNHNNINMNHMILLHF=93333=3E3EJE83 7DEPLF@>>?@?:438?LFGEF;63< 469@BLNJNHNIC>3 HJJYzwXNO<35>`}3 :eŶ¯Y39>334>3\~?3Vǿ=3>ſ>3B;3NZ3Fmko3GVT3:>3;939<537H<3 6::?AAJCD?B>;73333973D35BJI73?FGHID>6334:?;434A?ILJFJEGCFJMGMHMJMNED;634==34JLbqtG8VU43ACDE3 ?|©638z93eQ3WœN3 Ç<33AJ3RzC3lyl3lzH3n}}A3>]]53:A3;534::33>D534:=53333>3349953D35HGH;6@533;AIHHG@<759=73:?8?AHEKFLLMGLEEA9634>=3? Upttl{B3;KI34J\XA3 ;^žf3?A343JƸĿM3 <IHHJFKEHIG@?A>CD@<76657@835>;339EJ^m|z_j733AQF3=wzf43>Yu93H;3hN3O¿83SR33?y=Dx3FpK3;hol3TZB3;>373 9@LM?9;<;:;;753333D93<935FNLD438@FEKEKHOPGLIPMFNNHJE:?63 7@=DF\s{o}sU3@J?3 7@@GJLCD@<45y}~a3:Zlncf3N63r3GȮ3]33lti{tC3az{43gxx93MTA3=<34=53EL43333<7<37?38DLGJ<34368>>DJIIGMMGMMHNLKPG:4349@JNR_{}bmKI93 FO?@P\g_xxg}d3M\9f3 4J33=[q38P3TuhE3HVE3B;3933:JE;3333:435:3C3 :3=ILJF9373<359@DJNINONROF=;::99<=>DEDHNerun}lK35HF87F Tdlkjssbxxo}i8c{K3dsywyK73435kc3s3fv33_u3 <Ƿk33Q3S73`pe3:os[3FVG334H735ID5@7333356383<;3 54338HFMMA;34=937=JNLNMJME@DBCFA@@;CZptqwb}|]93@XYijbgmodssdxxvy}}m4eH3bqxwrXG43 SfIQ3HI38zƷI33{s3 N533B334OL39pH3lsg3@MC33LIKQA837?536GLNIOOD<3IissavqtsV<333=KC3@83333536?3 289@LQFNE:3<3 ;6;LONKQK9FXjasips`=35FOab^afe`aXS<36t~z^<=>=63 a435J33M û335?3xĸ:33WT3IC3 ;ykj833Noo;3FTY_dknoiksL@A9HT]]VbaSN>7FR:3;q|^3xL3O33a{o338343353?v93 _}}O33HooA3=OE3@G3:EK935E433336=631<9@IFPNHNNDD=7533<=3 :9HPX_hhkgn]lZA34HYZP]]MG636QWM63FRWD3 4aZ63 ^3jA=ÉE33Wz38ƴ733_A34@3 G}}f33=__C3<3333983 49DLHOOHQQKVYQZW]]Tbb`\dfXjid]EFV@=LC37MJMJM?53H}E3CJ3[~\n433F3AýE33zm3:o=3WxxG34ebI3?H@H>3@GLB3;?33334<636=DEPQJVXQZZYU]]QbWb\OC83SVOFLKNNJONEJEA76734VS:B73 3FM439DOIQE@43P>3:335Idt xm3373 H3@ž33^o3t33HC3^ra836dic33_fP3CQI83>MME<38F43333?635@93:3SVM:D8333493CV>:D9338L?37CRNZU]\RRGFZ}|}434CJPjwvowS637s|L33;3`73 Ŷi343iG3pj3 9xoi7HZ3Zka43UbP3LLKN@637F633339>3@>3:38A?733BB833;B7334JD3:AJEE;7=>37\xwiebYhl^gdXZRB;<3L34=3;3Ko3J\43x{sD33E}zu3RniN3 c}ra8AfoonYW]F3>JHHK335CKA73 9;3385oxvT3<936?<=43 Uv@5335;373 =u43`C3Gzpxv3 ?}}e5<>GOzxzsonq\]ooZji^ee]bb[]]QZZMUN?:3C?33338?3BC6353GML;33FE33?K893 A33783gd`F63A3A@3R|3>3`3u`33I3l [~:38BrtkjjbmoumyponoXWoo^if_eeYab\\[LME9436H=3333?836BC43GQQ=36C@33AK73<634;3;s<4>53979<3Fyte3?3Ay3753`3 O5MohS:AG\bW}~vjjhiooZ}yonmTNb^YWZQOKCOP>63G=34?I9KG3>33:53Hssn34=6;36:6339;38=>Gz36;3j3m|W34j38,D33J^||ttkgd]|~yeb\Y\X>q~}qoolfJBOJOG>36FB3@E33334C3@E=3HKN73AD83:IEJ99A?:53<33=33Ja`W3379D47:;93;736=933Hu38:3]a3I3U=3E|;335r{wzytyyvxzntrc953 Cxxooi^WKQH?43AJ635IB33336@34?F>3LOL48FD3CFI=43;KA3 ;37933\ooR3@F<953=3:93Brm]37;37X3oK3~b3]$34AvusQdgrzjwxf{oo^dY\_Vsvtkb`[UF<3:J<3=E933337?35BCA35OOL3>D>38GEC534EF53 93:635mooA38:<367:83Ih34?3}~O3^~p3D|=3o#jITsvpHC639DWe^woobj]ffXhmsj[YE535GB3FH33337?34DE@537JLG6GF43]ai43;33:3=?93T]3A3 Oi93C43Bz3 hTjk`3bi_ORPVMSPEEcyvhS63BE53>EB3=CE5333AH:373?43QjjO3=38535:?83RliJ3?533yB63lJ3 Lf3pI3 4fn|}f3moY3357;??AFTmkfTB=:533994D93DI533334D34ACF93CNN>HF6343djjC3;35<53;83c}}D3 7>3KCE3`re3 5~738z736 HP~}Y35dhP=AB@?>;::34<439;433ig_3 =[73J3?s?3Au3myH338_msO3HIIH43@KB33338=3 8AHHA83E@338>aff=3@3<436=;@wx`3 8>5{^33E3;pI36~t:36}q<3CMGF434_34=L[Z53EYrtW39EE93:JE533334?53 4ACHH8DOQ@753@B533@CA33FYW[3?43936NyyU=>>=93Dm}833=pso35hQ3jC3@u3EGM?33:9334=8Vf^3BMGfm`3?<36EL<3333;:37DD9WWUH?38C9333]he93ku^3 <335n|~Z3Isb3Sz`34AMJ9333>=3=63YdP3;HH7lpk3GA3FL@33335>535HVWOHH43@>338CF]b^639=3983ksh37@7363[Z3?tk43Y|X3DKG933Gp[83:b\=37HK63cmg73?H3DFJ53333:<3PVRIHH539E4334P\ZP34B3=34dl]3Pj5=3mrs;ekb34l<34onE3>GK733Si`^?Ib`43 7IJ733NilB3:D634BMK63333>:39QWRHHE373A<338\]]QG<843?93?3AonG3nsG3:833ohR34goE36shG38LJ833dog3Bwv^TK38KF:3GljM37H:34GME:33336?73 AERJHE67HB46B533FS]G9IBABC>=;>G=?@??E;9634EooB3< j334<33`o[3_F35vn?3@=335_cU3mxN3;JF83;gfN3D;37HIL:33338?63 7MUG56338GDH@>33 :ZZM43=D848:9D<4337:368:;989;<<:Kcf<3VQ3<63\qK3^tvX3:uoyzJ3?IH?33Fjj?3LV433?HE53bfY3D<3;INH83333;?53AQVI434BIKC33IZZ@3=D<38C4335:343Njh993Z938347:<9436CNHH73333=>639NSJ<3;QK?33?VMK3334;3Njj3537zqa3Ggix~735]mx}R3 5;BgnjnaLGKK8IKI335bZK3 4:33Gv~~hP3X_W53A<335:9636<=853>MGNF43333=?:3DSUD36HEJD4334RVT739DE635F833=3G[\3HK33?WrpemfgfH<<=3<433MVZkxY43P^Z:3B<4;:4368983:KINM<3333<>?63>NNI838?:IFC33FKQA3 6CI>433:F63=3Jfe3Y:>Xondn]=63=IMOJE633334537=@<636IRQA37=38IKB33GF>33>E6693B[Z43-Xhot_j\lkTG@;5txo4OissYA>B@?<8866556:;ABGCG?;43 6bshkhA3AJJA435633Fbb@3=3LQB>D:5Rztj]I7HWPC3E@437EJQQHL<333359>??@B@@A<;634CADDBFCFFDH@?943H\oo]I3>J834833O_Z3 5>433>JM=C934Outwkcc^N35I73 6<:755779=?BC?<45;B?A:63AJOIA35<3>KK;33IOM937DFLEII;:39bb>7DNW||nWP93 :93I{soh>3 4688;9;86;3 4R^ijW:3GKD36733;a_?33:<37NO?C93(:a}hgqnopoiSSNLK?=<>?>DEHPPW]SZZNVP<433339>;639>DA>45:B@C?=87443AKF>?934>3CEK933AHMA3 6@IIRTPB>985459<[_]ZW]Z{|zP436DR]}~rR53 49358=KWnwvhjlglsxesp_koajjbff_bb[]]UYWD<33336=:435?AD:349?ACBDBDAC@C@B@=<75357:;=MPL=7433=NNA38AGWRRHNHNIOJQLceaZPQXojf53BSZeffuqD3#>MHOQHOJNNHNINNHI?<4335HdhW]QKF33?333?ZYD3CNH@=3$;ADFA;749H[focikudqn^moajjddfe[baSRG:33339<638BB@37FG?93?N=HVXYU`aYhh[b_YQQL@>63333:<43?BB6346677::?BCFCLTHLGC34;:7893>LL<48 >C<6339MNG439CKFC:53DZT3axw`:DHYZW]SXJ933U]c93 7H\R^_[XRE@;?:346H96OO@?CH<3333;<36334<3CFL73 36A@;434;@JGKC=38KU][WVLYZO@96433@IK78B;>FGHG<43 BM83GNE:>BA;433337>39FD73@IH=3G6FE=::=3;537LMG33;GOMH434<@JGMH[\RHRijlYJLD;4393YfJ35Eab^Z]O;3<535=43 9CIIC83ENGRXS]TXGNINHSWVIMOMKGG=93@H539JOD>939?;6345763333@43:CF:36FHD:33@G C6GGCHKA;435;3@H879439OSM93 5;=F?3;QTHFAGDMQXOKCEI?953DM533HRJ=37:><:7789;<:889<<433339;3;EB93>HDD634AGGB549>AKBFFA@6339634FM MK<3EE@E>63;NL4@ehl>3;73 4OefeR5Uff[M83 899::<=89==9439EJBIH3>PQC336@LG?36=3@I3?53OfU9e]@3;53349?<34?IOE5DLE<=@GLA73:93@I433=PNG3D:33334?3 =7AGE:37=EEF>43 9FMB>8556B937>DDAA6;53KMMM>35=FCD<8435CMJ;o53A35ef:>35<39@=63NMAJPA83<636E9GK<3>33338;3@G6?FA=3@RJ3B35353=fB3<63:AA=83DPRQXID@7<3>3 4DLJ;>=3DNJ3<358776543333;83EG:6834KC=3;93 4:BMMML637;BCHCHDIDIEJFHF?>8537@=53EX@]bhBC:3=737f;37;3 6=CDBADEDKV]`B83873=3ALN<835GJ@3:35;>@=<<=>=963333=53AG73>EF:3@3 6?DJGMJ5EMMK;4368=>DBHDJFJJHKFKDA93:<3 >[Bfjj74;B535A337Rd9UfZ34?3 479:<3FLP?733>ML53:37=C>:6347;<736533333@36EGG=387BC63B3ETQNI73684AK534 8:AEGKFLLEB83:834UNbjj<334?833?63IVffU6Wf[83>4346;MRFF;3853<3 BLLNM=KC:3BIG3735>A?5349;53593333@358753:9FE3?3:HGMWH:33:MMD3 49>IILLEG;;83NKTY^93=5;<8WbYdfR336OK3=739KL9=F63493:43439I9FLM=?KGKD>KK?39D@834;<53:33336=3=G?375:EB3@3 5AJLGECC@8333DIG;36BKGQNF=3BI]efB3D;AS^bbO<38bfd83;93:SQ33AD3;3763:3=ELA35:386:FGKGJL=395436;>73333?43@C9363>C=3@3 :JKFG83=5AB5334HLI3DKGMMD=35@L]]S]?3WffL3;<3:PF336C;3;34:3:3=KJ<3 ;368337CINPI:3>E;347<<=:533337;35FE3@E=13?34DKEI;3;37?A53;KE=3>LLINI63:;3O]YI36>@9RV[]K43;\Va:3;=3AVD333=A3;3:34<3@KE93:34:38BOTL;3?D:33335=39C>3>A7689:;:435;337FGK?5368337@>3ALJ434>MNGMC43?539cf_<949QZ]NA3LbbX3;3DQ:3334D833=363:533AFF63;33;3438FJF:3;39A;36LH<3 6DJNND:34?3 ]ba63;TNXR735\`T@3<:3GS7333>?33=3473=3:3OQ337C33>393>8JE53<3;434CSIG834EE3333>E;3CE63=3;NKB34>35KJ935DNNMH43C]^YVMQB3M]]J3C836MI33 A66;347986893AHD63<34=3733BLMGC63BD833334B@3?A53697GHC638?73@HE3@QNOJ6335]YXZW<34RPZE36A43=QG33>99>=;7667<>:<953ME837834>3:3CEFEI@937>?3333;D;3AD; <=>H6GF>3:533>?38KK53289;633BFF?33336E?3@F633<537==ON636938;><75336F=35:BCHE@8F53333>A834@D83?NB35433>:3?JB345NO\UM3@E:3@VVO63:C43?CFC33=D937;A==>;3>F=383 9456533:F736988F533338C=35;B937FK53633:@39FC3>OU]U?3DD53EQMN83A=38D8@A3333334C?38C<3?HB4335?63J43?OP]UH35H?3?QQI83;B63@?3@D334E?34;3=3:G?5833=83CD739OQLQ:3:H734323@JMN=35D>3B83@C43@D63:33;3BI;3FO=STH33AA3 5233564:MOIC43CA53 8A8336E6333?@>634<38CB:>634D93@E43333G634:?>93;A39D<3333C631933=7333933669534BJLNC63;D?37A;3B@8B?45<36<63DB39>;34B73AF433334=B73 >?33CC3346339;338E=36DOOG3EPVWN48E3498633G7:87GMINEIA39@93=MD<39834H837?43<=36BA33338?@53 :B88F:3362334=537HA3INHI4363;?839?EL;33<3>D434>37@3;A:33336=?;43>@;B533433:<36E?3?NNK53=5335:=ED@9=?33:73<;C34;3@43@B633334;@@AA?<836=A;53;?EC3346C<;KB3;LGN938YZVCC323<73!6DLD55=EFLGLGIBB>BDA=?CCHEC?6335D66:3<6:?3:3>734AA433334=>737<@=:75357:>>;43@J=3 58=ACABHANLD@93734KNN;3?VUVL539<63>DG?==539=DCKGNLMFJFFG@>73>A;34<63:>3483=835AA433336>43 5:<=??>?=;8536JB36;?=96337?D9353?GNE3?YYU?3!27743:234=EFG9335=><8878;=;:8:895436F:39=633:>3<936@A433334<35IB73;>:43CL:3>B43:37MNF53DTYT:34;?IFI>5357886439:6B7348>;39?3<834>B63333;36B@>536?;433@<537B3<73357=E?8753?B;C:36A38937MGE3JWWN43D@;73A53<537A>53333538D45><3 59D;4337;36>83DMM733;3 5;=>>;:??534 8G?@A<436EIF3=8KSQL>339:44EKFJ=33>EE637>34<35=@;633334?533859?>6<>?:734>?5336AD8;C7357:=3?MM73>49LQQ;5GKKI7FKB5334<73>63:7359==633337833:5?>893?5338DKC3;3DMH3?33FIF4CKG7;338C38<3<37=;43333=CC?377?3=>7337RB3:37LG<37;336KL>HK433<>3>63738=43333C457BD:393?LL43;53DLCEKI33<:34=434:34<53333 @CCB:BA67434@?336C;4F634393CFB3<36HK@K<33=837=373;434<73333 8B8>>68=MCG73@533A@339C35764634LL<3;63EKB7@A933>636<43934;539<53333:A?43 ?>GB9387;:33635;63:35<535<<73333:@>35E>94?BB=339A:37@393553AKC35;34JK:KK:33=637:9537954:35<:34:>?>=;83333489;?=>?=>=;::@=3D>36B4338@<3B3589976643FK@3693@F>DG933<7358<<;4348<<98979<532?93353EG934:53;JGIK933;834<;36733334B:@?A=:43 =435=?9393 5?>>53328434KK63;35FDHK;33:737<3:33339D@839A4335;?A=:433<:3FG533;?A635D834@8349@A=83;;3;;<=855>@8359>@;536;<;363939JH3853@EHJ?33;53<3333AB53;<34:B@5EH=433478<=EGD=;7336B<3437537EC3;3637?FIB=3;>833;D3:3:JD3:39EEJG334;343333=B39=34BDKBA3<>633I63;39ID3837ICDE435:>=94338633337E43>83ACMC?543=433:F3;38HC38;;>B;<836FADI:34:936>=534;3333F635@37AMF6@@634>;33H73>37IE3:33434HE;D>3534>93953333>?39:3 :>534FE35835FB6IG39>9688733337D3:73 4?A55B536?>@63;33A>3?3H3:436HA3@D9368BA33334E53;53=@933?;3:A>934=533E834?3AF53636D>3:HB3:933335B63<435>?38D435?>:3<833H53:3@H839G=33AF63=3333<@53<3=A63B<34=A937=33I3B43:E<39C833;G=3=33334@73=536>=36E634;@93?635G39?37G>3>F63AG73<433335=3<53;A7383<835H34D43D34@B39C?3:533334=3:73?<3@A3<=633::35H3C93@C5373FB3@F83575@93333937;36@:3B@3><338<3J634C>3:F;3:6D:35BE539?B?<;<34B@39:D73:C@38@;43>53349>B:3333643>63<33C;35@H:3@G6334?93 5BE:434=9873<939AH@535C?3=C;3837>53 49=@DMPNIMPOM?<:73 DI>:>BIG>53?C63BF637>4FIA3:D939AD435938AB7393A3<33334@:3<9334<935>C=5373?5363333;A93?9335633>B438O53A=35B?3 :D63?<437AA<536798B87437>393333 8>G>::633<@36O73@A36D>36D933@;383363@4383333?637A38O838G36C=3A=3>36??432936=3633334B73B37O934H535B>53?>433=63;@53533<93333A73:834O;3E834@?8363639=4338:43333@8334;3O>3@=34:?>834=?45;=43;339763333@<33773K@3?>348>A=97648?>9=<63>533333;?338634IC3?=3 479:>CC<8637:333337B336638BF53A;348==73=33333B73393213@;=?3D7348:<953:533M3fM3fM3Mf@3Yf3Yf@3@ff3f33@ff333 =>339289766436E43E53F36=<85387333f33@̙f333@Y3Y3 MM3̙3f33MM3335E538?53A<68?D737B3:<43693MY33f33@s3@3sf33Ms33@3YM33333̙3@3Mf3̙3@f33@3Mf333?9793:J<:7 8FTLMKFEECKB5349;<<:9523=93f̲f33Y̥@33MM̚F3@M3 f3f@3f3sM3fM̲@3M噙f3 f3Y̲s3Y3̙33̙333f3f33̙33@3̙s33M3MM3f33 @33s̍33@M3 f3MM̲@3M̿Y3335J734839K633ELH=AGB8;=:@@838>=84325963;83f3Yf@3f̀s٩333̲3333ff3fـfٿ3M噙f3 M3Yf3M333f33Y3̍33̲ff3ٍ3fY3fYf33sf3ٍ3 sٿ333̲3fـfٿ33YfY3337:C4493:F:33:@739>JH3;9C==43736<33@33ٍ3f3f@333MM3Y333s333f3f3s333s333@33f33f3̙33s3f3̙3ٙ3fs3f33f3@3f3s33@Y333MM3f3s333333453?A393;E:33F73 9JF?833:F>363=3f3f33f3 5f3@33333f33f3f3f333f3f33s3f33f3̙3@3f3̙3̙3f3f33f@3f3f3 ̙3@333f3f33̵33343B?5;3?D838D3=:49C@53>343=3f3f33f3 9f33@s3333f33f3f3f333s3333f33f3̙3f33̙3̙3f3f33@33f3 ̙33@s33f3f33333 A@58:74458>A>3=34E439C6A34;3MM333f3UM33M333MM333f3f3f333 M3Yf3M33̍3̙33Y3f3@Y33@3̙3̙3f3f3333@MM333M3f3f33倰333 >E6369;;96443@83:?36@A3593̿33@3@3Yf3f@3333333̲@@f3f3f333 f3Y̲f3Y3Y3@3YY333333Y33@3Mf3̙3̙3f3f33@33@3 Mf3̲33@33f3 f33M33Ms3338E73423B63>835L23:3@3333f@3@3333@f3f3f33@̙3@s3@333@Y33YY3 YM3̙3̙3f3f33Y3YM3Mf3@3f3f33335D63B3A43A>3:3Yf@3Mf@3f3hb33MM3f@3@̙f3Mf@3Yf3YfY3Mff3Mf3Mff3Yf33@ff3335C43B43A37@5373f5?3MY3fsٿ3fM33MY3336A43>53A35>93Y?433f333336@73;83@3<=36<;33333;=835737<3>36>3:7333336::97533>3<53A35333333=53693:843f33f3MY3M̲s3M̲M3Y̥@3s̍3Y3̀3̿s3@̲Y3s̲f3f33M3f3f3M̲@3M33@33f3YM3335;32=39377333f33s33M@3sfM33Mf3ssf٥3̲f@3fs3fss3 ٲfM33fs333f3̙3333fM333333̙333:5378383345543YfM3Mf@3Mf@3Yf3f3@fM33 s33MfM3Y3@3ٍ3333333MM33̙3@3s33MM333333s33̙3Yf33Mf@3Yf3f3̙3Yf3Yf3Yff3Yf3f33f3f̲33@3Mff@333YfM3Mf@3̙3MfY3fY3@ff333<3:43743@3333ff3@s33̙333@ f3f3f3 @333ٙ33ـ33@M3s33̙3s33s3@@33s3333̙33Mf33Y33̿@3f3-̙33Mf33̙333@f33Y33̿@3M33ff@3̙3333̙333Y33@33Y3f33f33 M333334;3:4373̿33@3@3Yf3fs333333ff333̲33@f3f33333s33f333YY33f33f3̙33̍333f3̙3f33f̀@3̙33̲33@3f33̲33M3@3f33̲33@3ff333̲33@f33M3 33M3@3ٲ@M3f3̙3f33M333ff33Y33̲33YY3f33̲33̙3@3333@3fM3fY3333fM3339738733163MM333f3 @Y3YM33333MM333f3f3f333f3f33@ٿ3f33f3 ̙33ff33f3Y333f3̙3f33Y3̙3MM33333̙3̙3f3MM3333MM3f3Mf33̙3̙3@̙ٲ3f3f3f33@f333Y33M@3̙3333̙33@33f3f33f33f333 47853357353f3f33f3 f33٥3ٙ3333f33f3f3f333f3f33@@3f33f3̙3MY3f333f3̙3f333Yٲ3̙3f3̙3333̙3̙3f3̙3f3̙333f3 f33̙33̙3̙33@ٲf3f33f333̥33333f3333̙3f3fY3f3f33f3332553f3f33f3 f33YM3333f33f3f3f333s33f333@@3s33M@33f333MM333f33s3̙3f3̙3333̙3̙3f3̙3f3̙333f3 f3@3333̙3̙3̙33@3f33f3 3Mf33f33333f3333̙3f3@3f3f3̙3f3333@33ٍ3f3s33333s33@f3f3f333 @333@ٿ@33 3333MM3@3f@3s3 MM333333Mf33 ٙ33s33@Y3333̙3̙3f3 ̙33s33@Y33 33s33@f3333̙3̙33M3f333f3f3333Y333@3333̙33@33ٲ3f3f33@33f333f3Yf@3ff3f3333f3f3f33fff3 s33MfM3Y33Yf@33sfٲ33ff3Yf33fs33@ٲfY33f3MsfM33sٿ33333̙3̙3f3 ̙33sٿ33333f3Yf33̙3̙3Yffٲ3f33 33f33333Y3 3ff3333ssMYf3M3f3 f3@sf33f333s̥f33Y̥@33f̿s33f3f3f@f3M3M3ss3s33M@33Y̥@3s̍3@̿s3Mf3̿s3@̲Y3̲f3M̲Y3s̍3f3f33f3f3M3f3s̍3f3f3f@f33s̿f33f3f3Y̥M3@Y3M33 f33Y̍Y33f3f3YY3f3f̿@3f3f3 M3Y̲3M3M3 M33@̥Y33M333f33M33M̲s33M33333f3@3f33f3333@f3Y3Yff33Yff333333333333contextfree-3.0.5+dfsg1.orig/src-win/win-install/ContextFree.nsi0000644000175000017500000001601012076364074023223 0ustar brambram; Context Free ; --------------------- ; Copyright (C) 2005 John Horigan ; ; This program is free software; you can redistribute it and/or ; modify it under the terms of the GNU General Public License ; as published by the Free Software Foundation; either version 2 ; of the License, or (at your option) any later version. ; ; This program is distributed in the hope that it will be useful, ; but WITHOUT ANY WARRANTY; without even the implied warranty of ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ; GNU General Public License for more details. ; ; You should have received a copy of the GNU General Public License ; along with this program; if not, write to the Free Software ; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ; ; John Horigan can be contacted at john@glyphic.com or at ; John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA ; !define VER_MAJOR 3 !define VER_MINOR 0 SetCompressor lzma RequestExecutionLevel user !define PRODUCT "ContextFree" !define VERSION "${VER_MAJOR}.${VER_MINOR}" !include "MUI.nsh" !include WordFunc.nsh !include "x64.nsh" !include WinVer.nsh ;-------------------------------- ;Variables Var MUI_TEMP Var STARTMENU_FOLDER ;-------------------------------- ;Configuration !define MUI_ICON "ContextFree.ico" !define MUI_UNICON "ContextFree.ico" !define MUI_WELCOMEFINISHPAGE_BITMAP "sidebar.bmp" !define MUI_UNWELCOMEFINISHPAGE_BITMAP "sidebar.bmp" !define MUI_WELCOMEPAGE_TITLE "Context Free" !define MUI_FINISHPAGE_NOAUTOCLOSE !define MUI_UNFINISHPAGE_NOAUTOCLOSE ShowInstDetails show ShowUninstDetails show ;General OutFile "ContextFreeInstall.exe" ;License page LicenseData "license.txt" Name "${PRODUCT}" !insertmacro MUI_PAGE_WELCOME !insertmacro MUI_PAGE_LICENSE "license.txt" !insertmacro MUI_PAGE_DIRECTORY ;Start Menu Folder Page Configuration !define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKCU" !define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\OzoneSoft\ContextFree" !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder" !insertmacro MUI_PAGE_STARTMENU Application $STARTMENU_FOLDER !insertmacro MUI_PAGE_INSTFILES !insertmacro MUI_PAGE_FINISH !insertmacro MUI_UNPAGE_CONFIRM !insertmacro MUI_UNPAGE_INSTFILES ;Language !insertmacro MUI_LANGUAGE "English" ;-------------------------------- ;Installer Sections Section "Context Free (required)" SectionIn RO SetOutPath "$INSTDIR" ClearErrors File 'license.txt' ${If} ${RunningX64} File "..\\..\\src-net\\Release64\\ContextFree.exe" File "..\\..\\Release64\\ContextFreeCLI.exe" File "..\\..\\src-net\\Release64\\CFControls.dll" File "..\\..\\src-net\\Release64\\Controls.dll" File "..\\..\\src-net\\Release64\\FileDlgExtenders.dll" File "..\\..\\src-net\\Release64\\WeifenLuo.WinFormsUI.Docking.dll" File "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\redist\x64\Microsoft.VC100.CRT\msvcr100.dll" File "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\redist\x64\Microsoft.VC100.CRT\msvcp100.dll" ${Else} File "..\\..\\src-net\\release\\ContextFree.exe" File "..\\..\\Release\\ContextFreeCLI.exe" File "..\\..\\src-net\\release\\CFControls.dll" File "..\\..\\src-net\\release\\Controls.dll" File "..\\..\\src-net\\release\\FileDlgExtenders.dll" File "..\\..\\src-net\\release\\WeifenLuo.WinFormsUI.Docking.dll" File "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\redist\x86\Microsoft.VC100.CRT\msvcr100.dll" File "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\redist\x86\Microsoft.VC100.CRT\msvcp100.dll" ${EndIf} SectionEnd Section -post WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\{DD0B06AD-5E55-41be-88E5-E9D13BAF06F4}" \ "DisplayName" "Context Free" WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\{DD0B06AD-5E55-41be-88E5-E9D13BAF06F4}" \ "UninstallString" '"$INSTDIR\uninst-contextfree.exe"' WriteRegDWORD HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\{DD0B06AD-5E55-41be-88E5-E9D13BAF06F4}" \ "NoModify" 1 WriteRegDWORD HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\{DD0B06AD-5E55-41be-88E5-E9D13BAF06F4}" \ "NoRepair" 1 SetOutPath $INSTDIR ; since the installer is now created last (in 1.2+), this makes sure ; that any old installer that is readonly is overwritten. Delete $INSTDIR\uninst-contextfree.exe WriteUninstaller $INSTDIR\uninst-contextfree.exe !insertmacro MUI_STARTMENU_WRITE_BEGIN Application ;Create shortcuts CreateDirectory "$SMPROGRAMS\$STARTMENU_FOLDER" CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Context Free.lnk" "$INSTDIR\ContextFree.exe" !insertmacro MUI_STARTMENU_WRITE_END SectionEnd Function .onInstSuccess Exec '"$INSTDIR\ContextFree.exe"' FunctionEnd Function .onInit ;Folder-selection page ${If} ${AtLeastWin2000} StrCpy $INSTDIR "$LOCALAPPDATA\OzoneSoft\${PRODUCT}" ${Else} StrCpy $INSTDIR "$PROGRAMFILES\OzoneSoft\${PRODUCT}" ${EndIf} ReadRegStr $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client" "Version" ${If} $0 == "" MessageBox \ MB_YESNO|MB_ICONSTOP \ ".Net framework v4.0 is required. Install Context Free anyway?" \ IDYES okgo Abort ${EndIf} okgo: SetOutPath $TEMP File /oname=spltmp.bmp "splash.bmp" splash::show 4000 $TEMP\spltmp Pop $0 ; $0 has '1' if the user closed the splash screen early, ; '0' if everything closed normal, and '-1' if some error occured. Delete $TEMP\spltmp.bmp FunctionEnd ;-------------------------------- ;Uninstaller Section Section "Uninstall" Delete '$INSTDIR\ContextFree.exe' Delete '$INSTDIR\ContextFreeCLI.exe' Delete '$INSTDIR\CFControls.dll' Delete '$INSTDIR\Controls.dll' Delete '$INSTDIR\FileDlgExtenders.dll' Delete '$INSTDIR\WeifenLuo.WinFormsUI.Docking.dll' Delete '$INSTDIR\msvcr100.dll' Delete '$INSTDIR\msvcp100.dll' Delete '$INSTDIR\license.txt' Delete '$INSTDIR\uninst-contextfree.exe' RMDir '$INSTDIR' !insertmacro MUI_STARTMENU_GETFOLDER Application $MUI_TEMP RMDir /r "$SMPROGRAMS\$MUI_TEMP" SetShellVarContext all RMDir /r "$SMPROGRAMS\$MUI_TEMP" SetRegView 32 DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\{DD0B06AD-5E55-41be-88E5-E9D13BAF06F4}" DeleteRegKey HKCU "Software\OzoneSoft\ContextFree" DeleteRegKey HKCU "Software\Classes\.cfdg" DeleteRegKey HKCU "Software\Classes\ContextFree.Document" SetRegView 64 DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\{DD0B06AD-5E55-41be-88E5-E9D13BAF06F4}" DeleteRegKey HKCU "Software\OzoneSoft\ContextFree" DeleteRegKey HKCU "Software\Classes\.cfdg" DeleteRegKey HKCU "Software\Classes\ContextFree.Document" SectionEnd ;eof contextfree-3.0.5+dfsg1.orig/src-win/win-install/ContextFree.ico0000644000175000017500000006444612076364074023224 0ustar brambram(LF00nL [hc(Hlʘ@@@nbK ~nooȻԺRSSsYr/00TL:ڥ``aǬɵaWBsk[ž|p۴~`A<1`[RϩǺGGHj vwwĠܿvjP))*677ghhóy{uhYYZie[HC9YTGԧμͱf\I1.&84,џʢd¨yqaԲZQ>ƕOG5{{|r\WMrNNNrعſ}ܫحjcTdzƜwa||j{qZx\ %%%:::DDDrss̢vqhй֡qfPkklʸTN@F@4ީi`M̪Ŧ߲^VG˹•,--USN\]]ddemgZymT¾{~׿pk`aZJʺeZDj_HfaU333WWXʯz^T?ֵ{s`мv}KKLΝun^пŷ~~oҼĻŹpe]NȨ|b[TC߿™ɿɶ=>>RK<PPQ$$n0^$7"vvun[k""AaVRMAa~aL*tmغM G dŽކ-_4i٫JOCCI //=my,4iK II摐##=t!-(II!##&bD**poooooIFb##W}&Xpp(ooprĵIl*#HHž o(pp(oooI!}j///Y opp((oooPI摐jjLrpqqqqqp(oo(INg.5 ppqqqqqqqqqqpp((ooqSIZI(qqqqqqqqqqqqqqqp(ooĵIso(qqqqqqqqqqqqqqqqqqqpp((oooq I'oqqqqqqqqqqqqqqqqqqqqqqqp(oopPII;pqqqqqqqqqqqqqqqqqqqqqqqqqqqqpp(ooĵIf pqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpp((oooSIINo(qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqppr(rĵI'o(qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq%IIooIIPoqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqʘ5q(oooPI pqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqčPpp(oo(ʵIIqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqr͌;qp((oooSƚ;(qqqq%rqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq'Tqqpp(oopPIIo(qqqqSrqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq@S%qqqqqpp((ooĚoqqq%Pqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqf%qqqqqqqqqp(oIISpqqqrr%qq%%%%qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq%f'TNS%qqqqqqqqqqqq%Sr%%rrrrqqqqqqqqqqqqqqqqqqqqqqqqqqqEf8%qqqqqqqqqqqqqqpIq%rSrqq%%qqqqqqqqqqqqqqqqqqqqqqqq%Pώ@ư%qqqqqqqqqqqqqpƷIopqr%SPrqq%r%qqqqqqqqqqqqqqqqqqqqqqqq%Ph8;E'᝚SrqqqqqqqqqqooPoqSP rqq%qq%rrqqqqqqqqqqqqqqqqqqqqqqqqq%??Pƍ3'8fIqqqqqqqqq(oISp%Sʵ Iqqqq%qqqqqqqqqqqqqqqqqqqqqqqq'Pr' 'Pr%qqqqqqpSI (SI'PNqqrqqqqqqqqqqqqqqqqqqqqqqqqq%P TqqTP%qqqqfI(prr%NNPPPr%%rrrʰqqqqqqqqqqqqqqqqqqqqqqqqqPTϵrqqq P;Ef S%qq(oIo%%TİSSPrqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq'fr(%)qrPN ʰrS%qqqqqqqqqqqqqqqqqqqqqqqqqr5sqqqqqqqPhf'N͜TPBo%%rSSPfϚPSr%qqqqqqqqqqqqqqqqqqqqqqqqN8?>rqqqqqqqqqq6ff(oIProrrSI'IPPI%qqqqqqqqqqqqqqqqqqqqqqqʚ''qqqqqqqqqqqqT5Ĥ'f; N%q~p%PPPNưrrS%qqqqqqqqqqqqqqqqqqqqqqqN 8S%qqqqqqqqqqqqq'f'f R~p%rIrq'qqqqq%P%qqqqqqqqqqqqqqqqqqqqqq;3qqqqqqqqqqqqqqqqf fTn1I%qqqIrqqqSqqqqqqqqqqqqqqqqqqqqqqN @Pqqqqqqqqqqqqqqqqqqq5ܵh$rrI%qqϤ%qqq%%qqqqqqqqqqqqqqqqqqqqq%NfIIqqqqqqqqqqqqqqqqqqqqqq?ϰNh^"Vx(%rSPN%qq%Prqqrqqqqqqqqqqqqqqqqqqqqqqr @PqqqqqqqqqqqqqqqqqqqqqqqP8hT$kp(%ƵSİr%%qqIP%qqSrqqqqqqqqqqqqqqqqqqqqrʚT5qqqqqqqqqqqqqqqqqqqqqqqዜn0u:o(qSqqq%Iqqrrqqqqqqqqqqqqqqqqqqqqķ'ɲqqqqqqqqqqqqqqqqqqqqqqqfUUc~Ioq%rqqqqqSNrrqqqqqqqqqqqqqqqqqqq%S;Tqqqqqqqqqqqqqqqqqqqqqqqq(N01PqrS%r%r%%qqqfĵS%qqqqqqqqqqqqqqqqqqq%SIfT;ڊqqqqqqqqqqqqqqqqqqqqqqqqpP+xpqqr%%qqqqq'PIrqqqqqqqqqqqqqqqqqqq% f?Iqqqqqqqqqqqqqqqqqqqqqqqqouw{ (qqrqqr%qqqqqrf'ƚI%qqqqqqqqqqqqqqqS'S%qqqqqqqqqqqqqqqqqqqqqqqq(oI`Qoo(qqqqqqqqqqqqqqqq SSqqqqqqqqqqqqqʤ'f>Sqqqqqqqqqqqqqqqqqqqqqqqqqqp9\IoqqqqqqqqqqqqqqqqqfPƤNIİ%qqqqqqqq%PfTĤqqqqqqqqqqqqqqqqqqqqqqqqqp f^z1Pqqqqqqqqqqqqqqqqqqq%PNIPSr%qq%rS'ƚqqqqqqqqqqqqqqqqqqqqqqqqqqo$U9xo(pqqqqqqqqqqqqqqqqqqqqĜfIʰrƤ'fS'qqqqqqqqqqqqqqqqqqqqqqqqqqq(on09e qqqqqqqqqqqqqqqqqqqqqSrSƤfNII' NS%@rqqqqqqqqqqqqqqqqqqqqqqqqqqpP$ \(pqqqqqqqqqqqqqqqqqqqqqqP%rƤN'T'''Ϸ͘rqqqqqqqqqqqqqqqqqqqqqqqqqqoIc9 |\I(qqqqqqqqqqqqqqqqqqqqqqqĜSPffN'T@qqqqqqqqqqqqqqqqqqqqqqqqqqqqq(op|2~Po(qqqqqqqqqqqqqqqqqqqqqqqqqq' %SIffNPf''qqqqqqqqqqqqqqqqqqqqqqqqqqqqq(<9 |2xSo%qqqqqqqqqqqqqqqqqqqqqqqqq ƷrƷ>qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpƷ|2e (rqqqqqqqqqqqqqqqqqqqqqqqr ͤ%;'ϱNfrqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqoo9 |2$ppSr%%%%qqqqqqqqq%r3ϵ'6h@%qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq(oqI^|22\ߚrSʰrrrrSSSr%qqq%SPI8T;qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpI$U9 |22IqrSSPPPPSrIf'ư@8'͜?qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpf09|222PPSPPSSPPPƵIII Nqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqo( |222eSrrPƵNNISPN;8 ffPqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq(oc9 |222N%%SSSrʰrqqqqqq%SPNPʰ%PN;f;qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpPۄ|2222\:pqrIIʰrqqqqqqqqqq%II%%%ʚ fNPENrqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqooIu9 |2222~SfP%qqrr%SƵ%%rP  'NP%IϚNI%qqqqqqqqqqqqqqqqqqqqqqqqqqqqq(oI|222221P%SfNSrSĵIIPPrrh@EE'Pqqqqqqqqqqqqqqqqqqqqqqqqqqqq(<|22222e r SIIPƵIff'TNʰT 'N%h%Irqqqqqqqqqqqqqqqqqqqqqqqqqqpf9 ||22eSrrrrq hT'; ;ffʰfʵqqqqqqqqqqqqqqqqqqqqqqqqqqo$u9 |2\I(rP%rP%qq%Phfrq%N@'N; IhISqqqqqqqqqqqqqqqqqqqqqqqqq(o%I<9z oqrrƵThS%%%@;ϝ%qqNIP%qqqqqqqqqqqqqqqqqqqqqqqqpĚ^w+1oq%PN'NPPPƵIT8PPĤ@ rqqĵrqqqqqqqqqqqqqqqqqqqqqqpIUρȁ_]ȁۑOZR9W]J']W4oȁ"O^ ]gdtȁBq/(ȁgȁKpd2P"g0՚]Ux | ,{ׁ]=WA^֟I7g49uwL܁ ܁ !ȁ-wrb]wӃ]ȁP%"P(f71ȁR9oU]7%M"wgNrJ|ȋvX<ȁf@؟-M*]W_uȁf͠OJCA P(ԁ]k=ȁ]ʙẃ聑t]ҁM^ȁ=e]ȁ" +ؠԁ]^(p6t^]ȁt( "^P%]7xTPӜIƼ|)o+ԛJGQPp~cIIII¼qܑ`_IIIIIIb Iދ]i_II_IIIIII"lZ,=IIIIIIIIW_˥CO4IIIIII3%IIIh2zECNII_IIIIIIIII( 960INIIIIII&\III…tUIII^IIIII$IIIIs?III kIIWIIII{A*IIIII&!:IIIIIIžwIIIIIIIaO IIIIII]B;gj5 YI IIIIIµKOCCIIm IIIIIx_IIN;2IdkIII¥L<&bkII#IIIRArI_;Ig=IiII@Ifah5 IIIw[/IIC֖݉Ms>scontextfree-3.0.5+dfsg1.orig/src-win/wmpCanvas.cpp0000644000175000017500000002406112076364074020471 0ustar brambram// wmpCanvas.cpp // this file is part of Context Free // --------------------- // Copyright (C) 2011 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #include "wmpCanvas.h" #include "WinSystem.h" #include #include #include #ifndef WMFORMAT_SDK_VERSION #define WMFORMAT_SDK_VERSION WMT_VER_9_0 #endif class wmpCanvas::Impl { private: Impl(wchar_t* name, int fps, WinCanvas* c); ~Impl(); HRESULT addFrame(); const char* mErrorMsg; char* mBits; IWMProfile* mWMProfile; IWMWriter* mWMWriter; IWMInputMediaProps* mVideoProps; IWMProfileManager* mWMProfileManager; HDC mmvDC; DWORD mVideoInput; DWORD mCurrentVideoSample; QWORD mVideoTime; DWORD mFrameRate; // Frames Per Second Rate (FPS) bool mWritten; BITMAPINFOHEADER mBmpInfo; RGBQUAD mGrayPalette[256]; friend class wmpCanvas; }; wmpCanvas::Impl::Impl(wchar_t* name, int fps, WinCanvas* c) : mErrorMsg(NULL), mBits(c->mBM), mWMProfile(NULL), mWMWriter(NULL), mVideoProps(NULL), mWMProfileManager(NULL), mmvDC(NULL), mVideoInput(0), mCurrentVideoSample(0), mFrameRate(fps), mWritten(false) { CoInitialize(NULL); const GUID& guidProfileID = WMProfile_V80_BESTVBRVideo; IWMProfileManager2 *profileManager2 = NULL; if (FAILED(WMCreateProfileManager(&mWMProfileManager))) { mErrorMsg = "Unable to Create WindowsMedia Profile Manager"; return; } if (FAILED(mWMProfileManager->QueryInterface(IID_IWMProfileManager2, (void**)&profileManager2))) { mErrorMsg = "Unable to Query Interface for ProfileManager2"; return; } HRESULT hr = profileManager2->SetSystemProfileVersion(WMFORMAT_SDK_VERSION); profileManager2->Release(); if (FAILED(hr)) { mErrorMsg = "Unable to Set System Profile Version"; return; } if (FAILED(mWMProfileManager->LoadProfileByID(guidProfileID, &mWMProfile))) { mErrorMsg = "Unable to Load System Profile"; return; } DWORD cnt = 0; IWMStreamConfig* streamConfig = NULL; hr = mWMProfile->CreateNewStream(WMMEDIATYPE_Video, &streamConfig); hr = mWMProfile->GetStreamCount(&cnt); hr = streamConfig->SetBitrate(c->mHeight * c->mStride * fps * 8); hr = streamConfig->SetBufferWindow(0); hr = streamConfig->SetStreamNumber(cnt); hr = mWMProfile->AddStream(streamConfig); if (FAILED(WMCreateWriter(NULL, &mWMWriter))) { mErrorMsg = "Unable to Create Media Writer Object"; return; } if (FAILED(mWMWriter->SetProfile(mWMProfile))) { mErrorMsg = "Unable to Set System Profile"; return; } DWORD inputCount = 0; if (FAILED(mWMWriter->GetInputCount(&inputCount))) { mErrorMsg = "Unable to Get input count For Profile"; return; } for (DWORD i = 0; i < inputCount; ++i) { IWMInputMediaProps* inputProps = NULL; GUID guidInputType; if (FAILED(mWMWriter->GetInputProps(i, &inputProps))) { mErrorMsg = "Unable to GetInput Properties"; return; } if (FAILED(inputProps->GetType(&guidInputType))) { mErrorMsg = "Unable to Get Input Property Type"; return; } if (guidInputType == WMMEDIATYPE_Video) { mVideoProps = inputProps; mVideoInput = i; break; } else { inputProps->Release(); } } if (mVideoProps == NULL) { mErrorMsg = "Profile Does not Accept Video input"; return; } if (FAILED(mWMWriter->SetOutputFilename(name))) { mErrorMsg = "Unable to Set Output Filename"; return; } mmvDC = CreateCompatibleDC(NULL); if (mmvDC == NULL) { mErrorMsg = "Unable to Create Device Context"; return; } int maxWidth = GetSystemMetrics(SM_CXSCREEN); int maxHeight = GetSystemMetrics(SM_CYSCREEN); ZeroMemory(&mBmpInfo, sizeof(BITMAPINFOHEADER)); mBmpInfo.biSize = sizeof(BITMAPINFOHEADER); mBmpInfo.biBitCount = 8 * aggCanvas::BytesPerPixel[c->mPixelFormat]; mBmpInfo.biWidth = min(c->mWidth, maxWidth); mBmpInfo.biHeight = min(c->mHeight, maxHeight); mBmpInfo.biCompression = BI_RGB; mBmpInfo.biPlanes = 1; mBmpInfo.biSizeImage = c->mHeight * c->mStride; mBmpInfo.biClrUsed = 0; mBmpInfo.biClrImportant = 0; struct videoInfoType { WMVIDEOINFOHEADER info; RGBQUAD grayPalette[256]; }; videoInfoType videoInfo; videoInfo.info.rcSource.left = 0; videoInfo.info.rcSource.top = 0; videoInfo.info.rcSource.right = mBmpInfo.biWidth; videoInfo.info.rcSource.bottom = mBmpInfo.biHeight; videoInfo.info.rcTarget = videoInfo.info.rcSource; videoInfo.info.rcTarget.right = videoInfo.info.rcSource.right; videoInfo.info.rcTarget.bottom = videoInfo.info.rcSource.bottom; videoInfo.info.dwBitRate = mBmpInfo.biWidth * mBmpInfo.biHeight * mBmpInfo.biBitCount * mFrameRate; videoInfo.info.dwBitErrorRate = 0; videoInfo.info.AvgTimePerFrame = ((QWORD)1) * 10000 * 1000 / mFrameRate; memcpy(&(videoInfo.info.bmiHeader), &mBmpInfo, sizeof(BITMAPINFOHEADER)); for (int i = 0; i < 256; ++i) { mGrayPalette[i].rgbBlue = mGrayPalette[i].rgbGreen = mGrayPalette[i].rgbRed = i; mGrayPalette[i].rgbReserved = 0; videoInfo.grayPalette[i].rgbBlue = videoInfo.grayPalette[i].rgbGreen = videoInfo.grayPalette[i].rgbRed = i; videoInfo.grayPalette[i].rgbReserved = 0; } WM_MEDIA_TYPE mt; mt.majortype = WMMEDIATYPE_Video; switch (mBmpInfo.biBitCount) { case 32: mt.subtype = WMMEDIASUBTYPE_RGB32; break; case 24: mt.subtype = WMMEDIASUBTYPE_RGB24; break; case 8: mt.subtype = WMMEDIASUBTYPE_RGB8; break; default: mt.subtype = GUID_NULL; break; } mt.bFixedSizeSamples = true; mt.bTemporalCompression = false; mt.lSampleSize = 0; mt.formattype = WMFORMAT_VideoInfo; mt.pUnk = NULL; mt.cbFormat = sizeof(videoInfoType); mt.pbFormat = (BYTE*)&videoInfo; if (FAILED(mVideoProps->SetMediaType(&mt))) { mErrorMsg = "Unable to Set Media Type"; return; } if (FAILED(mWMWriter->SetInputProps(mVideoInput, mVideoProps))) { mErrorMsg = "Unable to Set Input Properties for Media Writer"; return; } hr = mWMWriter->BeginWriting(); if (FAILED(hr)) { mErrorMsg = "Unable to Initialize Writing"; return; } mWritten = true; } wmpCanvas::Impl::~Impl() { if (mWritten && mWMWriter) mWMWriter->EndWriting(); if (mVideoProps) { mVideoProps->Release(); mVideoProps = NULL; } if (mWMWriter) { mWMWriter->Release(); mWMWriter = NULL; } if (mWMProfile) { mWMProfile->Release(); mWMProfile = NULL; } if (mWMProfileManager) { mWMProfileManager->Release(); mWMProfileManager = NULL; } if (mmvDC) { DeleteDC(mmvDC); mmvDC = NULL; } CoUninitialize(); } HRESULT wmpCanvas::Impl::addFrame() { INSSBuffer *sample = NULL; BYTE *buffer = NULL; DWORD bufferLength = 0; if (FAILED(mWMWriter->AllocateSample(mBmpInfo.biSizeImage, &sample))) { mErrorMsg = "Unable to Allocate Memory"; return E_FAIL; } if (FAILED(sample->GetBufferAndLength(&buffer, &bufferLength))) { mErrorMsg = "Unable to Lock Buffer"; if (sample) sample->Release(); return E_FAIL; } memcpy(buffer, mBits, mBmpInfo.biSizeImage); HRESULT hr = mWMWriter->WriteSample(mVideoInput, 10000 * mVideoTime, 0, sample); mVideoTime = (++mCurrentVideoSample * 1000) / mFrameRate; if (sample) sample->Release(); if (FAILED(hr)) { mErrorMsg = "Unable to Write Frame"; return hr; } return S_OK; } wmpCanvas::wmpCanvas(WinSystem* sys, wchar_t* name, int fps, aggCanvas::PixelFormat pixfmt, int width, int height, agg::rgba bkgrnd) : WinCanvas(sys, (aggCanvas::PixelFormat)(pixfmt & (~Has_16bit_Color)), width & (~3), -(height & (~3)), bkgrnd), mError(NULL) { impl = new Impl(name, fps, this); if (impl->mErrorMsg) { mError = impl->mErrorMsg; delete impl; impl = NULL; sys->message("Movie setup failed: %s", mError); } } wmpCanvas::~wmpCanvas() { delete impl; impl = NULL; } void wmpCanvas::end() { aggCanvas::end(); if (impl && FAILED(impl->addFrame())) { mError = impl->mErrorMsg; delete impl; impl = NULL; mSystem->message("Movie writing failed: %s", mError); } } contextfree-3.0.5+dfsg1.orig/src-win/winTimer.cpp0000644000175000017500000000312012076364074020321 0ustar brambram// winTimer.cpp // Context Free // --------------------- // Copyright (C) 2008 John Horigan // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #define _WIN32_WINNT 0x0500 #define NOMINMAX 1 #include #include "cfdg.h" Renderer* runningRenderer = 0; VOID CALLBACK statusTimer(PVOID, BOOLEAN) { if (runningRenderer) runningRenderer->requestUpdate = true; } HANDLE timerQueueTimer = NULL; void setupTimer(Renderer* renderer) { runningRenderer = renderer; if (renderer) { CreateTimerQueueTimer(&timerQueueTimer, NULL, statusTimer, NULL, 250, 250, WT_EXECUTEINTIMERTHREAD); } else { if (timerQueueTimer) { DeleteTimerQueueTimer(NULL, timerQueueTimer, INVALID_HANDLE_VALUE); } } } contextfree-3.0.5+dfsg1.orig/src-win/WinSystem.cpp0000644000175000017500000001045112076364074020472 0ustar brambram// WinSystem.cpp // this file is part of Context Free // --------------------- // Copyright (C) 2005-2012 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #define _CRT_SECURE_NO_WARNINGS 1 #include "WinSystem.h" #include "cfdg.h" #include #include #include #include #include #include #include #include using namespace std; //map WinSystem::PathMap; map WinSystem::ExampleMap; WinSystem::WinSystem(void* h) : mWindow(h) { } WinSystem::~WinSystem() { } void WinSystem::AddExample(const char* newName, const char* newText) { ExampleMap[newName] = newText; } bool WinSystem::updateInfo(const char* newName, const char* newText) { mName = newName; if (!strcmp(newText, mText.c_str())) return false; mText = newText; return true; } void WinSystem::message(const char* fmt, ...) { if (!mWindow) return; va_list args; va_start(args, fmt); char cbuf[256]; _vsnprintf(cbuf, 255, fmt, args); cbuf[255] = '\0'; va_end(args); char* buf = new char[strlen(cbuf) + 1]; strcpy(buf, cbuf); if (!::PostMessage((HWND)mWindow, WM_USER_MESSAGE_UPDATE,(WPARAM)buf, NULL)) delete[] buf; } void WinSystem::syntaxError(const CfdgError& errLoc) { if (!mWindow) return; if (mName.compare(*(errLoc.where.begin.filename)) == 0) { message("Error - %s", errLoc.where.begin.line, errLoc.where.begin.column, errLoc.where.end.line, errLoc.where.end.column, errLoc.what); } else { message("Error in file %s - %s", ::PathFindFileNameA(errLoc.where.begin.filename->c_str()), errLoc.what); } } bool WinSystem::error(bool errorOccurred) { mErrorMode = mErrorMode || errorOccurred; return mErrorMode; } std::istream* WinSystem::openFileForRead(const std::string& path) { map::iterator exText = ExampleMap.find(path); if (path == mName) { return new stringstream(mText); } else if (exText != ExampleMap.end()) { return new stringstream(exText->second); } else { return new ifstream(path.c_str(), ios::binary); } } std::istream* WinSystem::tempFileForRead(const std::string& path) { return new ifstream(path.c_str(), ios::binary); } std::ostream* WinSystem::tempFileForWrite(std::string& prefixInNameOut) { char* path = _tempnam(0, prefixInNameOut.c_str()); prefixInNameOut = path; ofstream* f = new ofstream(path, ios::binary | ios::out | ios::trunc); free((void*)path); return f; } std::string WinSystem::relativeFilePath(const std::string& base, const std::string& rel) { char buf[MAX_PATH+1]; strcpy(buf, base.c_str()); PathRemoveFileSpecA(buf); PathAppendA(buf, rel.c_str()); if (PathFileExistsA(buf)) return string(buf); else return rel; } void WinSystem::stats(const Stats& s) { if (!mWindow) return; Stats* stat = new Stats(s); if (!::PostMessage((HWND)mWindow, WM_USER_STATUS_UPDATE,(WPARAM)stat, NULL)) delete stat; } void WinSystem::statusUpdate() { if (mWindow) ::PostMessage((HWND)mWindow, WM_USER_STATUS_UPDATE, NULL, NULL); } void WinSystem::orphan() { mWindow = 0; mName.clear(); mText.clear(); } contextfree-3.0.5+dfsg1.orig/src-win/getopt.h0000644000175000017500000000040512076364074017475 0ustar brambram#ifndef INCLUDE_GETOPT_H #define INCLUDE_GETOPT_H #ifdef __cplusplus extern "C" { #endif extern char *optarg; extern int optind, opterr, optopt; int getopt (int argc, char **argv, const char *options); #ifdef __cplusplus } #endif #endif //INCLUDE_GETOPT_H contextfree-3.0.5+dfsg1.orig/src-win/wmpCanvas.h0000644000175000017500000000307712076364074020142 0ustar brambram// wmpCanvas.h // this file is part of Context Free // --------------------- // Copyright (C) 2011 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #ifndef INCLUDE_WMPCANVAS_H #define INCLUDE_WMPCANVAS_H #include "WinCanvas.h" class WinSystem; class wmpCanvas : public WinCanvas { public: wmpCanvas(WinSystem* sys, wchar_t* name, int fps, aggCanvas::PixelFormat pixfmt, int width, int height, agg::rgba bkgrnd); virtual ~wmpCanvas(); const char* mError; virtual void end(); private: class Impl; Impl* impl; wmpCanvas(const wmpCanvas&); // declare but do not implement wmpCanvas& operator=(const wmpCanvas&); // declare but do not implement }; #endif // INCLUDE_WMPCANVAS_Hcontextfree-3.0.5+dfsg1.orig/src-win/resource.h0000644000175000017500000002217512076364074020032 0ustar brambram//{{NO_DEPENDENCIES}} // Microsoft Visual C++ generated include file. // Used by ContextFree.rc // #define IDCANCEL2 3 #define IDT_LENGTH 4 #define IDD_CUSTOM_TEMPLATE 5 #define IDR_CFDGTYPE_CNTR_IP 6 #define IDR_APP_PNG 7 #define IDB_BITMAP_HSB 8 #define IDB_BITMAP_B 9 #define IDT_STATUS 10 #define IDD_CUSTOM_TEMPLATE_98 11 #define IDD_SAVEIMAGE_TEMPLATE 12 #define IDD_SAVEIMAGE_TEMPLATE_98 13 #define IDD_DIALOG_COLORS 28 #define IDS_URL_CFDG 30 #define IDS_URL_CONTEXTFREE 31 #define IDS_URL_FORUM 32 #define IDS_URL_FEEDBACK 33 #define IDS_URL_GALLERY 34 #define IDS_EX_CILIASUN 40 #define IDS_EX_DEMO1 41 #define IDS_EX_DEMO2 42 #define IDS_EX_FUNKY_FLOWER 43 #define IDS_EX_LESSON 44 #define IDS_EX_LESSON2 45 #define IDS_EX_MTREE 46 #define IDS_EX_OCTOPI 47 #define IDS_EX_POINT 48 #define IDS_EX_ROSE 48 #define IDS_EX_QUADCITY 49 #define IDS_EX_SIERPINSKI 50 #define IDS_EX_SNOWFLAKE 51 #define IDS_EX_TANGLE 52 #define IDS_EX_TRIPLES 53 #define IDS_EX_UNDERGROUND 54 #define IDS_EX_WEIGHTING_DEMO 55 #define IDS_EX_WELCOME 56 #define IDS_EX_ZIGGY 57 #define IDS_EX_I_CURVES 58 #define IDS_EX_I_PIX 59 #define IDS_EX_I_POLYS 60 #define IDD_ABOUTBOX 100 #define IDP_OLE_INIT_FAILED 100 #define IDP_FAILED_TO_CREATE 102 #define IDR_MAINFRAME 128 #define IDR_CFDGTYPE 129 #define IDD_CONTROL_BAR 131 #define IDC_DROPPER 133 #define IDC_RENDER 134 #define IDC_MARKER 135 #define IDC_MOVIE_LENGTH 136 #define IDC_SAVE_IMAGE 137 #define IDC_LENGTH_UNITS 138 #define IDC_EDIT_WIDTH 139 #define IDD_RENDER 140 #define IDD_RENDER_OPTIONS 141 #define IDC_JPEG_QUAL_DEF 142 #define IDD_RENDER_SIZE 143 #define IDR_RENDER_POPUP 144 #define IDC_EDIT_FRAME 145 #define IDC_PROGRESS1 146 #define IDC_STATUS_BAR 147 #define IDC_IMAGE_APPEND 148 #define IDC_IMAGE_EMBED 149 #define IDI_BUSY0 160 #define IDI_BUSY1 161 #define IDI_BUSY2 162 #define IDI_BUSY3 163 #define IDI_BUSY4 164 #define IDI_BUSY5 165 #define IDI_BUSY6 166 #define IDI_BUSY7 167 #define IDI_BUSY8 168 #define IDI_BUSY9 169 #define IDI_BUSY10 170 #define IDI_BUSY11 171 #define IDI_BUSY12 172 #define IDI_BUSY13 173 #define IDI_BUSY14 174 #define IDI_BUSY15 175 #define IDB_COLORWHEEL 176 #define IDD_RENDER_SVG 177 #define IDD_RENDER_ANIMATE 178 #define IDD_SAVEIMAGE_TEMPLATE_NT 180 #define IDD_CUSTOM_TEMPLATE_NT 181 #define IDD_UPLOAD 182 #define IDB_DROPPER 186 #define IDD_UPLOAD_DESIGN 187 #define IDD_UPLOAD_ACCT 188 #define IDD_UPLOAD_STATUS 189 #define IDC_COPY_NEW 200 #define IDC_EDIT_HUE 201 #define IDC_EDIT_SAT 202 #define IDC_EDIT_VAL 203 #define IDC_TEXT_NEW 204 #define IDC_EDIT_HUE_OLD 205 #define IDC_EDIT_SAT_OLD 206 #define IDC_EDIT_VAL_OLD 207 #define IDC_TEXT_OLD 208 #define IDC_EDIT_HUE_DELTA 209 #define IDC_EDIT_SAT_DELTA 210 #define IDC_EDIT_VAL_DELTA 211 #define IDC_TEXT_DELTA 212 #define IDC_STATIC_OLD 213 #define IDC_STATIC_NEW 214 #define IDB_UP 215 #define IDB_DOWN 216 #define IDC_MESSAGE_TEXT 1000 #define IDC_STATUS_ICON 1001 #define IDC_ENABLE_SIZE 1007 #define IDC_MAX_SHAPES_ENABLE 1008 #define IDC_WIDTH 1009 #define IDC_HEIGHT 1010 #define IDC_MAX_SHAPES 1011 #define IDC_PARTIAL 1012 #define IDC_ABOUT_ICON 1013 #define IDC_WELCOME 1014 #define IDC_START_WELCOME 1014 #define IDC_RANDOM 1015 #define IDC_RANDOM_SPIN 1016 #define IDC_STATUS_TEXT 1017 #define IDC_EDIT_HEIGHT 1018 #define IDC_EDIT_MINSIZE 1019 #define IDC_START_NEW 1020 #define IDC_START_NONE 1021 #define IDC_OPEN_RENDER 1022 #define IDC_IMAGE_CROP 1023 #define IDC_IMAGE_CROP2 1024 #define IDC_RENDER_MAXIMIZE 1025 #define IDC_NODISPLAY 1027 #define IDC_COLORPICKER 1028 #define IDC_BORDER_SLIDER 1029 #define IDC_MOVIE_ZOOM 1030 #define IDC_JPG_QUALITY 1032 #define IDT_JPG_QUALITY 1033 #define IDC_EMBED_CFDG_DEF 1034 #define IDC_MOVIE_SETTINGS 5000 #define IDC_USERNAME 5001 #define IDC_PASSWORD 5002 #define IDC_UPLOAD_TITLE 5003 #define IDC_UPLOAD_FILENAME 5004 #define IDC_UPLOAD_VARIATION 5005 #define IDC_ENCODE_PNG8 5006 #define IDC_ENCODE_JPEG 5007 #define IDC_UPLOAD_NOTE 5008 #define IDC_UPLOAD_REGISTER 5009 #define IDC_UPLOAD_CROP 5010 #define IDC_FDROPPER 5011 #define IDC_EDIT1 5012 #define IDC_UPLOAD_STATUS 5012 #define IDC_EDIT2 5013 #define IDC_EDIT3 5014 #define IDC_SDROPPER 5015 #define IDC_START_COLOR 5016 #define IDC_FINISH_COLOR 5017 #define IDC_SLIDER_RED 5018 #define IDC_SLIDER_GREEN 5019 #define IDC_SLIDER3 5020 #define IDC_SLIDER_BLUE 5020 #define IDC_EDIT4 5021 #define IDC_MULT_DELTA 5021 #define IDC_RADIO3 5024 #define IDC_RED 5025 #define IDC_GREEN 5026 #define IDC_BLUE 5027 #define IDC_HUESAT 5028 #define IDC_GREENS 5032 #define IDC_BRIGHT 5033 #define IDC_SWELL 5034 #define IDC_FWELL 5035 #define IDC_BRIGHT3 5036 #define IDC_BLUES 5036 #define IDC_REDS 5037 #define IDC_STATIC_HSB_RECT 5038 #define IDC_BUTTON1 5039 #define IDC_SKIP_ACCT 5040 #define IDC_HTML_STATUS 5041 #define IDC_SAVE_UNIT_TILE 5042 #define IDC_SAVE_RECT_TILE 5043 #define IDC_VARIATION_LABEL 5044 #define ID_CANCEL_EDIT_CNTR 32768 #define ID_RENDERING_OPTIONS 32771 #define ID_RENDERING_RANDOMIZE 32772 #define ID_RENDER_RENDER 32773 #define ID_RENDER_STOP 32774 #define ID_RENDER_RENDERTOSIZE 32775 #define ID_RENDER_SAVEIMAGE 32776 #define ID_FILE_REVERT 32777 #define ID_COLORPICKER 32778 #define ID_RENDER_RENDERTOSVG 32779 #define ID_RENDER_ANIMATE 32780 #define ID_RENDER_SAVEMOVIE 32781 #define ID_RENDER_PREFS 32782 #define ID_EDIT_SETFONT 32783 #define ID_RENDER_UPLOADTOGALLERY 32784 #define ID_RENDER_RENDERREPEAT 32787 #define ID_RENDER_REPEAT 32788 #define ID_RENDER_USELEGACYVARIATIONS 32791 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_3D_CONTROLS 1 #define _APS_NEXT_RESOURCE_VALUE 190 #define _APS_NEXT_COMMAND_VALUE 32792 #define _APS_NEXT_CONTROL_VALUE 5045 #define _APS_NEXT_SYMED_VALUE 5101 #endif #endif contextfree-3.0.5+dfsg1.orig/src-win/WinPngCanvas.cpp0000644000175000017500000001726512076364074021100 0ustar brambram// WinPngCanvas.cpp // this file is part of Context Free // --------------------- // Copyright (C) 2005-2013 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #define NOMINMAX #include #include "WinPngCanvas.h" #include #include "makeCFfilename.h" #ifndef ULONG_PTR #define ULONG_PTR ULONG #endif #ifndef max #define max(a,b) (((a) > (b)) ? (a) : (b)) #endif #ifndef min #define min(a,b) (((a) < (b)) ? (a) : (b)) #endif #include using namespace std; using namespace Gdiplus; static ColorPalette* GrayPalette = 0; static ULONG_PTR GdiPToken; static GdiplusStartupInput GdiPStartInput; static GdiplusStartupOutput GdiPStartOutput; int pngCanvas::CanvasCount = 0; pngCanvas::pngCanvas(const char* outfilename, bool quiet, int width, int height, PixelFormat pixfmt, bool crop, int frameCount, int variation, bool wallpaper, Renderer *r, int mx, int my) : abstractPngCanvas(outfilename, quiet, wallpaper ? ::GetSystemMetrics(SM_CXFULLSCREEN) : width, wallpaper ? ::GetSystemMetrics(SM_CYFULLSCREEN) : height, pixfmt, crop, frameCount, variation, wallpaper, r, mx, my) { if (CanvasCount++ == 0) GdiplusStartup(&GdiPToken, &GdiPStartInput, &GdiPStartOutput); } pngCanvas::~pngCanvas() { if (--CanvasCount == 0) { GdiplusShutdown(GdiPToken); if (GrayPalette) free((void*)GrayPalette); } } int GetEncoderClsid(const WCHAR* format, CLSID* pClsid) { UINT num = 0; // number of image encoders UINT size = 0; // size of the image encoder array in bytes ImageCodecInfo* pImageCodecInfo = NULL; GetImageEncodersSize(&num, &size); if(size == 0) return -1; // Failure pImageCodecInfo = (ImageCodecInfo*)(malloc(size)); if(pImageCodecInfo == NULL) return -1; // Failure GetImageEncoders(num, size, pImageCodecInfo); for(UINT j = 0; j < num; ++j) { if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 ) { *pClsid = pImageCodecInfo[j].Clsid; free(pImageCodecInfo); return j; // Success } } free(pImageCodecInfo); return -1; // Failure } static LPCSTR errorMsg[] = { "Ok", "Generic Error", "Invalid Parameter", "Out Of Memory", "Object Busy", "Insufficient Buffer", "Not Implemented", "Win32 Error", "Wrong State", "Aborted", "File Not Found", "Value Overflow", "Access Denied", "Unknown Image Format", "Font Family Not Found", "Font Style Not Found", "Not TrueType Font", "Unsupported Gdiplus Version", "Gdiplus Not Initialized", "Property Not Found", "Property Not Supported", "Profile Not Found" }; static CLSID encClsid = CLSID_NULL; void pngCanvas::output(const char* outfilename, int frame) { int width = mFullWidth; int height = mFullHeight; // If the canvas is 16-bit then copy it to an 8-bit version // and output that. GDI+ doesn't really support 16-bit modes. unsigned char* data = mData; int stride = mStride; int bpp = BytesPerPixel[mPixelFormat]; unsigned char* data8 = 0; PixelFormat pf = mPixelFormat; if (pf & Has_16bit_Color) { stride = stride >> 1; stride += ((-stride) & 3); data8 = new unsigned char[stride * height]; bpp = bpp >> 1; unsigned char* row8 = data8; unsigned char* srcrow = mData; for (int y = 0; y < height; ++y) { unsigned __int16* row16 = (unsigned __int16*)srcrow; for (int x = 0; x < width; ++x) row8[x] = row16[x] >> 8; row8 += stride; srcrow += mStride; } data = data8; pf = (PixelFormat)(pf & (~Has_16bit_Color)); } if (mCrop) { width = cropWidth(); height = cropHeight(); data += cropY() * stride + cropX() * BytesPerPixel[pf]; } WCHAR wpath[MAX_PATH]; TCHAR fullpath[MAX_PATH]; size_t cvt; ::mbstowcs_s(&cvt, wpath, MAX_PATH, outfilename, MAX_PATH); ::GetFullPathName(wpath, MAX_PATH, fullpath, NULL); const WCHAR* mimetype = mWallpaper ? L"image/bmp" : L"image/png"; if (encClsid == CLSID_NULL && GetEncoderClsid(mimetype, &encClsid) == -1) { cerr << endl << "Image encoder missing from GDI+!" << endl; return; } if (pf == aggCanvas::Gray8_Blend && !GrayPalette) { GrayPalette = (ColorPalette*)malloc(sizeof(ColorPalette) + 256*sizeof(ARGB)); GrayPalette->Count = 256; GrayPalette->Flags = PaletteFlagsGrayScale; for (int i = 0; i < 256; i++) GrayPalette->Entries[i] = Color::MakeARGB(255, (BYTE)i, (BYTE)i, (BYTE)i); } Bitmap* saveBM; switch (pf) { case aggCanvas::Gray8_Blend: saveBM = new Bitmap(width, height, stride, PixelFormat8bppIndexed, data); saveBM->SetPalette(GrayPalette); break; case aggCanvas::RGB8_Blend: saveBM = new Bitmap(width, height, stride, PixelFormat24bppRGB, data); break; case aggCanvas::RGBA8_Blend: saveBM = new Bitmap(width, height, stride, PixelFormat32bppPARGB, data); break; default: saveBM = 0; break; } if (frame == -1 && !mQuiet) { cerr << endl << "Writing " << width << "w x " << height << "h pixel image..." << endl; } PropertyItem pi; pi.id = PropertyTagImageDescription; pi.type = PropertyTagTypeASCII; pi.length = strlen("Context Free generated image") + 1; pi.value = (VOID*)"Context Free generated image"; if (saveBM) saveBM->SetPropertyItem(&pi); Status s = saveBM ? saveBM->Save(wpath, &encClsid, NULL) : Gdiplus::UnknownImageFormat; if (s != Ok){ cerr << endl << "A GDI+ error occured during PNG write: " << errorMsg[s]; if (s == Gdiplus::Win32Error) { LPVOID lpMsgBuf; DWORD dw = ::GetLastError(); ::FormatMessageA( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR) &lpMsgBuf, 0, NULL ); cerr << ": " << (char*)lpMsgBuf; LocalFree(lpMsgBuf); } cerr << endl; } else if (mWallpaper && frame == -1) { SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, (LPVOID)fullpath, SPIF_SENDWININICHANGE | SPIF_UPDATEINIFILE); } delete saveBM; delete[] data8; return; } contextfree-3.0.5+dfsg1.orig/src-win/res/0000755000175000017500000000000012245646004016606 5ustar brambramcontextfree-3.0.5+dfsg1.orig/src-win/res/buttonup.png0000644000175000017500000007340712076364074021215 0ustar brambramPNG  IHDRd25~sBIT|d pHYs  tEXtSoftwareMacromedia Fireworks MX*$kprVWxY0D6ٗL.s6̮|4KRV ;~j/OSfUW7{sЛW_}.mL?zqhK.?ee4hp2RF˜(YR_\ Q/ŵ'C70 u&/yJ忕ou)OhRZ$Es~.nw_OEԯ_$r*u7K}J۟h?_]qײ=g?O?M~O6Ofo?6?˯֭dˇV@NU)UOm< gJKGpJs<C+CuG_b0v݇ .':}Kx;_'}[0glrYoG9Θ;r>c9R7Xz4%=?>޹=kxGL{ywHmkBF)3mkTSx]w6kqnþ={H=Jel/91ڎ۬7N˖ڠj H  =xվYvͽRsߎK}ZOӺg/U-K^v쥦Npd/c[Rl6:M9~f^ktT)eSXR9<@_@~/B;fxmMXeepڝpڃb9Nڧ.ѯv%(;osDvkRr2!;u#V8bWYpǒ!곈Iy3en+q}kr}ltjV+Ի]Q"Zw-kC&,6# m`Ry #$Qhk;ܲ`:c*:"<搌mYZP ɑ'L ϋ̇S9|{~|VΔ|OʧTl4>DJnT#~)c2`h!08u2ΐhHј2+2|jKDq!BU&6Liژ.wC(5ux~D١`B鄆E hjmEJ.t`|V_ְ8jG'9ySMA=2H|_s^ӧ Wns*3# Y!Q5`s^a l 2Y k/t'f9݃קS@kS_P}"fzQsf-VsHIGaS󼰪΀`)XPyt;ĖW#e{N~ef7%O6kp1- . =BJntzw|Ș66M lbc0lĂS3t|谜:C7PsEN.k W !fc)vdEEcc!"~4W.Uش<Ϝ8wt،8IGGȶ@& TH 1F1;tpw@}Od%i_Ou}[˩A=A5y"F|{2˅z0 ,\%Mi障_1n( `km|Va&',DICE@~ [&L<ȝ%Y,us/ Z1  yAl !#r`\Oy\QT4(]vqpl<+mQ/-'(G r/pN63ګ@ k\?wόrɛMnƫ rgp#J`!sс ^AUi~J't a\}fA'd<^E*$L{" kl)1Ɲ *gOqdxk jqƦ+э\Tܐ_54ڒg1PLlaG$tT94 ^G\u'HkQhѪCFd\Zl˽q{@éS~D\@u\-²l<9]<(#% ErK=|Ԣs"\v+gbfRJ/B$.T?GUt)_}r}aL{={%,G%#OǔaղֿC >h dug.jf=wdP:;UE"W_KMj EZ]%l:.Ȇ}!"p|*J^=<v%l?9*"/0L/Ȕ.z,3]ʮe4yhd mY<=FV6_t=[jwAjęm:=dVt&D{柅QL-2F:zZ cr2NݘFE?sO)? (l1]la^a zD|F#@C~(nD7{,nsް _"`%6zD܏Ib ǵ$euIfN1MVF'b,9I,)(;2B3HׁGSNfc|r! .{(L@'ư-Vn jԾbKuXEvX{;d -γ 뜸sNrS+Dz+t70LEС!\$\ˊtoeǴ %y ?I/MUMeiH48ͧnIB~nn*M]Bdv_tMDeAkwL'gĦ"wb_U{~gbn*A[c3mDga~8 KuLvV62#?I/MsMefXC)sٷ=/XvRVPv<ř+C}pFKʠ(bIFyivݎU 2BF9Pt,@_,v㾥c`Tm[SU'zm˪/`Sj]d]@%AoD$g6 bTW|uAC%z5=y!\oWc1(K.5~&֭UT]kb+轢kMn4aT05pa+MVdn&Y+ӄuۚ}ڐDkv4B1imA%&ͺ6IRrmnF5AkTՒN!^|hS۾n]hr_n>Mu\m&XWYHnT͋l-/V3yh~s+!3yLo{`\;CfǯWcMOM";Lqw g} 2Pq^rtxVJJkUѕ_x 9xy3z@PҧJg[˨H3gg)3~wآOgFE"0ԕPg cåg 6=+b]y5*;+CVu{>ƴ"V~-+[Кs e3zY<ҫ !?P/Sz(EoA}5(eH% v#^1]SS\=05#)jZ.`_ Z#Lc.KFX@OLQ>b*mk?iufpg^&jXs˫)k$>@ s27砻9A'?ш G5~ p.Qtv;%CKsH -:CoGZ%GKs6$GK] a ҃|\,Ys pI } ] -Z2t3v߇Χ'ʙlwٺlْ xΖ -ZZВeor&yYwgg_;o;Лrdhy[y'9z8Z-9Hy'yY,ٹHy'zZ -:C˝w7;ْx;Лrdh>Cw,@zMd woMŀ X [kcgUf,ԋ$K_yv?~Zy 1cjsPWg6œZ%y"IF{x);+/^U^M:| 8WUcxPƫjuo8d `OPUD݀r|IF N~FB͚?MAo*/sX7t,;1{egq.\ s5¸3bwz8?]q4ZOSw^?,+MkƵi Yw|D=8Gd?:Gzq{Fݞb}=8'0_βXgSk&wĄ]^zC)=:%~JpwXwBY&`l>#s&cgi##.DxtNbj^xqtM穵.]]=3 |)_Oj >$8s;^}z8wQ<LnԸ)q@lt0w5b}9ȳ7իac8yÜN Oʂs0@,q.!ԼX'[q*33/v%췂#=нDu"qʨJȨJT0>69gO(j c%bѣ;O!5hboݰsm󂯃e"6Q?lB݆j`Gzdޚ]o l![1qgޛR-7=6GPE[`]ϕh-h]tkj|q+ dgV:._G%qmv/_ 9pnR}-̚=QkR_kOpwcM##DZ.^_OyF #ʆw\_jxW?QtdR.>0([OzAG};uJ{?{f)}} !޺귚< 5TB{D˧H|Z[|Z>vdH<f$ߒ:âI,cFngB, ,ag,{Ҷvs6i:] sC=C)W 5DwNxD7 y:sd:тkNsXjN{0F@cmIVʬ%>e_Qw/ߥNWפeZŲYs#V8bWY&v=Mf}0fzflN#w +fx@&뛘 $E'lXWO^sZ>K,JZ{,PbUpf+5UoeS}+@M77]ڪ̒eR3iŘ OjC0c 0jh&[is`]fFZ.h"7r rp ~Uje)6McyСt^a?Ճ[tNFı" V mkBSx]N0 G<jxDH41w[hlFe8zTȩ"RYj>QaQ LlJo Yrv8'ֲك-GM6$""PJ ֧x,3_smrN[ڎ:`U)zwN:!t&-Y>\yنytc u/$р_ ݈vvvͅUJ@4ZaE6HxV:F6Q>KSy.&{<}Ad:KN?2 n37,OMEN#HF`?- j!j {r+%Aqh $S@%%|9`ƅ}6.?jU 7KBC_{-׮8`Se[ lhF-*,?nt WTe\ÚMOsf^|ŝ}Em ;GFn^Kb[dAݜҥy_g:=h5=#*|3z¡F#$̣[^Y EO)ـ~Iȑ8  Ľ&C}24 L >bXXFkhFWI. -h-yU`F m<}hRvTf}|dT@OP\I' 0%U-b2֓yxd^ƣcAēwP)Xͣ KZQX!+}~CX@- >9Fwx+$@>,#Xٵ1vQ5%tᑄJ#5̖3S=R e[OjRgfM߉ZpE9%辴tc⏥R1. p8Ywh;w@^tug.XHT^?2!+tU#_:{*!nygn:@ Zgpwp٧P栢=ԇ|Utl7~䙔@0 +h%\'̊!Lu`tp/߹÷0!:lH- gA ^Z1KO_<*•G}|;n'e}*#(4hB9Th玡NŶ@%fĠpo9,vrdԬ,qcD-7= 7V >v`f1B+?`ؕ?ջ+yKV"o6TpŚUk}"bɍ7!H*3(Tu|jGyŪEe18-BYYdf[L>='4"}\x乢2EOcvxV|MڡBs%ȧԜ?U$g{075պ[=h`Iu7ޡ1t(f\%}R@uPA(@0Mz>n /:{7l6u]~m'3u/OOX-?Jk3pMNVnuS>q$t>NSgِ,yfzkf6{4!ڵ Y̳X?%ţG|j}~H)'FCy6)$.[xgߍJ<MC+QgPX 7~PT֜~5=4WaH]0/qJ!Ѧ?q?+kpB7ޠ">G}W=\&fH0e kƲ]N0Gg45*O xFD ~Pv_u9%|?vǾal*.p,S?5jPt~ۢ4$FMm3\9\fVdٿIuKk+s]h?:iĺ-^pYljkeA ֣;$3~:LH Ip#W,%ebbad{O`eE}9!mB ,ƈyAUkb]Nø ˌD_ˁj5j%u^׸ `O g9cE @=BHMlk@$ ءۖ#iBOOA\zXCR%ˆ6 _loNVL?7\iB#~_l5zq#wRf|{jSKlcԁt*=LfLQJ_Ke[LE(EU0"R4hbR |;i@fT,}X?GBP7A#Hk2dwըU¢ {3eKxŨ!tϼѝ;ZهMK+2S:¾m:ʋT,شt|H>(;:HfT+_oG=3fLál,0K@I rHmD-Kɵ""7@8bRz=Dmc CF_ŀT-DM2_=Wl@F䴦"%b||+h Un+z`Dv~_ClO$>Y Bcyg |rp]o:8khۘM埁/W^ֆE^ls wfY~(cUSM6:-=j0y-AgЀNN2g$>+y| GA]cپ6m n5v{y4y:l<5y7/CBqP!L||R۝I׷Iw|X\Zꑽܳuu}1c%(Hh!!&>{Ny! BC~{ Uz-b i>hTN./hY}_sPp͠ '.D1bԿoK'mCn0H]_ _&kdx3{G!~KdlfPej9dm5Zq[nJ;#:u|CC-y Oo!N獼7;tYW[kcd [@P {q7wΎd'>{*QVؿMAN: Zl]ѓ䯹c[}: pz$1 U(rtH):=)_]2{xlu:0'Y0v~p %Nj #o^'X՜T¯-d'dT{voƧ߇&9ގlOz|lxq!leP>ޓ 4lBޞ}yơ$9Eg/>_Y\j*SCş9Pdo/g_J7wG`fע4>*04yWĉ &oD93mϻL}5Čގv$OEA0h61s_ qhL`Iw^%M2g 0=f_v fM7R;IEJQ04Ys N[4HWR99s_;o@O7 @s21FQyhm`:o_ π7:zAE^,έx!{>!7r#{77;"{&/0WßﳠA[yυmk}ݲC,NZ M9@`CtD"<p& ^K_J}GR}/ +-khO.ЙZ"W 83;&_ EKًH|!GCVyhKj-үP~Z̚lpyN7;aACNh }p*}FZM8oMGeh ŕW&;0ܕ +$Dz sD %0x/{gݷB#cpD˵#e"K/) !Y#̓Dlg4b>EM3T (9&p~-'GɑlY[?E.`ހM Evn4s<{nҟ4z3ƿM(p4x։m |&x%Z@({~N1qy8FPjDo6SXyhr :JgǾfN&b7Ԋ{dK<ڜw#sںN}xU~Mf_ 244yYhtvш̪>Qc8{Y oߛ|u߄6W(-ߺȍ# n֚MPj] Mp# y}XK sSU>q݁(yug5s3q !{;ߓ"4dG _4>7IH4(.#B ؜cz (#}%şnMC- }|[ϸ%6Pe>4RQoZ ]r;^@UofJ_nnaL3RlP?yרfchRr$R΄"rKG,-cJ铞\ੂJq{} y+wܥMYaq$xH{h2؂H!XG-Cz+Ng÷M#Y#dnrjE!ٯ.Th";vv ׏I42'ZJFBѳ$.2n;ӹtw=xt劉f>W:m+zl<Q CsBL@G1RB9zBG/u9߱\!p"Mj} ӆr)nST&t`&YfpKOm5oI~6;6h'!aG^drE% v <R1%/LPskK\wIΌ\ӀxI7Jb(i(H<'ߟ-Ԥ)ycNŚ:V J>̛jATg /d^YOCrG:ic;CʀW4' hJ7_sQL3!Mۯ6Ky{⼲q 7x˼`[(sk349bx7|q T zըH?-m䙄3ΐ{K@lg)ݺ@ RtiMd\zK.(\rZȞqp~M`d6 /wOd`.HyEϼ zd&<ʉdd9}hR^օ=W"3D_=,!l,ŏq?E?BІ^^c] J*סIq+\bjō 0}6?t6Gл̂:?s%V/Df= ~4_ M=? uA? L`R.[ B:RZ^A)D(ϼRSJu!lꟆ&/Λ cM}[cXaDe(_Lz"oHqcTxwt]8a S!BɄL}XJ" Y[8—>;r xDv؅7Q/b .=_U$?&Y ]X>e F€"UE,hi#z@7Hzc/x27m0"f\0Ѓ>#au Mb5s$Tvb18#{c4+Ώѭ _'2Eeoߟe-2$i%  MrNMAN.9$Dayj~\l;]?B~^Ng~5/Bmu%hk^BiJʵ+w @F!M*yg_8,|:ֆmWàc 3FGu~2'uF=!"ct8/ZԸruڐGtXCg5ZbKZbb[^V ٤)E=+!KΔ\C50!xV~&,~"1>ύ^/kdCmBb4 rQ"x D!W'ܻ}QΏy"Bx|31H.Ͷ2!qb̬?M!?q9><-lW]M}m5NgO4Z{m݅o #CÇM] 2h2_AG@nn*I J<&ߟ Jk`:1Ϩ#{D+B2y\i1^_E1lAbBAnE FX0>>H1'H$K[~ l5n}*jV9/@>RL.$?m>EN$D'~.%8yFc`}{C;+@03Ft̋g; $O)O:f |"""yAБlDk#/{φ7$Ő; Žz ,^rp"~}5C|pKAyɼ"7zq%{SJ{.̥܅ؔNICC!nVzСÒ+e1f(G -/3h)I=қUbPxF?M;YͶTj^zWyr>&5zRnqO÷ My}vP/vFZ4Z#GqES:/]`<{f#y3lfT9FG Oy6uB%|@uf~3˙@}XSwx$"Q}S!T AHP!.Eev_\κ7+miy4qv0‰jdž?+o^+-Y>VH?uhR?wX[ЦKZ$'͡WF E c[`P[Џ q\_]R +zZQ>3jQÉ(cF̬BYB-yFvrQYc? PCt8|];_ svXV +P٭o)1[H>fo]HL@c9w ttW#0*-ZDx}n;,^y{Rn] *j^D;b0 7 63&7*}QxoɶR^dte3a(ԍʛ?ߚW♰\#zz>% T,ȦRkYp\V$PUઐuAXcg{ .uU69WDԶ,|=?_xb}N@;|P%})A?zR!@@P?t@Jy1P{mS̔eYZ^w^1*| ֊9L'd !P'hKh70b:lf'bYykxDm1mx*|u'8B@(čbJJc~0y7ŏz #9{khA׿Y&Y7NU6S@cFLRz}n@*&d^O?bF4k@~O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?YMw} mkBTݎ8x݋]Ə3IaՌDM1M;kbĪi4JJAJ"z!H x !FA"Bo$z8<{e3V4sd"!ޏuo_{;aR|7|(Gߟϼy#̟2ϼMWә3e~gSg㙧3Ofd3[?'2{P迏9/fؿ39 2q.b2*2|9_3g^N׀[5i2LÞy4Q%s[E9Y|~Opiqߕ+'g=1_}=oq5>??g5q_8Vq߇{y5UQ̶=}><#|j4te\p&'[#cǚ?}l=w3W/r1ޏwb~0yb1TkαGGGܗ52o*G?uzbp>~ns:Ǩ  y55.z=>yW/|7Yq<-y1ۘ.^D͟=e~X?xp Gbc,ؐ{V7w@rKOI1FsW%χ{x?5 lsGRl99>>p!w! q)cbCjSX/ W{'c>?:y@}>z={qµS_X- q?]>(r?cjǾ=8p.pO{}ľk56t*55.D| 5z}|Xi 5'V)qO/7>׼J+z2aJOG,)k1_nW/?]Rӽ>rپ`?K<^|r{cm\iܯLw=bx/ck?[Uw4;6el+ }&kOj{Ki;Vu q|ƌ@½ƾQ{7 [ձk[P׆{=z?x;b^4vu_:.d|5ޑo,>ľOԜz?^;׍q}xGοUܣCw~x?Qéy%j ʘl =(s?[;^d<Ȗ9@g>tDEz_d;W}=厂;n{}ۧw}my=]߮+4i2qO w{*{ '50= ǀg~w}zϳ89^Wgo4{2c4-'uu`=uwwh}9Oơ/_].>e}JÂјgWSc^3'F;zS/,~߶z=L{uO]smA-}}3磾.mGr_y__wޏƸ3>\jc1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1{1ŌmkBTАx흍) q ĉ8D^>׻gI@XjjgiЃ`0 `0 ?ϟ|:seQ3|ӧO|:2|.};7eGFO6_Qv]T]^ˮg{>pjzkuo{yye?{-x/ D:3D&򈼹e^Hyi#/OGzϪ߯_~ :sMe#M3Y#=2 QЙ[\s=E8}E>GȩT ڲTg-}VfoSVwzV}./>~!?U1<#}=F[ ~QڋBN..+푹^edLo+[\-k dW(}6q$#?z6Bөi?L7!3O_Q}Пuo[=tkȋM!'}/Ƈdr2_Cﲨ: `0 :8o=+8-4}۞cĥXdq{bUq©ήm!ƶg*ΪU\z[GA=^+ru{LV U?)V>ғ)x|Yҁgi\yi^cUo*= !TY?rfgWsʽVn*VX#=Fϫ+[F~yH\L~[O҇h5ݵTow|Sfӟ+);F;:x )/OS yUo2e)Ve3'wgGg=J^`0  ľu kU,Ksؑ5nY,bXw{ w&3QהNQev ]ƷgcH˞i{A3I8hwduwUIWq8I>+@pQşGcZ\ƪUߝ]/:3d;ɫ:gB9R|GW~w2;fzt|+i5nΟgZY|<1NyŬ|E7k?z/k><=Α}N΅>uWydʬdz `0 *\?W8GY:Dgcg< 2+'W6qn؟{ru"wU쏘~c#T?+y{Q,,^qF/Xv8.֩g3}ȸOP ~n%hUG4(_sn|W}Tg&x^c,Fѭ+ <#+}/Uw8BRh_|33!mr\7U9m({ѝpvew[xG]߱?g;,nҽow8]וb?OV=Z_#ve?vN_WrYLo;1g9pV^G~>[_vNOS3 `0Q[ veO\k^8֔v<Zbz\Opbn$~}oz3ј mK vU]^iNWA#x딫jt q :E= z%օq)CcYEqyRG-+u (K\hP'*^ء^q=m=y|Kvūe\rȊ4={W1;=ݷxp;o@>ȘT\Ԏ+C=*ɫ|GJOCW]x1.ﵠ9_Eб Vq)v(ʑ}[GwǺ{-oSdו_˞׃2;iT&w*w:g׭SOsj%Z[~_˯d֮+w]7 `0]kIu+eL]ւoA^;=GR?v쯱;<y o$N1紈=:ߥPVu< <&3KyC/4r)i=*/|Ύ^]QNН1qGw>ù{ ?Kv:A}E:_n+{u=rq͓̳]>>d}+|L01`0 leg:׺񶊝`W,3O?]\9P~[kOWiGc~)-<w.3q}'vuw$Vnv(r52S;Wk_Kϔ8B/hEՠ'9w?K;x:x<|@cϽVyc@ۖSw8Bq]=2lBe6V}eR( VeZT4ade2ޒ+nYBTqSߔ<[&=f[|szP)G}{Zׅ3n7jpWwftEw[ǽ;`l? `0 `0 `{~i`oLy>uoi\qK|}7Svu9G쯿c¾#>,jow{ՆݲL=mW2u_8دjo?kD߱mw>#}E:OۡO;y`$j0n mkBTXx흍8 FSHI!)$FRHnw HYx3ꇤsaaaaxIǏ'U{o_ھgW9 o'GW {>~Jlo߾)*/N\ϱov[iZ_ձaJΝ/:6O- 92b?Tlk%?_21B sY5>:>c=1Ow y^- ڶ,XzusM#גU]>H_yYv!ۉ_mi Rus]Xm_g)YY)m]y,m z1aaaxEߓGקo/Y\k6xjgH|yu.\aæM&wk#ϐ$?]Mo\Ⱦ,/ڥQ@~6s?)}, l gX #vQg Bٙ^uのuhm?}{].~}v_J;xogJY]޳@.)oqC?}>@Xߘ'-(W? źvƔOʙRv[K?[A}?-wmՑ}g\=c}M ggg DŽ-B^k_g?F? v0||؎=ǧHPgs/hؑI t~{n^}ZyD5XWvO)"c0vY Z|~_%/,p\ɹyΰZ/;/xs_9?Pܯ5ݻ\[y|č8gʱL{? 0 0 _k3>z_\S |<)b|7aaaxn.ta?l^Cvkؽ#~e)3<3^kdlc&jK+o"e<.ʞ`^(3zu l+6v<ï k7]/lc[`On}򚄫 G뎱zt^v2)?;Wmr5ocIz?Ozx{&!ez."ѯ 1Gg{+ҏlw<=}GݽFƨ^)zIpG K֜{{e G12ۭqiumf>.}~a? 0 0 [u+7Svq֭y΅ ?ނ}XwŶv?ߩDZۓ-q/?߳=<~#>Fk"qzrQo 9r,nY[;o:)@-`ק-7({߯S@µK9֠ɸ>:n3 _[_*mtcmC>qSL=<6;ǫsaaa{xˌ\ފpx?0׋#5zяc]x^l򼠕(f:~٣^lin59W~\;?vn6erUbS~v^U O7O(|;+SG4|?f*?rW~2oNٟS9~daևmH6mX[J~s.ym4ٶO|Bd/b5ɿyU? 0 0 0 0 0 0 0.P~*1@G\⟿KrKXs2(ߥ纎J8'>X@▼QQbqwx b)_K|v 1M6kee-2Ǜ59?K^E~9ϱQﱮYF8N?~;:=J<-tĒyNAgC \NXKs)'^Kg\~2}6}Գ)n]Or^j~"{p29w6/.z-v:+M{WJYZ굢`% Ҥl9ힶկ#OUz+U?;sd~vND7*.Y+v:ye;8}~|+ÑޅN9}{Bƞ#txխsXɿkSV/uJ=o G<ջL'L:D]6jfgLz/+ؽ[{rCMYq~[{yy czA;w9zszWHVax3 џTfmkBT xڍm0aaAXAtNuө~"B~v(I$Ic i#Gl6p8޾s[ouv?Ru߯+fԍ^|}m43ϭu!Z9RUY׽B,z"|~>/|RתY̞EGߔ뙷L?:fV\꺯Pv#R>cNb=^Fz=yNI}.3?3̥*Ǫ7٧ڞƵ2~zWİg#g&2yK;wʞ2vm"Ggʼd~g<[şXlk=^k͞Gy\ׇ3M^&}V3=3ڣ<_(녾v9> G@Sǿ99Gy*"QYu*lz;{-/9v=Q_s>c),k:gQ%ԝ,SFwA2vWcWqlׯ[},g7F}.2˘ڳIbpahK$.@/_᧼_gwG'y5\=\rߓ+N@ur+'뷿>x[ޮy;{HrFqئ`L02%*s&7{ǒ8(ԑeRJOP{O`"Kv3'PZV&%EPΘ8cff@ /Yt1фEQyǒVǨ&C3ds~3Ft@iΎ@ҶݭĐf 0꓀ 9bXr)>Wu UJ#d)x EIGߴWQ[o=K7YC^4O|>(:Ѡ$d n7ub)xY>J%{kw( gz9nu aIs!gfOs!KA[EsMi~ߘQ*۷(j>2@r,b\qgk,=E@zt@ݱ%%, Ɛ f3dbɰ[f)i^ߠ0=f`L(CuXrBɎhv: *{9 СFxB hMVA6#2Y[O<eM 5dǞX{D3J{*z>;5;q|*?ai 襚0^Pa)_@(ʐZ|xW;'@jmWB;vRDԭz4Y .h\b*Uﻙdb3Z\v"0z2[xwݿ_\#nz-bu嫴D^oi *#WYeGsPP1f,k&#1gEOfeWmQQ5K[7Wa w*5Fh=,ʐ(2T¿;{=&O)<e`j峘`cp lk9-H&%L׀ZC"!WGY:/Ca#9̓:r@|A8k)ӕZ ՙu0\Wnтa.fmX{+j{NN9yt5e whRfcer>aO5[d.au3 iɨ-RZ?dL(CCIk }ˡbT6I;bk0 ? +_TxQ[ *!CϮ 6*ݣ#">DGQɕsv6۲ [^_ Η?N$ wx!12"zvc-[|/}<̕{4Y5бdOu7`fF;Mj2H=JDy%:11DG^U(cf `yE6<HSIENDB`contextfree-3.0.5+dfsg1.orig/src-win/res/newbusy_f02.ico0000644000175000017500000000427612076364074021464 0ustar brambram ( @444fffPPP333ggg     ?s7????contextfree-3.0.5+dfsg1.orig/src-win/res/newbusy_f09.ico0000644000175000017500000000427612076364074021473 0ustar brambram ( @555fff333hhh444      ?Cg7????contextfree-3.0.5+dfsg1.orig/src-win/res/BMarker.png0000644000175000017500000006452012076364074020654 0ustar brambramPNG  IHDR( @nsBIT|d pHYs  ~tEXtCreation Time07/17/05 㪁O|?rP8'+;4'H7V`eHmkBF)3%mkTSx][sƒı%vleEU[[?H*&%l9/.$,˒WxY3 WQô4oziPWU[4pҭbִp^[V9ګ &ja/Ӈ7~'W+eK)N+ ʙsp8m9Mjʟpƙctfx!ݹm.WEt:sN2{Tg `{=7&tRC{=Cv/Wә d⠍t2 2A] Gag:r\A>!n =DP.QP xfPڔɭ׸U&"$4$En5S&&z}s|͜wca5&/Cl=I9keR YVf&C L֌.h> CcX_* A K6zb(/"0>ñy*]d֌vݾ5AL}½+Ujz+|ksPX.rĽ:3EE!I^eR}jQh"8K~\bCԞ=P3r{ g+2aBHv*PS]ʀI7ΐhH$ƜѴ5>5y"XY!q5&6U&4&$ 5JM 7$jg4U@kWk+H PTֆeLҐiy=?%'ςޜzS-oK&k%_|4Tt ǝp̏˘(:=| bW3X۵h2qf*K$f8 ĉYNwc5/  MHxi s*OTbT/T27 ncb X0dDMF&'`aGtC$Iʣ#E{N~ef7%O6mp1- . BJft{w|H66- lbSe054DGφq&:O+KgdRl\{hP13 #Hьӵ%E~q?T>qsDDvķeV[d|vG͈=d$r?l4@LJ*:dNd(8^ DgגN_7|:dD^s!29_o3c(DͰD4 <qя$KcZo{baEȀiBWҧגEȒLj UVrOa{ Lal܄)l_KH#45*B֔s,]\箿F^rׂ]A1 J?bQXS+L8 ~cbORd*ip/'#NN`*vCn[.nô& 09!e!J %1t܌32@~Ox;5 X&^=B,DbP b3`-Qz{CCj'.xܤxd[cNK :Bw8 ʐa<;zS:m'_z8S;ge LJ9Sa OE$'*hNM Ga.ʹbc0pdh*CFdTGT lyqAéSvD{ @"يUdEXWβ*jv&:1&D1pJ(7.k zԢ52".=ЬUC(y|$BDyP%IWڜbk̰ + D.&'/`7% YjEשr13Lj,/`0K`zFj6poI2S|K%s^eZȤb!8KpԄuMW[(K BQL^1pN63yծsSQb,)"YB!-h!s 9#/0x}2$.el1Z^XRf2ъɾSZĐ"-_/ѲGDZ5g ']:0XMV^pZS9){My WL\/\yg4BJ>c7?_뱗T41uoN}p_/,i%>bkuX<wX -γ 9)֕Ӳ+t70LEС!\8XU.eҋ~2cźVvSn;aDzT=~sX75n*M=Bdv8xnjݔn|"* ZgcdgQ[e'Ǽ;r^7ģ:*;(Omy=OI$qyYE,JdZD,8xnZTd5<}u uźhS2SD "keW @꡽Jhڛ]8} Ez>g8ˠӷ`}*ҶTuۦRLݢ C6K81S4N ʖxe"k~Ц~ΡƚM"uy*MA_pmK jbĮ5S P^ъjPը5aT07Z-}ե,̚Gr3Mش٧$Z\>e4UicTW+VmA%f6SrmQ%O)yƚآLcA7SJ͕" P r^C6U|$utI v1FgTM+@V[ڞ}6͋4]:UşfzȦFp#Ui^č઎<*3-fQjG|)ͬA7SjSOɍy4?nE%ڪl;}uoVb`:"KAI1mzF_FtݕwE%t}s̕!| tSJpqA-h2)"prie:_zWiU펐Nß_X/~sz(G߂";؁xt3NM4酩9I!2r}m%04djILGZ\ECvM$ͻՌpXǵx=KG3]%A'/h_± 5 p.Qtv;K.R2t%Cg`(C+z%G9GWK.91^h(=蒝k%;\sp̕ ]2]3td蒡K?p6!)Z9/9;l쒳KU8d蒡E-d诙%Ufi%;?v.3Jva/de]%Cga1e]%Gq|w%;?v.3Jv.9Oɼ+!0tyW2tY̼+9apvyWrvy'de]%C ݅P}o"chm ul=~k)U~͵u:8iysٗR!xn5$rd݋ҕ箈pZ]Oךu /mϹ>1<㊠18zD,㿢' cDyS`ڷ`h$D -%C ]2t+X/C?T'rP/\/}mۡܺejR`8-:|TҸ:$ni·|Ժ,|'ffe8M=ރxU{6ŵ0o&2^Peֽhlgm74v/nݫΥ {m%5 F&q3j~\n\A=Ywc{eg9\̵Ήa3>YOقz#e~W'I_]'IQ#{۠qT╲=R$߂#ȳ7a2yÜN eIcxr:{ ?j(n8{ba-ZԵck2 Y f}&- +G瞶N۳SV }=\=T[ε< <)._h^-ԸLqR̋faI[yL^d"2y˨D(eTyv.Ο0]*V7zTSbg *e/ٹF+ ӥLl|eC۔R؄ ۵ʏJ=sIޚ/u6P[1qg/[>=6Gs?`en>3어.l= dgV:.O^z1_=s==mQfMXaԚ46ӢC}'|V|:xܡEqFdy?^ h9咲]/'(O۟4Ww"~ <[&?gJ:)9y? U>}<>C,n\jAƸ3f!nӜB)fXȆ߇.&}쐧h\ԍ͜ݏ ]Q6|WǓe#KnMrɷ)EQz+h:y5?Qia,o59֣5~O*[&bV}74ኴ7A>W~m%7R_5tƼ"b;$E÷aâޕ,\ߏY> 32q{r +nVt[oAǤUY162zn(j1GtڇK*媲h:r9:sN2{Tg `{=7&tRC{=Cv/Wә d⠍tz>O(ɾɜ(p8rcFY:Mh)X8}BObϡ_ݬތO x91T8N7-y|r[ӝͪ7f !a;nb 16!`9&=Vt0. 8_ǿ-W5,M{Ċ1`Lgݯf v1]V MB-fh(`B?L+ZhJʁpNzԜubfJ,Nm,G՛Z6+4VBe9TIϝ!ԍ"p0oa-W}`q'j$5X9#$uz #PQfurԣiVӥIU&SӔfHQmYj~L`[<&y& g't߂Ϻyeuo sѯ`-f-?ـ؀VtANެG'8Go0aR-++08]zX T`ow_ノLnGf*xdmkBSx]N0h G)ހ؄&Mfԃ{2UrBN-Hu \UbP[*TcUimc}A AY|ppOd+g/vgft=\H>)K/-*[lO\fj *ҏԷ ^5*q!'Gˆ/7I[9ç*mkBTx}+$+nʔiSL")HdJ,DbH$T3;;W֊z]@&-Y>\yنytc u/$р_ ݈vvvͅUJ@4ZaE6HxV:F6Q>KSy.&{<}Ad:KN?2 n37,OMEN#HF`?- j!j {r+%Aqh $S@%%|9`ƅ}6.?jU 7KBC_{-׮8`Se[ lhF-*,?nt WTe\ÚMOsf^|ŝ}Em ;GFn^Kb[dAݜҥy_g:=h5=#*|3z¡F#$̣[^Y EO)ـ~Iȑ8  Ľ&C}24 L >bXXFkhFWI. -h-yU`F m<}hRvTf}|dT@OP\I' 0%U-b2֓yxd^ƣcAēwP)Xͣ KZQX!+}~CX@- >9Fwx+$@>,#Xٵ1vQ5%tᑄJ#5̖3S=R e[OjRgfM߉ZpE9%辴tc⏥R1. p8Ywh;w@^tug.XHT^?2!+tU#_:{*!nygn:@ Zgpwp٧P栢=ԇ|Utl7~䙔@0 +h%\'̊!Lu`tp/߹÷0!:lH- gA ^Z1KO_<*•G}|;n'e}*#(4hB9Th玡NŶ@%fĠpo9,vrdԬ,qcD-7= 7V >v`f1B+?`ؕ?ջ+yKV"o6TpŚUk}"bɍ7!H*3(Tu|jGyŪEe18-BYYdf[L>='4"}\x乢2EOcvxV|MڡBs%ȧԜ?U$g{075պ[=h`Iu7ޡ1t(f\%}R@uPA(@0Mz>n /:{7l6u]~m'3u/OOX-?Jk3pMNVnuS>q$t>NSgِ,yfzkf6{4!ڵ Y̳X?%ţG|j}~H)'FCy6)$.[xgߍJ<MC+QgPX 7~PT֜~5=4WaH]0/qJ!Ѧ?q?+kpB7ޠ">G}W=\&fH0e kƲ]N0Gg45*O xFD ~Pv_u9%|?vǾal*.p,S?5jPt~ۢ4$FMm3\9\fVdٿIuKk+s]h?:iĺ-^pYljkeA ֣;$3~:LH Ip#W,%ebbad{O`eE}9!mB ,ƈyAUkb]Nø ˌD_ˁj5j%u^׸ `O g9cE @=BHMlk@$ ءۖ#iBOOA\zXCR%ˆ6 _loNVL?7\iB#~_l5zq#wRf|{jSKlcԁt*=LfLQJ_Ke[LE(EU0"R4hbR |;i@fT,}X?GBP7A#Hk2dwըU¢ {3eKxŨ!tϼѝ;ZهMK+2S:¾m:ʋT,شt|H>(;:HfT+_oG=3fLál,0K@I rHmD-Kɵ""7@8bRz=Dmc CF_ŀT-DM2_=Wl@F䴦"%b||+h Un+z`Dv~_ClO$>Y Bcyg |rp]o:8khۘM埁/W^ֆE^ls wfY~(cUSM6:-=j0y-AgЀNN2g$>+y| GA]cپ6m n5v{y4y:l<5y7/CBqP!L||R۝I׷Iw|X\Zꑽܳuu}1c%(Hh!!&>{Ny! BC~{ Uz-b i>hTN./hY}_sPp͠ '.D1bԿoK'mCn0H]_ _&kdx3{G!~KdlfPej9dm5Zq[nJ;#:u|CC-y Oo!N獼7;tYW[kcd [@P {q7wΎd'>{*QVؿMAN: Zl]ѓ䯹c[}: pz$1 U(rtH):=)_]2{xlu:0'Y0v~p %Nj #o^'X՜T¯-d'dT{voƧ߇&9ގlOz|lxq!leP>ޓ 4lBޞ}yơ$9Eg/>_Y\j*SCş9Pdo/g_J7wG`fע4>*04yWĉ &oD93mϻL}5Čގv$OEA0h61s_ qhL`Iw^%M2g 0=f_v fM7R;IEJQ04Ys N[4HWR99s_;o@O7 @s21FQyhm`:o_ π7:zAE^,έx!{>!7r#{77;"{&/0WßﳠA[yυmk}ݲC,NZ M9@`CtD"<p& ^K_J}GR}/ +-khO.ЙZ"W 83;&_ EKًH|!GCVyhKj-үP~Z̚lpyN7;aACNh }p*}FZM8oMGeh ŕW&;0ܕ +$Dz sD %0x/{gݷB#cpD˵#e"K/) !Y#̓Dlg4b>EM3T (9&p~-'GɑlY[?E.`ހM Evn4s<{nҟ4z3ƿM(p4x։m |&x%Z@({~N1qy8FPjDo6SXyhr :JgǾfN&b7Ԋ{dK<ڜw#sںN}xU~Mf_ 244yYhtvш̪>Qc8{Y oߛ|u߄6W(-ߺȍ# n֚MPj] Mp# y}XK sSU>q݁(yug5s3q !{;ߓ"4dG _4>7IH4(.#B ؜cz (#}%şnMC- }|[ϸ%6Pe>4RQoZ ]r;^@UofJ_nnaL3RlP?yרfchRr$R΄"rKG,-cJ铞\ੂJq{} y+wܥMYaq$xH{h2؂H!XG-Cz+Ng÷M#Y#dnrjE!ٯ.Th";vv ׏I42'ZJFBѳ$.2n;ӹtw=xt劉f>W:m+zl<Q CsBL@G1RB9zBG/u9߱\!p"Mj} ӆr)nST&t`&YfpKOm5oI~6;6h'!aG^drE% v <R1%/LPskK\wIΌ\ӀxI7Jb(i(H<'ߟ-Ԥ)ycNŚ:V J>̛jATg /d^YOCrG:ic;CʀW4' hJ7_sQL3!Mۯ6Ky{⼲q 7x˼`[(sk349bx7|q T zըH?-m䙄3ΐ{K@lg)ݺ@ RtiMd\zK.(\rZȞqp~M`d6 /wOd`.HyEϼ zd&<ʉdd9}hR^օ=W"3D_=,!l,ŏq?E?BІ^^c] J*סIq+\bjō 0}6?t6Gл̂:?s%V/Df= ~4_ M=? uA? L`R.[ B:RZ^A)D(ϼRSJu!lꟆ&/Λ cM}[cXaDe(_Lz"oHqcTxwt]8a S!BɄL}XJ" Y[8—>;r xDv؅7Q/b .=_U$?&Y ]X>e F€"UE,hi#z@7Hzc/x27m0"f\0Ѓ>#au Mb5s$Tvb18#{c4+Ώѭ _'2Eeoߟe-2$i%  MrNMAN.9$Dayj~\l;]?B~^Ng~5/Bmu%hk^BiJʵ+w @F!M*yg_8,|:ֆmWàc 3FGu~2'uF=!"ct8/ZԸruڐGtXCg5ZbKZbb[^V ٤)E=+!KΔ\C50!xV~&,~"1>ύ^/kdCmBb4 rQ"x D!W'ܻ}QΏy"Bx|31H.Ͷ2!qb̬?M!?q9><-lW]M}m5NgO4Z{m݅o #CÇM] 2h2_AG@nn*I J<&ߟ Jk`:1Ϩ#{D+B2y\i1^_E1lAbBAnE FX0>>H1'H$K[~ l5n}*jV9/@>RL.$?m>EN$D'~.%8yFc`}{C;+@03Ft̋g; $O)O:f |"""yAБlDk#/{φ7$Ő; Žz ,^rp"~}5C|pKAyɼ"7zq%{SJ{.̥܅ؔNICC!nVzСÒ+e1f(G -/3h)I=қUbPxF?M;YͶTj^zWyr>&5zRnqO÷ My}vP/vFZ4Z#GqES:/]`<{f#y3lfT9FG Oy6uB%|@uf~3˙@}XSwx$"Q}S!T AHP!.Eev_\κ7+miy4qv0‰jdž?+o^+-Y>VH?uhR?wX[ЦKZ$'͡WF E c[`P[Џ q\_]R +zZQ>3jQÉ(cF̬BYB-yFvrQYc? PCt8|];_ svXV +P٭o)1[H>fo]HL@c9w ttW#0*-ZDx}n;,^y{Rn] *j^D;b0 7 63&7*}QxoɶR^dte3a(ԍʛ?ߚW♰\#zz>% T,ȦRkYp\V$PUઐuAXcg{ .uU69WDԶ,|=?_xb}N@;|P%})A?zR!@@P?t@Jy1P{mS̔eYZ^w^1*| ֊9L'd !P'hKh70b:lf'bYykxDm1mx*|u'8B@(čbJJc~0y7ŏz #9{khA׿Y&Y7NU6S@cFLRz}n@*&d^O?bF4k@~O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?YMwP_mkBToxOKav+HkR*5A')֡ `3DD ] Ńڥ<{(\vQGk6!3a~?o ߿} 𶹵k3+ώ2VGkÛЈ=JQr{*7Ǣ8^(z$v:y^XݞJ%ϾD뙱hvԾ&''KnQ0P- g[IkdY|k,˿5:ʲǛWp;/ZdݑlGtߛt2_N9ާ~qϿs}5~I?g@َJ^]Z;fB7>0>KC>kX+=W7>u{;> 7ܵJa0z Nc mkBTx흍) q ĉ8D^>׻gI@XjjgiЃ`0 `0 ?ϟ|:seQ3|ӧO|:2|.};7eGFO6_Qv]T]^ˮg{>pjzkuo{yye?{-x/ D:3D&򈼹e^Hyi#/OGzϪ߯_~ :sMe#M3Y#=2 QЙ[\s=E8}E>GȩT ڲTg-}VfoSVwzV}./>~!?U1<#}=F[ ~QڋBN..+푹^edLo+[\-k dW(}6q$#?z6Bөi?L7!3O_Q}Пuo[=tkȋM!'}/Ƈdr2_Cﲨ: `0 :8o=+8-4}۞cĥXdq{bUq©ήm!ƶg*ΪU\z[GA=^+ru{LV U?)V>ғ)x|Yҁgi\yi^cUo*= !TY?rfgWsʽVn*VX#=Fϫ+[F~yH\L~[O҇h5ݵTow|Sfӟ+);F;:x )/OS yUo2e)Ve3'wgGg=J^`0  ľu kU,Ksؑ5nY,bXw{ w&3QהNQev ]ƷgcH˞i{A3I8hwduwUIWq8I>+@pQşGcZ\ƪUߝ]/:3d;ɫ:gB9R|GW~w2;fzt|+i5nΟgZY|<1NyŬ|E7k?z/k><=Α}N΅>uWydʬdz `0 *\?W8GY:Dgcg< 2+'W6qn؟{ru"wU쏘~c#T?+y{Q,,^qF/Xv8.֩g3}ȸOP ~n%hUG4(_sn|W}Tg&x^c,Fѭ+ <#+}/Uw8BRh_|33!mr\7U9m({ѝpvew[xG]߱?g;,nҽow8]וb?OV=Z_#ve?vN_WrYLo;1g9pV^G~>[_vNOS3 `0Q[ veO\k^8֔v<Zbz\Opbn$~}oz3ј mK vU]^iNWA#x딫jt q :E= z%օq)CcYEqyRG-+u (K\hP'*^ء^q=m=y|Kvūe\rȊ4={W1;=ݷxp;o@>ȘT\Ԏ+C=*ɫ|GJOCW]x1.ﵠ9_Eб Vq)v(ʑ}[GwǺ{-oSdו_˞׃2;iT&w*w:g׭SOsj%Z[~_˯d֮+w]7 `0]kIu+eL]ւoA^;=GR?v쯱;<y o$N1紈=:ߥPVu< <&3KyC/4r)i=*/|Ύ^]QNН1qGw>ù{ ?Kv:A}E:_n+{u=rq͓̳]>>d}+|L01`0 leg:׺񶊝`W,3O?]\9P~[kOWiGc~)-<w.3q}'vuw$Vnv(r52S;Wk_Kϔ8B/hEՠ'9w?K;x:x<|@cϽVyc@ۖSw8Bq]=2lBe6V}eR( VeZT4ade2ޒ+nYBTqSߔ<[&=f[|szP)G}{Zׅ3n7jpWwftEw[ǽ;`l? `0 `0 `{~i`oLy>uoi\qK|}7Svu9G쯿c¾#>,jow{ՆݲL=mW2u_8دjo?kD߱mw>#}E:OۡO;y`$jE mkBTx흍8 FSHI!)$FRHnw HYx3ꇤsaaaaxIǏ'U{o_ھgW9 o'GW {>~Jlo߾)*/N\ϱov[iZ_ձaJΝ/:6O- 92b?Tlk%?_21B sY5>:>c=1Ow y^- ڶ,XzusM#גU]>H_yYv!ۉ_mi Rus]Xm_g)YY)m]y,m z1aaaxEߓGקo/Y\k6xjgH|yu.\aæM&wk#ϐ$?]Mo\Ⱦ,/ڥQ@~6s?)}, l gX #vQg Bٙ^uのuhm?}{].~}v_J;xogJY]޳@.)oqC?}>@Xߘ'-(W? źvƔOʙRv[K?[A}?-wmՑ}g\=c}M ggg DŽ-B^k_g?F? v0||؎=ǧHPgs/hؑI t~{n^}ZyD5XWvO)"c0vY Z|~_%/,p\ɹyΰZ/;/xs_9?Pܯ5ݻ\[y|č8gʱL{? 0 0 _k3>z_\S |<)b|7aaaxn.ta?l^Cvkؽ#~e)3<3^kdlc&jK+o"e<.ʞ`^(3zu l+6v<ï k7]/lc[`On}򚄫 G뎱zt^v2)?;Wmr5ocIz?Ozx{&!ez."ѯ 1Gg{+ҏlw<=}GݽFƨ^)zIpG K֜{{e G12ۭqiumf>.}~a? 0 0 [u+7Svq֭y΅ ?ނ}XwŶv?ߩDZۓ-q/?߳=<~#>Fk"qzrQo 9r,nY[;o:)@-`ק-7({߯S@µK9֠ɸ>:n3 _[_*mtcmC>qSL=<6;ǫsaaa{xˌ\ފpx?0׋#5zяc]x^l򼠕(f:~٣^lin59W~\;?vn6erUbS~v^U O7O(|;+SG4|?f*?rW~2oNٟS9~daևmH6mX[J~s.ym4ٶO|Bd/b5ɿyU? 0 0 0 0 0 0 0.P~*1@G\⟿KrKXs2(ߥ纎J8'>X@▼QQbqwx b)_K|v 1M6kee-2Ǜ59?K^E~9ϱQﱮYF8N?~;:=J<-tĒyNAgC \NXKs)'^Kg\~2}6}Գ)n]Or^j~"{p29w6/.z-v:+M{WJYZ굢`% Ҥl9ힶկ#OUz+U?;sd~vND7*.Y+v:ye;8}~|+ÑޅN9}{Bƞ#txխsXɿkSV/uJ=o G<ջL'L:D]6jfgLz/+ؽ[{rCMYq~[{yy czA;w9zszWHVax3 l pfmkBT/ xڍm0aaAXAtNuө~"B~v(I$Ic i#Gl6p8޾s[ouv?Ru߯+fԍ^|}m43ϭu!Z9RUY׽B,z"|~>/|RתY̞EGߔ뙷L?:fV\꺯Pv#R>cNb=^Fz=yNI}.3?3̥*Ǫ7٧ڞƵ2~zWİg#g&2yK;wʞ2vm"Ggʼd~g<[şXlk=^k͞Gy\ׇ3M^&}V3=3ڣ<_(녾v9> G@Sǿ99Gy*"QYu*lz;{-/9v=Q_s>c),k:gQ%ԝ,SFwA2vWcWqlׯ[},g7F}.2˘ڳ^d($ )*$h յv4#TFyza/99{ɶm^<@DnJp8DTBQU ȎFD"EA&Y/:t: UUCj4aF 8!\׽A^6ߓL&1ϡpJ`6b`0P0 2|!,l)%ByBe-BliP 4 DbfRRP8"tVާ@)%@uy2 Z13w=u]\Z9O7MDjR4. ǹ.8"13&˸gry<@mx<|+(vS"ʴZp8h4b+ه1ԓ&IENDB`contextfree-3.0.5+dfsg1.orig/src-win/res/widgetform.html0000644000175000017500000001150512076364074021653 0ustar brambram
contextfree-3.0.5+dfsg1.orig/src-win/res/newbusy_f08.ico0000644000175000017500000000427612076364074021472 0ustar brambram ( @555fffPPP333444ggg     ?a7????contextfree-3.0.5+dfsg1.orig/src-win/res/newbusy_f15.ico0000644000175000017500000000427612076364074021470 0ustar brambram ( @555fff333hhh444ggg      ?s?????contextfree-3.0.5+dfsg1.orig/src-win/res/busy_f09.ico0000644000175000017500000000257612076364074020762 0ustar brambramh( yluw       ?'CC'?contextfree-3.0.5+dfsg1.orig/src-win/res/busy_f03.ico0000644000175000017500000000257612076364074020754 0ustar brambramh( yluw       ?'CC'?contextfree-3.0.5+dfsg1.orig/src-win/res/busy_f05.ico0000644000175000017500000000257612076364074020756 0ustar brambramh( yluw       ?'CC'?contextfree-3.0.5+dfsg1.orig/src-win/res/busy_f08.ico0000644000175000017500000000257612076364074020761 0ustar brambramh( yluw          ?'CC'?contextfree-3.0.5+dfsg1.orig/src-win/res/manifest.xml0000644000175000017500000000121512076364074021143 0ustar brambram Generic contextfree-3.0.5+dfsg1.orig/src-win/res/newbusy_f12.ico0000644000175000017500000000427612076364074021465 0ustar brambram ( @444fffPPP333ggg      ǀ?s7????contextfree-3.0.5+dfsg1.orig/src-win/res/ColorHS.ico0000644000175000017500000000257612076364074020633 0ustar brambramh( @)YdPpzo>ی }aY#U+M:m#qQX8g4D \_+x` g|.#k%TZF5"hp;}uTeN$~IR7\p'ceZ^cY"{S"QdCsf|z7j\HrbQvTblm\Aa ,4Xf@_ OweLEQSo#).R+9"Cn(tB^=b1?[ IUj7\Thi'5dF>:pq $ZN;GlW Z HG8sPK&%2`pv!gD-3V]Y6/0mcuJ*rk^qk^l]⿗UkX@"g[P? ;wW}YJkiǻ.=ű_cqѥb+Xjups`oc~&a;{bJ ׆DU,9}SNx?%P԰&=wĎY>V4O c+<@ 94̷Bywyk\sͳ +s૨uKNi 9_gX=9O8 O;0 ϼ*?*?g\{+{p/ö+-@֟O/ӍX%?я7"7z=?2}rzSx"w=[sbI[~O?tzW;5֓կ Z}~9% `0 `0 ``dFsvHmkBF)3mkTSx]w6kqnþ={H=Jel/91ڎ۬7N˖ڠj H  =xվYvͽRsߎK}ZOӺg/U-K^v쥦Npd/c[Rl6:M9~f^ktT)eSXR9<@_@~/B;fxmMXeepڝpڃb9Nڧ.ѯv%(;osDvkRr2!;u#V8bWYpǒ!곈Iy3en+q}kr}ltjV+Ի]Q"Zw-kC&,6# m`Ry #$Qhk;ܲ`:c*:"<搌mYZP ɑ'L ϋ̇S9|{~|VΔ|OʧTl4>DJnT#~)c2`h!08u2ΐhHј2+2|jKDq!BU&6Liژ.wC(5ux~D١`B鄆E hjmEJ.t`|V_ְ8jG'9ySMA=2H|_s^ӧ Wns*3# Y!Q5`s^a l 2Y k/t'f9݃קS@kS_P}"fzQsf-VsHIGaS󼰪΀`)XPyt;ĖW#e{N~ef7%O6kp1- . =BJntzw|Ș66M lbc0lĂS3t|谜:C7PsEN.k W !fc)vdEEcc!"~4W.Uش<Ϝ8wt،8IGGȶ@& TH 1F1;tpw@}Od%i_Ou}[˩A=A5y"F|{2˅z0 ,\%Mi障_1n( `km|Va&',DICE@~ [&L<ȝ%Y,us/ Z1  yAl !#r`\Oy\QT4(]vqpl<+mQ/-'(G r/pN63ګ@ k\?wόrɛMnƫ rgp#J`!sс ^AUi~J't a\}fA'd<^E*$L{" kl)1Ɲ *gOqdxk jqƦ+э\Tܐ_54ڒg1PLlaG$tT94 ^G\u'HkQhѪCFd\Zl˽q{@éS~D\@u\-²l<9]<(#% ErK=|Ԣs"\v+gbfRJ/B$.T?GUt)_}r}aL{={%,G%#OǔaղֿC >h dug.jf=wdP:;UE"W_KMj EZ]%l:.Ȇ}!"p|*J^=<v%l?9*"/0L/Ȕ.z,3]ʮe4yhd mY<=FV6_t=[jwAjęm:=dVt&D{柅QL-2F:zZ cr2NݘFE?sO)? (l1]la^a zD|F#@C~(nD7{,nsް _"`%6zD܏Ib ǵ$euIfN1MVF'b,9I,)(;2B3HׁGSNfc|r! .{(L@'ư-Vn jԾbKuXEvX{;d -γ 뜸sNrS+Dz+t70LEС!\$\ˊtoeǴ %y ?I/MUMeiH48ͧnIB~nn*M]Bdv_tMDeAkwL'gĦ"wb_U{~gbn*A[c3mDga~8 KuLvV62#?I/MsMefXC)sٷ=/XvRVPv<ř+C}pFKʠ(bIFyivݎU 2BF9Pt,@_,v㾥c`Tm[SU'zm˪/`Sj]d]@%AoD$g6 bTW|uAC%z5=y!\oWc1(K.5~&֭UT]kb+轢kMn4aT05pa+MVdn&Y+ӄuۚ}ڐDkv4B1imA%&ͺ6IRrmnF5AkTՒN!^|hS۾n]hr_n>Mu\m&XWYHnT͋l-/V3yh~s+!3yLo{`\;CfǯWcMOM";Lqw g} 2Pq^rtxVJJkUѕ_x 9xy3z@PҧJg[˨H3gg)3~wآOgFE"0ԕPg cåg 6=+b]y5*;+CVu{>ƴ"V~-+[Кs e3zY<ҫ !?P/Sz(EoA}5(eH% v#^1]SS\=05#)jZ.`_ Z#Lc.KFX@OLQ>b*mk?iufpg^&jXs˫)k$>@ s27砻9A'?ш G5~ p.Qtv;%CKsH -:CoGZ%GKs6$GK] a ҃|\,Ys pI } ] -Z2t3v߇Χ'ʙlwٺlْ xΖ -ZZВeor&yYwgg_;o;Лrdhy[y'9z8Z-9Hy'yY,ٹHy'zZ -:C˝w7;ْx;Лrdh>Cw,@zMd woMŀ X [kcgUf,ԋ$K_yv?~Zy 1cjsPWg6œZ%y"IF{x);+/^U^M:| 8WUcxPƫjuo8d `OPUD݀r|IF N~FB͚?MAo*/sX7t,;1{egq.\ s5¸3bwz8?]q4ZOSw^?,+MkƵi Yw|D=8Gd?:Gzq{Fݞb}=8'0_βXgSk&wĄ]^zC)=:%~JpwXwBY&`l>#s&cgi##.DxtNbj^xqtM穵.]]=3 |)_Oj >$8s;^}z8wQ<LnԸ)q@lt0w5b}9ȳ7իac8yÜN Oʂs0@,q.!ԼX'[q*33/v%췂#=нDu"qʨJȨJT0>69gO(j c%bѣ;O!5hboݰsm󂯃e"6Q?lB݆j`Gzdޚ]o l![1qgޛR-7=6GPE[`]ϕh-h]tkj|q+ dgV:._G%qmv/_ 9pnR}-̚=QkR_kOpwcM##DZ.^_OyF #ʆw\_jxW?QtdR.>0([OzAG};uJ{?{f)}} !޺귚< 5TB{D˧H|Z[|Z>vdH<f$ߒ:âI,cFngB, ,ag,{Ҷvs6i:] sC=C)W 5DwNxD7 y:sd:тkNsXjN{0F@cmIVʬ%>e_Qw/ߥNWפeZŲYs#V8bWY&v=Mf}0fzflN#w +fx@&뛘 $E'lXWO^sZ>K,JZ{,PbUpf+5UoeS}+@M77]ڪ̒eR3iŘͪ3Bsz?ew'!1p V XKoqM4~-90Ǯ3v#-49ffypq98~K*5H߲Qjt<:HU-:xchj?cbmkBSx]N 0Ҫm0t#ЫB@w[A,b^@ԏppN6uHUVX;H 2`Ť,.n+{D6c4{;{9 HS 'E E !ڱs}9_<`̩U#SY\%KODMC[;oT[zj}*mkBTx}+$+nʔiSL")HdJ,DbH$T3;;W֊z]@&-Y>\yنytc u/$р_ ݈vvvͅUJ@4ZaE6HxV:F6Q>KSy.&{<}Ad:KN?2 n37,OMEN#HF`?- j!j {r+%Aqh $S@%%|9`ƅ}6.?jU 7KBC_{-׮8`Se[ lhF-*,?nt WTe\ÚMOsf^|ŝ}Em ;GFn^Kb[dAݜҥy_g:=h5=#*|3z¡F#$̣[^Y EO)ـ~Iȑ8  Ľ&C}24 L >bXXFkhFWI. -h-yU`F m<}hRvTf}|dT@OP\I' 0%U-b2֓yxd^ƣcAēwP)Xͣ KZQX!+}~CX@- >9Fwx+$@>,#Xٵ1vQ5%tᑄJ#5̖3S=R e[OjRgfM߉ZpE9%辴tc⏥R1. p8Ywh;w@^tug.XHT^?2!+tU#_:{*!nygn:@ Zgpwp٧P栢=ԇ|Utl7~䙔@0 +h%\'̊!Lu`tp/߹÷0!:lH- gA ^Z1KO_<*•G}|;n'e}*#(4hB9Th玡NŶ@%fĠpo9,vrdԬ,qcD-7= 7V >v`f1B+?`ؕ?ջ+yKV"o6TpŚUk}"bɍ7!H*3(Tu|jGyŪEe18-BYYdf[L>='4"}\x乢2EOcvxV|MڡBs%ȧԜ?U$g{075պ[=h`Iu7ޡ1t(f\%}R@uPA(@0Mz>n /:{7l6u]~m'3u/OOX-?Jk3pMNVnuS>q$t>NSgِ,yfzkf6{4!ڵ Y̳X?%ţG|j}~H)'FCy6)$.[xgߍJ<MC+QgPX 7~PT֜~5=4WaH]0/qJ!Ѧ?q?+kpB7ޠ">G}W=\&fH0e kƲ]N0Gg45*O xFD ~Pv_u9%|?vǾal*.p,S?5jPt~ۢ4$FMm3\9\fVdٿIuKk+s]h?:iĺ-^pYljkeA ֣;$3~:LH Ip#W,%ebbad{O`eE}9!mB ,ƈyAUkb]Nø ˌD_ˁj5j%u^׸ `O g9cE @=BHMlk@$ ءۖ#iBOOA\zXCR%ˆ6 _loNVL?7\iB#~_l5zq#wRf|{jSKlcԁt*=LfLQJ_Ke[LE(EU0"R4hbR |;i@fT,}X?GBP7A#Hk2dwըU¢ {3eKxŨ!tϼѝ;ZهMK+2S:¾m:ʋT,شt|H>(;:HfT+_oG=3fLál,0K@I rHmD-Kɵ""7@8bRz=Dmc CF_ŀT-DM2_=Wl@F䴦"%b||+h Un+z`Dv~_ClO$>Y Bcyg |rp]o:8khۘM埁/W^ֆE^ls wfY~(cUSM6:-=j0y-AgЀNN2g$>+y| GA]cپ6m n5v{y4y:l<5y7/CBqP!L||R۝I׷Iw|X\Zꑽܳuu}1c%(Hh!!&>{Ny! BC~{ Uz-b i>hTN./hY}_sPp͠ '.D1bԿoK'mCn0H]_ _&kdx3{G!~KdlfPej9dm5Zq[nJ;#:u|CC-y Oo!N獼7;tYW[kcd [@P {q7wΎd'>{*QVؿMAN: Zl]ѓ䯹c[}: pz$1 U(rtH):=)_]2{xlu:0'Y0v~p %Nj #o^'X՜T¯-d'dT{voƧ߇&9ގlOz|lxq!leP>ޓ 4lBޞ}yơ$9Eg/>_Y\j*SCş9Pdo/g_J7wG`fע4>*04yWĉ &oD93mϻL}5Čގv$OEA0h61s_ qhL`Iw^%M2g 0=f_v fM7R;IEJQ04Ys N[4HWR99s_;o@O7 @s21FQyhm`:o_ π7:zAE^,έx!{>!7r#{77;"{&/0WßﳠA[yυmk}ݲC,NZ M9@`CtD"<p& ^K_J}GR}/ +-khO.ЙZ"W 83;&_ EKًH|!GCVyhKj-үP~Z̚lpyN7;aACNh }p*}FZM8oMGeh ŕW&;0ܕ +$Dz sD %0x/{gݷB#cpD˵#e"K/) !Y#̓Dlg4b>EM3T (9&p~-'GɑlY[?E.`ހM Evn4s<{nҟ4z3ƿM(p4x։m |&x%Z@({~N1qy8FPjDo6SXyhr :JgǾfN&b7Ԋ{dK<ڜw#sںN}xU~Mf_ 244yYhtvш̪>Qc8{Y oߛ|u߄6W(-ߺȍ# n֚MPj] Mp# y}XK sSU>q݁(yug5s3q !{;ߓ"4dG _4>7IH4(.#B ؜cz (#}%şnMC- }|[ϸ%6Pe>4RQoZ ]r;^@UofJ_nnaL3RlP?yרfchRr$R΄"rKG,-cJ铞\ੂJq{} y+wܥMYaq$xH{h2؂H!XG-Cz+Ng÷M#Y#dnrjE!ٯ.Th";vv ׏I42'ZJFBѳ$.2n;ӹtw=xt劉f>W:m+zl<Q CsBL@G1RB9zBG/u9߱\!p"Mj} ӆr)nST&t`&YfpKOm5oI~6;6h'!aG^drE% v <R1%/LPskK\wIΌ\ӀxI7Jb(i(H<'ߟ-Ԥ)ycNŚ:V J>̛jATg /d^YOCrG:ic;CʀW4' hJ7_sQL3!Mۯ6Ky{⼲q 7x˼`[(sk349bx7|q T zըH?-m䙄3ΐ{K@lg)ݺ@ RtiMd\zK.(\rZȞqp~M`d6 /wOd`.HyEϼ zd&<ʉdd9}hR^օ=W"3D_=,!l,ŏq?E?BІ^^c] J*סIq+\bjō 0}6?t6Gл̂:?s%V/Df= ~4_ M=? uA? L`R.[ B:RZ^A)D(ϼRSJu!lꟆ&/Λ cM}[cXaDe(_Lz"oHqcTxwt]8a S!BɄL}XJ" Y[8—>;r xDv؅7Q/b .=_U$?&Y ]X>e F€"UE,hi#z@7Hzc/x27m0"f\0Ѓ>#au Mb5s$Tvb18#{c4+Ώѭ _'2Eeoߟe-2$i%  MrNMAN.9$Dayj~\l;]?B~^Ng~5/Bmu%hk^BiJʵ+w @F!M*yg_8,|:ֆmWàc 3FGu~2'uF=!"ct8/ZԸruڐGtXCg5ZbKZbb[^V ٤)E=+!KΔ\C50!xV~&,~"1>ύ^/kdCmBb4 rQ"x D!W'ܻ}QΏy"Bx|31H.Ͷ2!qb̬?M!?q9><-lW]M}m5NgO4Z{m݅o #CÇM] 2h2_AG@nn*I J<&ߟ Jk`:1Ϩ#{D+B2y\i1^_E1lAbBAnE FX0>>H1'H$K[~ l5n}*jV9/@>RL.$?m>EN$D'~.%8yFc`}{C;+@03Ft̋g; $O)O:f |"""yAБlDk#/{φ7$Ő; Žz ,^rp"~}5C|pKAyɼ"7zq%{SJ{.̥܅ؔNICC!nVzСÒ+e1f(G -/3h)I=қUbPxF?M;YͶTj^zWyr>&5zRnqO÷ My}vP/vFZ4Z#GqES:/]`<{f#y3lfT9FG Oy6uB%|@uf~3˙@}XSwx$"Q}S!T AHP!.Eev_\κ7+miy4qv0‰jdž?+o^+-Y>VH?uhR?wX[ЦKZ$'͡WF E c[`P[Џ q\_]R +zZQ>3jQÉ(cF̬BYB-yFvrQYc? PCt8|];_ svXV +P٭o)1[H>fo]HL@c9w ttW#0*-ZDx}n;,^y{Rn] *j^D;b0 7 63&7*}QxoɶR^dte3a(ԍʛ?ߚW♰\#zz>% T,ȦRkYp\V$PUઐuAXcg{ .uU69WDԶ,|=?_xb}N@;|P%})A?zR!@@P?t@Jy1P{mS̔eYZ^w^1*| ֊9L'd !P'hKh70b:lf'bYykxDm1mx*|u'8B@(čbJJc~0y7ŏz #9{khA׿Y&Y7NU6S@cFLRz}n@*&d^O?bF4k@~O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?YMw})mkBT]xjTGQhnhj P",)BB^I/WwOƖ|3sfl?RmEi~tx^qo/0`+x Wlu7{s`<2?XȮsksa~"GT{ubcߦ}j,bRcֺcmKpL[AaƀbBsݸ?փ`'-xUn[w |=>of{ Oyݾ`TPy:Pm㜷WIx}>ޘ ?in>|4x?ױo>R y|jw? o<o9cQk{nEAyۺm9RGН>ؾs/w|}=6.5{LwƔ_ {~{ 76ZNss?6}駱Ts}kWb+eͽ~/ck]+UjOHsmվ{?[{g˶H[eKm;}5]}?g^I~;Lr;۱u2{.J=wp=n޻L}k8p`Jdz湵tJ2[pWV _Bs3r^ wy~}k_gϿY1kyͻhǤfz wzlogy.xྲྀZ}ho߱}uۗϏ<;ywX޸f>os?\<OO-.#;|~9+_>6NH=g{?^ԽuOZ?sjr,HMŕ :mkBTx흍) q ĉ8D^>׻gI@XjjgiЃ`0 `0 ?ϟ|:seQ3|ӧO|:2|.};7eGFO6_Qv]T]^ˮg{>pjzkuo{yye?{-x/ D:3D&򈼹e^Hyi#/OGzϪ߯_~ :sMe#M3Y#=2 QЙ[\s=E8}E>GȩT ڲTg-}VfoSVwzV}./>~!?U1<#}=F[ ~QڋBN..+푹^edLo+[\-k dW(}6q$#?z6Bөi?L7!3O_Q}Пuo[=tkȋM!'}/Ƈdr2_Cﲨ: `0 :8o=+8-4}۞cĥXdq{bUq©ήm!ƶg*ΪU\z[GA=^+ru{LV U?)V>ғ)x|Yҁgi\yi^cUo*= !TY?rfgWsʽVn*VX#=Fϫ+[F~yH\L~[O҇h5ݵTow|Sfӟ+);F;:x )/OS yUo2e)Ve3'wgGg=J^`0  ľu kU,Ksؑ5nY,bXw{ w&3QהNQev ]ƷgcH˞i{A3I8hwduwUIWq8I>+@pQşGcZ\ƪUߝ]/:3d;ɫ:gB9R|GW~w2;fzt|+i5nΟgZY|<1NyŬ|E7k?z/k><=Α}N΅>uWydʬdz `0 *\?W8GY:Dgcg< 2+'W6qn؟{ru"wU쏘~c#T?+y{Q,,^qF/Xv8.֩g3}ȸOP ~n%hUG4(_sn|W}Tg&x^c,Fѭ+ <#+}/Uw8BRh_|33!mr\7U9m({ѝpvew[xG]߱?g;,nҽow8]וb?OV=Z_#ve?vN_WrYLo;1g9pV^G~>[_vNOS3 `0Q[ veO\k^8֔v<Zbz\Opbn$~}oz3ј mK vU]^iNWA#x딫jt q :E= z%օq)CcYEqyRG-+u (K\hP'*^ء^q=m=y|Kvūe\rȊ4={W1;=ݷxp;o@>ȘT\Ԏ+C=*ɫ|GJOCW]x1.ﵠ9_Eб Vq)v(ʑ}[GwǺ{-oSdו_˞׃2;iT&w*w:g׭SOsj%Z[~_˯d֮+w]7 `0]kIu+eL]ւoA^;=GR?v쯱;<y o$N1紈=:ߥPVu< <&3KyC/4r)i=*/|Ύ^]QNН1qGw>ù{ ?Kv:A}E:_n+{u=rq͓̳]>>d}+|L01`0 leg:׺񶊝`W,3O?]\9P~[kOWiGc~)-<w.3q}'vuw$Vnv(r52S;Wk_Kϔ8B/hEՠ'9w?K;x:x<|@cϽVyc@ۖSw8Bq]=2lBe6V}eR( VeZT4ade2ޒ+nYBTqSߔ<[&=f[|szP)G}{Zׅ3n7jpWwftEw[ǽ;`l? `0 `0 `{~i`oLy>uoi\qK|}7Svu9G쯿c¾#>,jow{ՆݲL=mW2u_8دjo?kD߱mw>#}E:OۡO;y`$jUlV mkBTx흍8 FSHI!)$FRHnw HYx3ꇤsaaaaxIǏ'U{o_ھgW9 o'GW {>~Jlo߾)*/N\ϱov[iZ_ձaJΝ/:6O- 92b?Tlk%?_21B sY5>:>c=1Ow y^- ڶ,XzusM#גU]>H_yYv!ۉ_mi Rus]Xm_g)YY)m]y,m z1aaaxEߓGקo/Y\k6xjgH|yu.\aæM&wk#ϐ$?]Mo\Ⱦ,/ڥQ@~6s?)}, l gX #vQg Bٙ^uのuhm?}{].~}v_J;xogJY]޳@.)oqC?}>@Xߘ'-(W? źvƔOʙRv[K?[A}?-wmՑ}g\=c}M ggg DŽ-B^k_g?F? v0||؎=ǧHPgs/hؑI t~{n^}ZyD5XWvO)"c0vY Z|~_%/,p\ɹyΰZ/;/xs_9?Pܯ5ݻ\[y|č8gʱL{? 0 0 _k3>z_\S |<)b|7aaaxn.ta?l^Cvkؽ#~e)3<3^kdlc&jK+o"e<.ʞ`^(3zu l+6v<ï k7]/lc[`On}򚄫 G뎱zt^v2)?;Wmr5ocIz?Ozx{&!ez."ѯ 1Gg{+ҏlw<=}GݽFƨ^)zIpG K֜{{e G12ۭqiumf>.}~a? 0 0 [u+7Svq֭y΅ ?ނ}XwŶv?ߩDZۓ-q/?߳=<~#>Fk"qzrQo 9r,nY[;o:)@-`ק-7({߯S@µK9֠ɸ>:n3 _[_*mtcmC>qSL=<6;ǫsaaa{xˌ\ފpx?0׋#5zяc]x^l򼠕(f:~٣^lin59W~\;?vn6erUbS~v^U O7O(|;+SG4|?f*?rW~2oNٟS9~daևmH6mX[J~s.ym4ٶO|Bd/b5ɿyU? 0 0 0 0 0 0 0.P~*1@G\⟿KrKXs2(ߥ纎J8'>X@▼QQbqwx b)_K|v 1M6kee-2Ǜ59?K^E~9ϱQﱮYF8N?~;:=J<-tĒyNAgC \NXKs)'^Kg\~2}6}Գ)n]Or^j~"{p29w6/.z-v:+M{WJYZ굢`% Ҥl9ힶկ#OUz+U?;sd~vND7*.Y+v:ye;8}~|+ÑޅN9}{Bƞ#txխsXɿkSV/uJ=o G<ջL'L:D]6jfgLz/+ؽ[{rCMYq~[{yy czA;w9zszWHVax3 8-fmkBTxڍm0aaAXAtNuө~"B~v(I$Ic i#Gl6p8޾s[ouv?Ru߯+fԍ^|}m43ϭu!Z9RUY׽B,z"|~>/|RתY̞EGߔ뙷L?:fV\꺯Pv#R>cNb=^Fz=yNI}.3?3̥*Ǫ7٧ڞƵ2~zWİg#g&2yK;wʞ2vm"Ggʼd~g<[şXlk=^k͞Gy\ׇ3M^&}V3=3ڣ<_(녾v9> G@Sǿ99Gy*"QYu*lz;{-/9v=Q_s>c),k:gQ%ԝ,SFwA2vWcWqlׯ[},g7F}.2˘ڳg'u7r/ǧxFht& O:?0N" j _員`muH٩9WJ2>@=v&߬mLUjz' $Jϰ!*Ϯg6{t[j8([3W '$#VwU̹UG)eCKFJ 3/ZjAd| A 5CZd"&kñTh5_ZաĨ=qwLHL6B\π0=):No)ʭLdx1 226Dq\br'OAot @KH1egFфKJ)X7<r\*Dq,f^u} dBFQ{JJNFI`rQC@/L)be}DOWDq%e}sɎ-CFƣnpW}s ĵg!rRn%Qwlzd4#BF&HcYw03Ӫk3BfLS ?V W̘OC''!|:[G/|Wss2=-jڰÆ>^w\ӝ;2L$d:?lGr3:iX-UM=?=Rf 81z] .*t2tVm7s5|. M6yu{Bg%k8d 6 =JUU:A$5#dzSB3d,x*T%:1fu$;ԳTѕ~+Oժ:";oS,c eUTi,U*Aj!bIL om {IqA +JQ/KY624%+U&i>᳕]~U)D2e9"cUը`uif+޷PS5/uȜ+g*B^: yvl/-N! a3kVVZrdp{J!GŊgL1GiW׵U508*Qx9In4tS[do,jtioXڡ %XKбCQ C8$[#M82VVNmrNV!eJVhee<2/ˑ \>u&mIENDB`contextfree-3.0.5+dfsg1.orig/src-win/res/busy_f01.ico0000644000175000017500000000257612076364074020752 0ustar brambramh( ?'CC'?contextfree-3.0.5+dfsg1.orig/src-win/res/newbusy_f13.ico0000644000175000017500000000427612076364074021466 0ustar brambram ( @444QQQfff333PPP      ǀ?s7????contextfree-3.0.5+dfsg1.orig/src-win/res/busy_f02.ico0000644000175000017500000000257612076364074020753 0ustar brambramh( yluw       ?'CC'?contextfree-3.0.5+dfsg1.orig/src-win/res/newbusy_f11.ico0000644000175000017500000000427612076364074021464 0ustar brambram ( @555fff333hhh444    ?sO'????contextfree-3.0.5+dfsg1.orig/src-win/res/newbusy_f06.ico0000644000175000017500000000427612076364074021470 0ustar brambram ( @444fffPPP333ggg    ?s7????contextfree-3.0.5+dfsg1.orig/src-win/res/dropper.cur0000644000175000017500000000050612076364074021003 0ustar brambram 0( @@08@?contextfree-3.0.5+dfsg1.orig/src-win/res/busy_f06.ico0000644000175000017500000000257612076364074020757 0ustar brambramh( yluw       ?'CC'?contextfree-3.0.5+dfsg1.orig/src-win/res/ContextFree.ico0000644000175000017500000006444612076364074021554 0ustar brambram(LF00nL [hc(Hlʘ@@@nbK ~nooȻԺRSSsYr/00TL:ڥ``aǬɵaWBsk[ž|p۴~`A<1`[RϩǺGGHj vwwĠܿvjP))*677ghhóy{uhYYZie[HC9YTGԧμͱf\I1.&84,џʢd¨yqaԲZQ>ƕOG5{{|r\WMrNNNrعſ}ܫحjcTdzƜwa||j{qZx\ %%%:::DDDrss̢vqhй֡qfPkklʸTN@F@4ީi`M̪Ŧ߲^VG˹•,--USN\]]ddemgZymT¾{~׿pk`aZJʺeZDj_HfaU333WWXʯz^T?ֵ{s`мv}KKLΝun^пŷ~~oҼĻŹpe]NȨ|b[TC߿™ɿɶ=>>RK<PPQ$$n0^$7"vvun[k""AaVRMAa~aL*tmغM G dŽކ-_4i٫JOCCI //=my,4iK II摐##=t!-(II!##&bD**poooooIFb##W}&Xpp(ooprĵIl*#HHž o(pp(oooI!}j///Y opp((oooPI摐jjLrpqqqqqp(oo(INg.5 ppqqqqqqqqqqpp((ooqSIZI(qqqqqqqqqqqqqqqp(ooĵIso(qqqqqqqqqqqqqqqqqqqpp((oooq I'oqqqqqqqqqqqqqqqqqqqqqqqp(oopPII;pqqqqqqqqqqqqqqqqqqqqqqqqqqqqpp(ooĵIf pqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpp((oooSIINo(qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqppr(rĵI'o(qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq%IIooIIPoqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqʘ5q(oooPI pqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqčPpp(oo(ʵIIqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqr͌;qp((oooSƚ;(qqqq%rqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq'Tqqpp(oopPIIo(qqqqSrqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq@S%qqqqqpp((ooĚoqqq%Pqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqf%qqqqqqqqqp(oIISpqqqrr%qq%%%%qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq%f'TNS%qqqqqqqqqqqq%Sr%%rrrrqqqqqqqqqqqqqqqqqqqqqqqqqqqEf8%qqqqqqqqqqqqqqpIq%rSrqq%%qqqqqqqqqqqqqqqqqqqqqqqq%Pώ@ư%qqqqqqqqqqqqqpƷIopqr%SPrqq%r%qqqqqqqqqqqqqqqqqqqqqqqq%Ph8;E'᝚SrqqqqqqqqqqooPoqSP rqq%qq%rrqqqqqqqqqqqqqqqqqqqqqqqqq%??Pƍ3'8fIqqqqqqqqq(oISp%Sʵ Iqqqq%qqqqqqqqqqqqqqqqqqqqqqqq'Pr' 'Pr%qqqqqqpSI (SI'PNqqrqqqqqqqqqqqqqqqqqqqqqqqqq%P TqqTP%qqqqfI(prr%NNPPPr%%rrrʰqqqqqqqqqqqqqqqqqqqqqqqqqPTϵrqqq P;Ef S%qq(oIo%%TİSSPrqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq'fr(%)qrPN ʰrS%qqqqqqqqqqqqqqqqqqqqqqqqqr5sqqqqqqqPhf'N͜TPBo%%rSSPfϚPSr%qqqqqqqqqqqqqqqqqqqqqqqqN8?>rqqqqqqqqqq6ff(oIProrrSI'IPPI%qqqqqqqqqqqqqqqqqqqqqqqʚ''qqqqqqqqqqqqT5Ĥ'f; N%q~p%PPPNưrrS%qqqqqqqqqqqqqqqqqqqqqqqN 8S%qqqqqqqqqqqqq'f'f R~p%rIrq'qqqqq%P%qqqqqqqqqqqqqqqqqqqqqq;3qqqqqqqqqqqqqqqqf fTn1I%qqqIrqqqSqqqqqqqqqqqqqqqqqqqqqqN @Pqqqqqqqqqqqqqqqqqqq5ܵh$rrI%qqϤ%qqq%%qqqqqqqqqqqqqqqqqqqqq%NfIIqqqqqqqqqqqqqqqqqqqqqq?ϰNh^"Vx(%rSPN%qq%Prqqrqqqqqqqqqqqqqqqqqqqqqqr @PqqqqqqqqqqqqqqqqqqqqqqqP8hT$kp(%ƵSİr%%qqIP%qqSrqqqqqqqqqqqqqqqqqqqqrʚT5qqqqqqqqqqqqqqqqqqqqqqqዜn0u:o(qSqqq%Iqqrrqqqqqqqqqqqqqqqqqqqqķ'ɲqqqqqqqqqqqqqqqqqqqqqqqfUUc~Ioq%rqqqqqSNrrqqqqqqqqqqqqqqqqqqq%S;Tqqqqqqqqqqqqqqqqqqqqqqqq(N01PqrS%r%r%%qqqfĵS%qqqqqqqqqqqqqqqqqqq%SIfT;ڊqqqqqqqqqqqqqqqqqqqqqqqqpP+xpqqr%%qqqqq'PIrqqqqqqqqqqqqqqqqqqq% f?Iqqqqqqqqqqqqqqqqqqqqqqqqouw{ (qqrqqr%qqqqqrf'ƚI%qqqqqqqqqqqqqqqS'S%qqqqqqqqqqqqqqqqqqqqqqqq(oI`Qoo(qqqqqqqqqqqqqqqq SSqqqqqqqqqqqqqʤ'f>Sqqqqqqqqqqqqqqqqqqqqqqqqqqp9\IoqqqqqqqqqqqqqqqqqfPƤNIİ%qqqqqqqq%PfTĤqqqqqqqqqqqqqqqqqqqqqqqqqp f^z1Pqqqqqqqqqqqqqqqqqqq%PNIPSr%qq%rS'ƚqqqqqqqqqqqqqqqqqqqqqqqqqqo$U9xo(pqqqqqqqqqqqqqqqqqqqqĜfIʰrƤ'fS'qqqqqqqqqqqqqqqqqqqqqqqqqqq(on09e qqqqqqqqqqqqqqqqqqqqqSrSƤfNII' NS%@rqqqqqqqqqqqqqqqqqqqqqqqqqqpP$ \(pqqqqqqqqqqqqqqqqqqqqqqP%rƤN'T'''Ϸ͘rqqqqqqqqqqqqqqqqqqqqqqqqqqoIc9 |\I(qqqqqqqqqqqqqqqqqqqqqqqĜSPffN'T@qqqqqqqqqqqqqqqqqqqqqqqqqqqqq(op|2~Po(qqqqqqqqqqqqqqqqqqqqqqqqqq' %SIffNPf''qqqqqqqqqqqqqqqqqqqqqqqqqqqqq(<9 |2xSo%qqqqqqqqqqqqqqqqqqqqqqqqq ƷrƷ>qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpƷ|2e (rqqqqqqqqqqqqqqqqqqqqqqqr ͤ%;'ϱNfrqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqoo9 |2$ppSr%%%%qqqqqqqqq%r3ϵ'6h@%qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq(oqI^|22\ߚrSʰrrrrSSSr%qqq%SPI8T;qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpI$U9 |22IqrSSPPPPSrIf'ư@8'͜?qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpf09|222PPSPPSSPPPƵIII Nqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqo( |222eSrrPƵNNISPN;8 ffPqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq(oc9 |222N%%SSSrʰrqqqqqq%SPNPʰ%PN;f;qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpPۄ|2222\:pqrIIʰrqqqqqqqqqq%II%%%ʚ fNPENrqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqooIu9 |2222~SfP%qqrr%SƵ%%rP  'NP%IϚNI%qqqqqqqqqqqqqqqqqqqqqqqqqqqqq(oI|222221P%SfNSrSĵIIPPrrh@EE'Pqqqqqqqqqqqqqqqqqqqqqqqqqqqq(<|22222e r SIIPƵIff'TNʰT 'N%h%Irqqqqqqqqqqqqqqqqqqqqqqqqqqpf9 ||22eSrrrrq hT'; ;ffʰfʵqqqqqqqqqqqqqqqqqqqqqqqqqqo$u9 |2\I(rP%rP%qq%Phfrq%N@'N; IhISqqqqqqqqqqqqqqqqqqqqqqqqq(o%I<9z oqrrƵThS%%%@;ϝ%qqNIP%qqqqqqqqqqqqqqqqqqqqqqqqpĚ^w+1oq%PN'NPPPƵIT8PPĤ@ rqqĵrqqqqqqqqqqqqqqqqqqqqqqpIUρȁ_]ȁۑOZR9W]J']W4oȁ"O^ ]gdtȁBq/(ȁgȁKpd2P"g0՚]Ux | ,{ׁ]=WA^֟I7g49uwL܁ ܁ !ȁ-wrb]wӃ]ȁP%"P(f71ȁR9oU]7%M"wgNrJ|ȋvX<ȁf@؟-M*]W_uȁf͠OJCA P(ԁ]k=ȁ]ʙẃ聑t]ҁM^ȁ=e]ȁ" +ؠԁ]^(p6t^]ȁt( "^P%]7s>scontextfree-3.0.5+dfsg1.orig/src-win/res/ContextFreeDoc.ico0000644000175000017500000006444612076364074022202 0ustar brambram(LF00nL [hc(H???___///OOOoooGGGWWWgggwww&&&555::: ***KKKSSS[[[ccckkksss{{{"""222BBB <<<DDDIIIQQQYYY]]]aaaeeeiiimmmqqquuuyyy}}} !!!%%%)))+++...000333999;;;===AAAEEEHHHLLLNNNPPPRRRTTTVVVXXXZZZ\\\^^^```bbbdddfffhhhjjjlllnnnppprrrtttvvvxxxzzz|||~~~""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""#########################################%%%%%%%%%%%%%%%%%&&&&&&&&&&&&&&&&&'''''''''''''""""""""""""""""""""""""""""""""""""""""##########################################%%%%%%%%%%%%%%%%%&&&&&&&&&&&&&&&&'''''''''''''""""""""""""""""""""""""""""""""""""""""###########;;;;;;;;;######################%%%%%%%%%%%%%%%%%&&&&&&&&&&&&&&&&'''''''''''''""""""""""""""""""""""""""""""""""""""""#########;;;;;;;;;;;;;#####################%%%%%%%%%%%%%%%%&&&&&&&&&&&&&&&&&''''''''''''""""""""""""""""""""""""""""""""""""""""#######;;;;;;;;;;;;;;;;;###################%%%%%%%%%%%%%%%%%&&&&&&&&&&&&&&&&''''''''''''""""""""""""""""""""""""""""""""""""""""######;;;;;;;;;;;;;;;;;;;###################%%%%%%%%%%%%%%%%&&&&&&&&&&&&&&&&''''''''''''""""""""""""""""""""""""""""""""""""""""#####;;;;;;;;;;;;;;;;;;;;;##################%%%%%%%%%%%%%%%%&&&&&&&&&&&&&&&&''''''''''''""""""""""""""""""""""""""""""""""""""""####;;;;;;;;;;;;;;;;;;;;;;;#################%%%%%%%%%%%%%%%%&&&&&&&&&&&&&&&&''''''''''''""""""""""""""""""""""""""""""""""""""""###;;;;;;;;;;;;;;;;;;;;;;;;;#################%%%%%%%%%%%%%%%%&&&&&&&&&&&&&&&''''''''''''""""""""""""""""""""""""""""""""""""""""###;;;;;;;;;;;;;;;;;;;;;;;;;#################%%%%%%%%%%%%%%%%&&&&&&&&&&&&&&&&'''''''''''""""""""""""""""""""""""""""""""""""""""##;;;;;;;;;;;;;;;;;;;;;;;;;;;################%%%%%%%%%%%%%%%%&&&&&&&&&&&&&&&&'''''''''''""""""""""""""""""""""""""""""""""""""""##;;;;;;;;;;;;;;;;;;;;;;;;;;;################%%%%%%%%%%%%%%%%&&&&&&&&&&&&&&&&'''''''''''""""""""""""""""""""""""""""""""""""""""#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;###############%%)+)&%%%%%%%%%%&&&&&&&&&&&&&&&&'''''''''''""""""""""""""""""""""""""""""""""""""""#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;###############&/7*&%%%%%%%%%&&&&&&&&&&&&&&&&'''''''''''""""""""""""""""""""""""""""""""""""""""#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;##############%'""R-&%%%%%%%%%&&&&&&&&&&&&&&&&'''''''''''""""""""""""""""""""""""""""""""""""""""#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;###############'""R-)'&%%%%%%%&&&&&&&&&&&&&&&&'''''''''''""""""""""""""""""""""""""""""""""""""""#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;###############%35371*'&'&%%%&&&&&&&&&&&&&&&&'''''''''''""""""""""""""""""""""""""""""""""""""""#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;################%''1O--//)&''&&&&&&&&&&&&&&&&'''''''''''""""""""""""""""""""""""""""""""""""""""#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;################%%'""O171+//*))*'&'''''''&'''''''''''''""""""""""""""""""""""""""""""""""""""""#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;################%%&""1ʉO75:1155/*-/++--+***))'''''''''""""""""""""""""""""""""""""""""""""""""#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;###############%%%%*Ҫ1"|5575539:35973353--+))''''''""""""""""""""""""""""""""""""""""""""""##;;;;;;;;;;;;;;;;;;;;;;;;;;;################%%%%)33"R*1|"1Ҳ73:9339739:9575//-*))''""""""""""""""""""""""""""""""""""""""""##;;;;;;;;;;;;;;;;;;;;;;;;;;;################%%%%)5R3'/*&1|"*R$-5-351535997771/-**""""""""""""""""""""""""""""""""""""""""###;;;;;;;;;;;;;;;;;;;;;;;;;#################%%%%':""&%%%&3+&")"O'$+971137979931""""""""""""""""""""""""""""""""""""""""###;;;;;;;;;;;;;;;;;;;;;;;;;#################%%%%&"|)&%%%&%&&/3'&:&|:+O"7-5-/39999""""""""""""""""""""""""""""""""""""""""####;;;;;;;;;;;;;;;;;;;;;;;#################%%%%%&/7*&%%%&&&&&&&&'+)&)/&'ʪ-:"+77/157""""""""""""""""""""""""""""""""""""""""#####;;;;;;;;;;;;;;;;;;;;;##################%%%%%&/:3*&%%%&&&&&&&&&&&&&&&&**'193"R)11/""""""""""""""""""""""""""""""""""""""""######;;;;;;;;;;;;;;;;;;;###################%%%%%%*|-%%%%%&&&&&&&&&&&&&&&&'')'')O3E*""""""""""""""""""""""""""""""""""""""""#######;;;;;;;;;;;;;;;;;###################%%%%%%%*O"|1&%%%%&&&&&&&&&&&&&&&&''''''+'3|5""""""""""""""""""""""""""""""""""""""""#########;;;;;;;;;;;;;#####################%%%%%%&-|-&%%%&&&&&&&&&&&&&&&&&'''''''')-)9""""""""""""""""""""""""""""""""""""""""###########;;;;;;;;;######################%%%%%%%&+7:1)&%%%&&&&&&&&&&&&&&&&''''''''''''1""""""""""""""""""""""""""""""""""""""""##########################################%%%%%%%&*59&%%%%&&&&&&&&&&&&&&&&'''''''''''''""""""""""""""""""""""""""""""""""""""""########################%%###############%%%%%%%%'-"$1&%%&&&&&&&&&&&&&&&&&'''''''''''''""""""""""""""""""""""""""""""""""""""""######%%########%%%%###%&%###############%%%%%%%%)3E -%&%&&&&&&&&&&&&&&&&&'''''''''''''""""""""""""""""""""""""""""""""""""""""#####%&&%#####%%%%%%###&&###############%%%%%%%%%*3991&%&%&&&&&&&&&&&&&&&&''''''''''''''""""""""""""""""""""""""""""""""""""""""####%')'%####%&&&&&%##%&&##############%%%%%%%%%%*175-%%%&&&&&&&&&&&&&&&&&''''''''''''''""""""""""""""""""""""""""""""""""""""""####%')'%%##%&)&#%%###%&&#############%%%%%%%%%%&-:O"%%%&&&&&&&&&&&&&&&&&''''''''''''''""""""""""""""""""""""""""""""""""""""""####%%''%%##&))%#####%%'&############%%%%%%%%%%%'/ "&%&&&&&&&&&&&&&&&&&'''''''''''''''""""""""""""""""""""""""""""""""""""""""###%&%''%%##'+'#####%&&)&###########%%%%%%%%%%%%&-339/&%&&&&&&&&&&&&&&&&&'''''''''''''''""""""""""""""""""""""""""""""""""""""""###%&%''%##%)+&###%%&')+'##########%%%%%%%%%%%%&*3573%%&&&&&&&&&&&&&&&&&''''''''''''''''""""""""""""""""""""""""""""""""""""""""%#%&&'**'&&&++&%#%&&'')*&%%#######%%%%%%%%%%%%%'-7E|-%&&&&&&&&&&&&&&&&&''''''''''''''''""""""""""""""""""""""""""""""""""""""""%%%&''***))'-/'%%&'&&&)'%%%######%%%%%%%%%%%%%%'-79 /&&&&&&&&&&&&&&&&&&''''''''''''''''""""""""""""""""""""""""""""""""""""""""%%&&&)**))))+-)'''&''*/)%%%%###%%%%%%%%%%%%%%%&*37//)&&&&&&&&&&&&&&&&&&'''''''''''''''''""""""""""""""""""""""""""""""""""""""""&&'))*13****-/**)''*)*)'*&%%#%%%%%%%%%%%%%%%%%'-999:)&&&&&&&&&&&&&&&&&&'''''''''''''''''""""""""""""""""""""""""""""""""""""""""%&))'''-/33/371+*)*)&%%%))'%%%%%%%%%%%%%%%%%%&'/59"5&&&&&&&&&&&&&&&&&''''''''''''''''')""""""""""""""""""""""""""""""""""""""""%&'&%%%%'--)*/5-+-*&%##%&''%%%%%%%%%%%%%%%%%%'-33+ʢ/&&&&&&&&&&&&&&&&&''''''''''''''''')""""""""""""""""""""""""""""""""""""""""%'&%%%&&')*)&&*/3-%%%%%%%%&%%%%%%%%%%%%%%%%%&*173+-)&&&&&&&&&&&&&&&&&'''''''''''''''''))""""""""""""""""""""""""""""""""""""""""&'&&&&')'&*3/)*39*&%%%%%%&'&%%%%%%%%%%%%%%%&'+331E5&&&&&&&&&&&&&&&&&'''''''''''''''''))""""""""""""""""""""""""""""""""""""""""&&&&&&')))++*+-95*)&%%%%%&)&%%%%%%%%%%%%%%%&+35-*|5&&&&&&&&&&&&&&&&''''''''''''''''''))""""""""""""""""""""""""""""""""""""""""&%&&%&')++'%%%%/5+*)'&%%%&'&%%%%%%%%%%%%%%&)/53+)--&&&&&&&&&&&&&&&&'''''''''''''''''')))""""""""""""""""""""""""""""""""""""""""'''')**//)&%%%%%-1++*'&%%%&%%%%%%%%%%%%%&')-55--ª*&&&&&&&&&&&&&&&&'''''''''''''''''')))"""""""""""""""""""""""""""""""""""""""")'''*++--&&&%%%%*1-+++)'&&%%%%%%%%%%%%%&'+/593*+-&&&&&&&&&&&&&&&''''''''''''''''''))))""""""""""""""""""""""""""""""""""""""""'&&&'''+)&&&&%%%&+1/*+++))'&&%%%%&%%&&&)-35771**-*&&&&&&&&&&&&&&&'''''''''''''''''''))))""""""""""""""""""""""""""""""""""""""""&%&''''--'&&&%%%%&-3-*+----+*)')'''')*+/35575-5 &&&&&&&&&&&&&&&&'''''''''''''''''')))))""""""""""""""""""""""""""""""""""""""""%%&&'')++''&%%%%%%&-5/)*-//1//-//-///15751155+59&&&&&&&&&&&&&&&''''''''''''''''''))))))""""""""""""""""""""""""""""""""""""""""%&'')*-)'%')&%%%%%%&-3-*'*+-/11133333575/++1591-'&&&&&&&&&&&&&&'''''''''''''''''''))))))""""""""""""""""""""""""""""""""""""""""%&&&&**&&&&)'&%%%%%%&-97+&&')*+--//-/351*'+17|/&&&&&&&&&&&&&&''''''''''''''''''')))))))""""""""""""""""""""""""""""""""""""""""%%%&&')%&&&&''&%%%%%%&&-97/)'&''')''+13-'&99²*&&&&&&&&&&&&&'''''''''''''''''''')))))))""""""""""""""""""""""""""""""""""""""""%%%&&')''&&&&&%%%%%%%%%&+75-&'&&&'+31-))97'&&&&&&&&&&&&''''''''''''''''''''))))))))""""""""""""""""""""""""""""""""""""""""%%%&&&')'&%%%%%%%%%%%%%%%&'17535/95997 +'&&&&&&&&&&'''''''''''''''''''')))))))))""""""""""""""""""""""""""""""""""""""""&&&%%&&''&%%%%%%%%%%%%%%&%%%'*/7ʪRO7 759/)'&&&&&&&&''''''''''''''''''''')))))))))""""""""""""""""""""""""""""""""""""""""&&&&&&&&%%%%%%%%%%%%%%%%&&&&&&&)&-*979+93/55:1-)'&&&&&&'''''''''''''''''''''))))))))))""""""""""""""""""""""""""""""""""""""""&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&)+175-/ 73511/*)'&&&''''''''''''''''''''')))))))))))""""""""""""""""""""""""""""""""""""""""&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&)-1333/9353+*:311/+)'''''''''''''''''''''''))))))))))))""""""""""""""""""""""""""""""""""""""""&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&')+/1/-15O915/))º/11/-**'''''''''''''''''''''))))))))))))""""""""""""""""""""""""""""""""""""""""&&&&&&&&&&&&&&&&&&&&&&&&&&&&&'*-//+**-153-'/R71+/11/-*)'''''''''''''''''')))))))))))))""""""""""""""""""""""""""""""""""""""""&&&&&&&&&&&&&&&&&&&&&&&&&&&&)+-//+)')/O71*'7:*7*-/11/+*''''''''''''''''))))))))))))))""""""""""""""""""""""""""""""""""""""""&&&&&&&&&&&&&&&&&&&&'''''))*-//-*)''*3O7/*)²1993)*+///+*'''''''''''''')))))))))))))))""""""""""""""""""""""""""""""""""""""""&&&&&&&&&&&&&&&&&')))**+++-/11-*'''*3²91*1-&'/3*)*+--+*)'''''''''''))))))))))))))))""""""""""""""""""""""""""""""""""""""""&&''&&&&&&&&&&&'))*++++----/11+'&'+39:93-Ң-''177:'')+--+*)''''''''')))))))))))))))))""""""""""""""""""""""""""""""""""""""""&&&&''''&&&&&'')*++++******-/-)''*3/)-:75'''''79+)*+--+*)'''''''))))))))))))))))))""""""""""""""""""""""""""""""""""""""""&&&'''''''''')*****))''''')+-+)'+5/'&)7:¢5)'''')+:7))+--+*)''''')))))))))))))))))))""""""""""""""""""""""""""""""""""""""""&&&'*****)))*++*))'&&&&&&&)--*)+:91)'&)55-*)''''+39-+--+*))))))))))))))))))))))))""""""""""""""""""""""""""""""""""""""""''')*+**+***+-+)''&&&&&'''+----79+)'')-R73/+)'''''*7:5-++--+***))))))))))))))))))))""""""""""""""""""""""""""""""""""""""""''')***+**)*++*'&&&&'**+1379:9:/*)*+5::7551+)''''')-99-*+----++**)))))))))))))))))""""""""""""""""""""""""""""""""""""""""''')**+-*)')**)'&&'+-3351/597/37++--33/3Ҳ91551-*))))))+55-**+----++*))))))))))))))))""""""""""""""""""""""""""""""""""""""""'')))*+-+)))**''')+/1-+)&'*---33---35++-113531/+*******75-*****++++**))))))))))))))""""""""""""""""""""""""""""""""""""""""'')))*+**+-++*)'*/-+)'&'''*--/91+++9:1-*)+-93//11/-++++**/35+))))***+++****))))))))))""""""""""""""""""""""""""""""""""""""""''))*++//-373/--53''''''')*-11:+))393/-))*-:1*---+*******/73+))))))**+++++***)))))))""""""""""""""""""""""""""""""""""""""""'')***+/-*/31--/5/'''')))*-/11:7)'*95/1-*))/53*+++*)))))**/55-))))))***+++****))))))""""""""""""""""""""""""""""""""""""""""''')))*-**-+)))*1*)******+-/11:7)'/7-/1/**17917²9+++*)))))))*-37/+*******+********))))""""""""""""""""""""""""""""""""""""""""'''))*+++/1*)))-3+++-+***+-/13:7)*75/77757539/-9:1++)))))))***/5751-++++++++******)))""""""""""""""""""""""""""""""""""""""""''''*++))--)')*33--//+**+---139+157:-+::1--3+*)*)*******-157771----++++**++*))""""""""""""""""""""""""""""""""""""""""''''**)))++**+193--/--+++---1177-ʺ751//-97++173+-99Һ91/////-++++----/3751----+++++*)))""""""""""""""""""""""""""""""""""""""""''''))***++--+15/+++--++++-//15:57-*))*-97+++35++7/-:9/3113331///////115751///--+**)))""""""""""""""""""""""""""""""""""""""""''''')*))*)+*'*-+**++--++-13339::/*)))*-9-*)-5/-5+-155+++--/355311335331377531/-+**)))""""""""""""""""""""""""""""""""""""""""''''')*)**)**))++*+/++--115795:99-****+/:+)))+335*-//73--//1335777775553333311-+***))"""""""""""""""""""""""""""""""""""""""""'''''')'**')*)')**+/---39511-/7-93+++*+59-)*))-9*--/57111335777799777755311/--+***)""""""""""""""""""""""""""""""""""""""""""''''''''))'))''')+-/13357/--133-:91/++39955-+))+951---3973557999:::::99775331/-++****""""""""""""""""""""""""""""""""""""""""""'''''''))''''''')+-/3351311151*19:5-+17951/35+)*//*571-/575799:::975311/-+****"""""""""""""""""""""""""""""""""""""""""""''''''''''''''''')+/-+-+/1--7++9335+*35-++**1+)+1*)-57715757:::97531/-+))**""""""""""""""""""""""""""""""""""""""""""""''''''''''''''''')*-****+/+*/*1:31991-/--+*)/5--+))*+/35:79:º:9753/+)')**""""""""""""""""""""""""""""""""""""""""""""")))''''''''''''''')**+-+-11++15:5:9+*+++++39/*)))*+-/39:º:91+)&'')**"""""""""""""""""""""""""""""""""""""""""""""")))))))))))))))))))))*+--++)1:373--351111//-15*))))*+-/19'*13:93-+'#%%&'')**""""""""""""""""""""""""""""""""""""""""""""""")))))))))))))))))))))))++)))33*//))*--+11/-*-1*))))*+--19:º*;;;;;;;;#%%&'')**""""""""""""""""""""""""""""""""""""""""""""""""))))))))))))))))))))))*-+)*+/-*//)))-/))*)**+3)))))**-/397:º1;;;;;;;#%%&'')**"""""""""""""""""""""""""""""""""""""""""""""""""))))))))))))))))))))))*++))*+**--*))13))*)**-/)))))*+-/599:º1;;;;;;#%%&'')**"""""""""""""""""""""""""""""""""""""""""""""""""")))))))))))))))))))))))))))**))*--))/3*))))*3/)))))*+-/399:/;;;;;#%%&'')**"""""""""""""""""""""""""""""""""""""""""""""""""""))))))))))))))))))))))))))***)))*--+11**+++-1/)))))*+-/39::/;;;;#%%&'')**""""""""""""""""""""""""""""""""""""""""""""""""""""))))))))))))))))))))))))))))*))))*+//-**+++**+*)))*++-/39/;;;#%%&'')**""""""""""""""""""""""""""""""""""""""""""""""""""""")))))))))))))))))))))))))))))))))))*)))))))))++*))*+--137::-;;#%%&'')**""""""""""""""""""""""""""""""""""""""""""""""""""""""))))))))))))))))))))))))))))))))***+*))))))))*--+*++--13799:::&;#%%&'')**"""""""""""""""""""""""""""""""""""""""""""""""""""""""))))))))))))))))))))))))))))))))**++))))))))))*+***+-/13779999%#%%&'')**"""""""""""""""""""""""""""""""""""""""""""""""""""""""")))))))))))))))))))))))))))))))))))))))))))))))*)**+-/13577775#%%&'')**""""""""""""""""""""""""""""""""""""""""""""""""""""""""")))))))))))))))))))))))))))))))))))))))))))))))*)**+-/1137755/%%&'')**""""""""""""""""""""""""""""""""""""""""""""""""""""""""""))))))))))))))))))))))))))))))))))))))))))))))**)**+--/133333*%&'')**"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""))))))))))))))))))))))))))))))))))))))))))))))**)**+--/113331&&'')**"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""")))))))))))))))))))))))))))))))))))))))))))))))))**+--//1111/&'')**""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""")))))))))))))))))))))))))))))))))))))))))))))))))**++--/////*'')**"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""")))))))))))))))))))))))))))))))))))))))))))))))))***++------'')**""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""")))))))))))))))))))))))))))))))))))))))))))))))))***+++---+*')**"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""")))))))))))))))))))))))))))))))))))))))))))))))))****++++++))**"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""))))))))))))))))))))))))))))))))))))))))))))))))))*********)**"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""")))))))))))))))))))))))))))))))))))))))))))))))))))**********"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""))))))))))))))))))))))))))))))))))))))))))))))))))))*****)**""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""))))))))))))))))))))))))))))))))))))))))))))))))))))))))))*""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""")))))))))))))))))))))))))))))))))))))))))))))))))))))))))*""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""))))))))))))))))))))))))))))))))))))))))))))))))))))))))*"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""?????(0` GGGeeeWWWssslllyyyLLLiiipppvvvgggjjjtttuuuxxx~~~RRRRMMMRRRRRRRRRYYYYYY``````ggggRRMMMMMMMRRRRRRRYYYYYY``````ggggdRMMMMMMMMMRRRRRRYYYYYY``````gggg_RMMMMMMMMMMRRRRRRYYYYYY``````ggg_MMMMMMMMMMMRRRRRg gYYYY``````ggg_MMMMMMMMMMMRRRRRgvYYYY``````ggg_MMMMMMMMMMMRRRRRRY`Y``````ggg_MMMMMMMMMMMRRRRRRYySd_B~~vg`ggg_RMMMMMMMMMRRRRRRRYdkYv~kB_dd_ng_RMMMMMMMMMRRRRRRYYvBYY`````nBZdSRRRMMMMMMRRRRRRRYY~dYY``````ggnRRRRRRRRRRRRRRRYYYnZYY``````gggg_RYYRRYYRYRRRRRRYYYvBY```````gggg_RYYRYYRRYRRRRRYYYYdY``````ggggg_RYYR`RRR`RRRRYYYYYy```````ggggg_Ygv`nRYngYRRYYYYYYy~```````ggggg_`Y`nnngYYYYYYYYYY`_n``````gggggg_YYYnnYYY`YYYYYYYv_```````gggggg_``n`YgvYYYYYYYYYYB``````ggggggg_`Yn`YYv~YYYYYYYYgd``````gggggggn_Ygg``YY~vYYYYYnd`````ggggggggn_Y`gYYYYYgyykdv`````gggggggnn_`Y`YYYYYYY`vdv~````gggggggnnn_``````````````B`y``ggggggggnnnn_`````````````~k`ykgggggggggnnnn_````````````~yvkgyynggggggnnnnn_`g``````ggg`SggBggggnnnnnn_`gg```ny`~ygggnggnnnnnnn_ggnvv~~ng`nngg_ggggnnnnnnnn_ggv~n~ngggv~~yBBnggn~vvvvvn_gnv~vggggny~~yB~v~~~vn_ggnvvvnnvn~ygngvvn_ggnnggv~vv~y~yBkBB~vvggggggn~~~yvn~vkd_ZZ_kyvvnngggggn~v~~vnvkS_B~nn_nnnnnnnnvnvvvnnnvdSSMMMR`n_nnnnnnnnnnnn~vv~n~dSMMR`n_nnnnnnnnnnnnvnnnn~~kZZMR`n_nnnnnnnnnnnnnnnnnv~BdR`n_nnnnnnnnnnnnnnnnnvyyv`n_nnnnnnnnnnnnnnnnnv~gn_nnnnnnnnnnnnnnnnnv~~n_nnnnnnnnnnnnnnnnnnvvvvnnnnnnnnnnnnnnnnnnnvv?( @vvvGGGGNNNN+++GGGGNNNN+++GGGGNNNN++GGGGNNNN++G/GNNNN++G;DD f++GGDG+f DGG/NNNN++ GGG/NNNN+++GGGGGGGGGNNNN++++GG+NGNNGGGGNNNNN++++GNNffNGGGGGGfNNNN++++NN+NfNGGGGGGkNNN++++/NN+NGf/GGGN/NNN+++++/GN+NGNfkk;kNN+++++//NNNNNNNNfkkN+++++///NNNNNNNNN+/ f+++++///NNNNNNNN/ f +++////N++NN/kk / D++k //////++/fk/++k/D/+ff////++fff+++  kk ff++///fkffk  k+++++kkk ;Dk//////fkkfkf;k++f/////////kffk ;DGf////////////k kGf////////////k D/f////////////k f////////////fk?( @333fff}ssǏǏǏ>s>scontextfree-3.0.5+dfsg1.orig/src-win/res/newbusy_f16.ico0000644000175000017500000000427612076364074021471 0ustar brambram ( @555fff333hhh444      ?s7????contextfree-3.0.5+dfsg1.orig/src-win/res/newbusy_f14.ico0000644000175000017500000000427612076364074021467 0ustar brambram ( @444fffPPP333    ?s????contextfree-3.0.5+dfsg1.orig/src-win/res/dropper.png0000644000175000017500000006263712076364074021013 0ustar brambramPNG  IHDRasBIT|d pHYs  ~tEXtCreation Time01/25/07k% tEXtSoftwareMacromedia Fireworks MX*$^prVWx 0 E"38`> w4yWs;> W_|v::l>F泟^tx9VUiHmkBF)3pmkTSx]WH7Bn3{fs٧O#3#B%ǖ/@ߪ֭պb'NhYKׯU]׭yܝ͵lەa]g.޲AۙkE`Hg90T ,5_;빲[y r[3|qp؇MMjg_pl;tk6LVNPѢeAV.lb_`C!iѷI!i ffm!b7`[$U{s(G5Lh!x!U.AK GŮzm0!G!,r15-ټV[X#lvx9̆S>`5R>)gPwLC $ ` UyHa@x3&7=wó+2^@9bzOeEDTzg7I ߙ1.[ t[1 kWj9riE;(,yĽZ3EE!If0q>U܆@pDe'y 11ve!/S& ɑI/"]l3`c pN{}lL#l_*"Z%3j?t |=pXi 6ɍDrO 0]S^';tר2qw7NVvR@띨$ 5JM u]1uDК˵,%~x#._IV_4,Hg٠͑7O d"=.Rګmӈ#PA0;QMz@12x2qf*K$8 ĉyNw鄗&Tdh4{9 q8&*1ljJ&)x2JXM@SN2"&#P$e0⁰΋ª:!d`Ai b "y8<`3KR$ֹ:u.B%3:=;R>M &ÆB6]16 `> ѳ%h\t ɇaV>:'[&A)BLDž R4#t+rɦC_O6rŮUYr?=a#H'.g<<#~%M >h7Ǥ.Q7Yp7 71ص=!oX/ YQט@qL.̘ Q3L$uOtD%(\#f۞xQD/2`Ƶdl1$ja.gB*tݨ'^hf, Wg:ys ݭI<؛& J d0$ڙ` %.3UEPqɵ$т{LEj F8KHYU[T w93%hiON z捞.)F>d;+D3!5KpdN9${/a<_4ަgnTh@52F*Gdhq '<ޱps'nNCaLg %lZ!|M ~ߟ)aJzD;| G?7"u2pp#E׾wעxIo C3) kIau6b+Np Z—c/%Xs[S-P541pC  Hu'IvH2Z7Ն"Шז'!scFQ#wΪyƣ˴1^@P?ٲn0b a7+Ml2bzpOֺ2|Kł}Q`e룄[2 ۧw6(m~+sN5E/m}zzաFOo j"t _Fe|Aw7E 8 =Kqc~8-6bowN] U/s,4_Ӧgԛw_y[kCδ#Z҆A h92)Zx8Oknht҄!??_-'|<4^0竁OEq,D*Wp O 眚d-iSBvfv{m`%GdZE'hbr~#h-fL#"Pnb- ?*b373~-?h0%Gqŵq8e/6yI= ?d< 0vssg?x_2tЕK.:CoFZK.99(9蒣s8LzKvv\s9r&>W2tеK.:CڂkCbj쒳K.9;GT쒡Kwd蒡eX7N+y ع\yWξuޅw%CC+J.: C+J^.Wޕ]rtǷdu`r]%;q|;+J^.Wޕ ]2t.Wޕ]+9<q-Al,2e7񙱬gvSBWZ n}<>up|q+;[^9ʬ%l{[ x$v{OoP߽w#6n7w5 6"e8 5雂|\m\C=wc86 sƣYh2¸b؛wz8>]6qx}-LsY٥SwƎ^H^96vC@="&9Yg7јO1S~O #ɓ3Oz{JݤQ0mDαwtu /"2[zVe+e?tB6aPLbeDCBY&z`ObGcO4FedPXL_t{goɪS*k2yÜN KeF}z?@io[V,}z"rM}[5|ϻ>uR*F{tI8sWJ>˱gY{Özu0f^3˙/)ߛnt^NyUY'T u_(2QjqX͸8,:`̄e&k[f%ʬD(xLhz|5l,\ 3z ƈjDlCi3f4/l9╵B6;Ѯ׾33W$6S{?W[ޛ_6kaބ*zJ5-ʺ:Է{wCUwhR^i:U/4yAkGYͶ&('M{J?Qo;]ӻ-I׏f0FοIz2/dy?R[ >){uŽpRS5͸k*o&$hA]n&aԨ릓; 2lxgǓe]DّH9[({Oנ-~(:w~D7,d1[?NUػ}PȳDZ5fh4BaƤ*|ۅoclbG zpH PkqUQw"pe(Lֲ];+,*vvYѦ‚O6Q ~ͫXZ+Yx=ujzo=6+z-gY'tk]@SRIisڧi{þq;_)+4VBe.0Q]mht[PPo-(ɄՖ^,4`C$aë^l;?=Ђ V_j 5n֦͚Jbqr?awƋx7@ZH#rWkȍfvtM?zK*5(߲ٮh{f?|-'x#!? *mkBSx]N0QWV `o4Isͨ"2bB9 ]eq)F/PTWDMZ0`Td/%8z"[1`{=ؚy`C"qIQEʠTevnl_)wC7P]& 9Ҿeln"'ۯ6Z[ȏ*mkBTx}+$+nʔiSL")HdJ,DbH$T3;;W֊z]@&-Y>\yنytc u/$р_ ݈vvvͅUJ@4ZaE6HxV:F6Q>KSy.&{<}Ad:KN?2 n37,OMEN#HF`?- j!j {r+%Aqh $S@%%|9`ƅ}6.?jU 7KBC_{-׮8`Se[ lhF-*,?nt WTe\ÚMOsf^|ŝ}Em ;GFn^Kb[dAݜҥy_g:=h5=#*|3z¡F#$̣[^Y EO)ـ~Iȑ8  Ľ&C}24 L >bXXFkhFWI. -h-yU`F m<}hRvTf}|dT@OP\I' 0%U-b2֓yxd^ƣcAēwP)Xͣ KZQX!+}~CX@- >9Fwx+$@>,#Xٵ1vQ5%tᑄJ#5̖3S=R e[OjRgfM߉ZpE9%辴tc⏥R1. p8Ywh;w@^tug.XHT^?2!+tU#_:{*!nygn:@ Zgpwp٧P栢=ԇ|Utl7~䙔@0 +h%\'̊!Lu`tp/߹÷0!:lH- gA ^Z1KO_<*•G}|;n'e}*#(4hB9Th玡NŶ@%fĠpo9,vrdԬ,qcD-7= 7V >v`f1B+?`ؕ?ջ+yKV"o6TpŚUk}"bɍ7!H*3(Tu|jGyŪEe18-BYYdf[L>='4"}\x乢2EOcvxV|MڡBs%ȧԜ?U$g{075պ[=h`Iu7ޡ1t(f\%}R@uPA(@0Mz>n /:{7l6u]~m'3u/OOX-?Jk3pMNVnuS>q$t>NSgِ,yfzkf6{4!ڵ Y̳X?%ţG|j}~H)'FCy6)$.[xgߍJ<MC+QgPX 7~PT֜~5=4WaH]0/qJ!Ѧ?q?+kpB7ޠ">G}W=\&fH0e kƲ]N0Gg45*O xFD ~Pv_u9%|?vǾal*.p,S?5jPt~ۢ4$FMm3\9\fVdٿIuKk+s]h?:iĺ-^pYljkeA ֣;$3~:LH Ip#W,%ebbad{O`eE}9!mB ,ƈyAUkb]Nø ˌD_ˁj5j%u^׸ `O g9cE @=BHMlk@$ ءۖ#iBOOA\zXCR%ˆ6 _loNVL?7\iB#~_l5zq#wRf|{jSKlcԁt*=LfLQJ_Ke[LE(EU0"R4hbR |;i@fT,}X?GBP7A#Hk2dwըU¢ {3eKxŨ!tϼѝ;ZهMK+2S:¾m:ʋT,شt|H>(;:HfT+_oG=3fLál,0K@I rHmD-Kɵ""7@8bRz=Dmc CF_ŀT-DM2_=Wl@F䴦"%b||+h Un+z`Dv~_ClO$>Y Bcyg |rp]o:8khۘM埁/W^ֆE^ls wfY~(cUSM6:-=j0y-AgЀNN2g$>+y| GA]cپ6m n5v{y4y:l<5y7/CBqP!L||R۝I׷Iw|X\Zꑽܳuu}1c%(Hh!!&>{Ny! BC~{ Uz-b i>hTN./hY}_sPp͠ '.D1bԿoK'mCn0H]_ _&kdx3{G!~KdlfPej9dm5Zq[nJ;#:u|CC-y Oo!N獼7;tYW[kcd [@P {q7wΎd'>{*QVؿMAN: Zl]ѓ䯹c[}: pz$1 U(rtH):=)_]2{xlu:0'Y0v~p %Nj #o^'X՜T¯-d'dT{voƧ߇&9ގlOz|lxq!leP>ޓ 4lBޞ}yơ$9Eg/>_Y\j*SCş9Pdo/g_J7wG`fע4>*04yWĉ &oD93mϻL}5Čގv$OEA0h61s_ qhL`Iw^%M2g 0=f_v fM7R;IEJQ04Ys N[4HWR99s_;o@O7 @s21FQyhm`:o_ π7:zAE^,έx!{>!7r#{77;"{&/0WßﳠA[yυmk}ݲC,NZ M9@`CtD"<p& ^K_J}GR}/ +-khO.ЙZ"W 83;&_ EKًH|!GCVyhKj-үP~Z̚lpyN7;aACNh }p*}FZM8oMGeh ŕW&;0ܕ +$Dz sD %0x/{gݷB#cpD˵#e"K/) !Y#̓Dlg4b>EM3T (9&p~-'GɑlY[?E.`ހM Evn4s<{nҟ4z3ƿM(p4x։m |&x%Z@({~N1qy8FPjDo6SXyhr :JgǾfN&b7Ԋ{dK<ڜw#sںN}xU~Mf_ 244yYhtvш̪>Qc8{Y oߛ|u߄6W(-ߺȍ# n֚MPj] Mp# y}XK sSU>q݁(yug5s3q !{;ߓ"4dG _4>7IH4(.#B ؜cz (#}%şnMC- }|[ϸ%6Pe>4RQoZ ]r;^@UofJ_nnaL3RlP?yרfchRr$R΄"rKG,-cJ铞\ੂJq{} y+wܥMYaq$xH{h2؂H!XG-Cz+Ng÷M#Y#dnrjE!ٯ.Th";vv ׏I42'ZJFBѳ$.2n;ӹtw=xt劉f>W:m+zl<Q CsBL@G1RB9zBG/u9߱\!p"Mj} ӆr)nST&t`&YfpKOm5oI~6;6h'!aG^drE% v <R1%/LPskK\wIΌ\ӀxI7Jb(i(H<'ߟ-Ԥ)ycNŚ:V J>̛jATg /d^YOCrG:ic;CʀW4' hJ7_sQL3!Mۯ6Ky{⼲q 7x˼`[(sk349bx7|q T zըH?-m䙄3ΐ{K@lg)ݺ@ RtiMd\zK.(\rZȞqp~M`d6 /wOd`.HyEϼ zd&<ʉdd9}hR^օ=W"3D_=,!l,ŏq?E?BІ^^c] J*סIq+\bjō 0}6?t6Gл̂:?s%V/Df= ~4_ M=? uA? L`R.[ B:RZ^A)D(ϼRSJu!lꟆ&/Λ cM}[cXaDe(_Lz"oHqcTxwt]8a S!BɄL}XJ" Y[8—>;r xDv؅7Q/b .=_U$?&Y ]X>e F€"UE,hi#z@7Hzc/x27m0"f\0Ѓ>#au Mb5s$Tvb18#{c4+Ώѭ _'2Eeoߟe-2$i%  MrNMAN.9$Dayj~\l;]?B~^Ng~5/Bmu%hk^BiJʵ+w @F!M*yg_8,|:ֆmWàc 3FGu~2'uF=!"ct8/ZԸruڐGtXCg5ZbKZbb[^V ٤)E=+!KΔ\C50!xV~&,~"1>ύ^/kdCmBb4 rQ"x D!W'ܻ}QΏy"Bx|31H.Ͷ2!qb̬?M!?q9><-lW]M}m5NgO4Z{m݅o #CÇM] 2h2_AG@nn*I J<&ߟ Jk`:1Ϩ#{D+B2y\i1^_E1lAbBAnE FX0>>H1'H$K[~ l5n}*jV9/@>RL.$?m>EN$D'~.%8yFc`}{C;+@03Ft̋g; $O)O:f |"""yAБlDk#/{φ7$Ő; Žz ,^rp"~}5C|pKAyɼ"7zq%{SJ{.̥܅ؔNICC!nVzСÒ+e1f(G -/3h)I=қUbPxF?M;YͶTj^zWyr>&5zRnqO÷ My}vP/vFZ4Z#GqES:/]`<{f#y3lfT9FG Oy6uB%|@uf~3˙@}XSwx$"Q}S!T AHP!.Eev_\κ7+miy4qv0‰jdž?+o^+-Y>VH?uhR?wX[ЦKZ$'͡WF E c[`P[Џ q\_]R +zZQ>3jQÉ(cF̬BYB-yFvrQYc? PCt8|];_ svXV +P٭o)1[H>fo]HL@c9w ttW#0*-ZDx}n;,^y{Rn] *j^D;b0 7 63&7*}QxoɶR^dte3a(ԍʛ?ߚW♰\#zz>% T,ȦRkYp\V$PUઐuAXcg{ .uU69WDԶ,|=?_xb}N@;|P%})A?zR!@@P?t@Jy1P{mS̔eYZ^w^1*| ֊9L'd !P'hKh70b:lf'bYykxDm1mx*|u'8B@(čbJJc~0y7ŏz #9{khA׿Y&Y7NU6S@cFLRz}n@*&d^O?bF4k@~O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?YMwPmkBTnx1 0EB-R'0 ,R]#Xߵȣg>W[׻gI@XjjgiЃ`0 `0 ?ϟ|:seQ3|ӧO|:2|.};7eGFO6_Qv]T]^ˮg{>pjzkuo{yye?{-x/ D:3D&򈼹e^Hyi#/OGzϪ߯_~ :sMe#M3Y#=2 QЙ[\s=E8}E>GȩT ڲTg-}VfoSVwzV}./>~!?U1<#}=F[ ~QڋBN..+푹^edLo+[\-k dW(}6q$#?z6Bөi?L7!3O_Q}Пuo[=tkȋM!'}/Ƈdr2_Cﲨ: `0 :8o=+8-4}۞cĥXdq{bUq©ήm!ƶg*ΪU\z[GA=^+ru{LV U?)V>ғ)x|Yҁgi\yi^cUo*= !TY?rfgWsʽVn*VX#=Fϫ+[F~yH\L~[O҇h5ݵTow|Sfӟ+);F;:x )/OS yUo2e)Ve3'wgGg=J^`0  ľu kU,Ksؑ5nY,bXw{ w&3QהNQev ]ƷgcH˞i{A3I8hwduwUIWq8I>+@pQşGcZ\ƪUߝ]/:3d;ɫ:gB9R|GW~w2;fzt|+i5nΟgZY|<1NyŬ|E7k?z/k><=Α}N΅>uWydʬdz `0 *\?W8GY:Dgcg< 2+'W6qn؟{ru"wU쏘~c#T?+y{Q,,^qF/Xv8.֩g3}ȸOP ~n%hUG4(_sn|W}Tg&x^c,Fѭ+ <#+}/Uw8BRh_|33!mr\7U9m({ѝpvew[xG]߱?g;,nҽow8]וb?OV=Z_#ve?vN_WrYLo;1g9pV^G~>[_vNOS3 `0Q[ veO\k^8֔v<Zbz\Opbn$~}oz3ј mK vU]^iNWA#x딫jt q :E= z%օq)CcYEqyRG-+u (K\hP'*^ء^q=m=y|Kvūe\rȊ4={W1;=ݷxp;o@>ȘT\Ԏ+C=*ɫ|GJOCW]x1.ﵠ9_Eб Vq)v(ʑ}[GwǺ{-oSdו_˞׃2;iT&w*w:g׭SOsj%Z[~_˯d֮+w]7 `0]kIu+eL]ւoA^;=GR?v쯱;<y o$N1紈=:ߥPVu< <&3KyC/4r)i=*/|Ύ^]QNН1qGw>ù{ ?Kv:A}E:_n+{u=rq͓̳]>>d}+|L01`0 leg:׺񶊝`W,3O?]\9P~[kOWiGc~)-<w.3q}'vuw$Vnv(r52S;Wk_Kϔ8B/hEՠ'9w?K;x:x<|@cϽVyc@ۖSw8Bq]=2lBe6V}eR( VeZT4ade2ޒ+nYBTqSߔ<[&=f[|szP)G}{Zׅ3n7jpWwftEw[ǽ;`l? `0 `0 `{~i`oLy>uoi\qK|}7Svu9G쯿c¾#>,jow{ՆݲL=mW2u_8دjo?kD߱mw>#}E:OۡO;y`$j mkBTx흍8 FSHI!)$FRHnw HYx3ꇤsaaaaxIǏ'U{o_ھgW9 o'GW {>~Jlo߾)*/N\ϱov[iZ_ձaJΝ/:6O- 92b?Tlk%?_21B sY5>:>c=1Ow y^- ڶ,XzusM#גU]>H_yYv!ۉ_mi Rus]Xm_g)YY)m]y,m z1aaaxEߓGקo/Y\k6xjgH|yu.\aæM&wk#ϐ$?]Mo\Ⱦ,/ڥQ@~6s?)}, l gX #vQg Bٙ^uのuhm?}{].~}v_J;xogJY]޳@.)oqC?}>@Xߘ'-(W? źvƔOʙRv[K?[A}?-wmՑ}g\=c}M ggg DŽ-B^k_g?F? v0||؎=ǧHPgs/hؑI t~{n^}ZyD5XWvO)"c0vY Z|~_%/,p\ɹyΰZ/;/xs_9?Pܯ5ݻ\[y|č8gʱL{? 0 0 _k3>z_\S |<)b|7aaaxn.ta?l^Cvkؽ#~e)3<3^kdlc&jK+o"e<.ʞ`^(3zu l+6v<ï k7]/lc[`On}򚄫 G뎱zt^v2)?;Wmr5ocIz?Ozx{&!ez."ѯ 1Gg{+ҏlw<=}GݽFƨ^)zIpG K֜{{e G12ۭqiumf>.}~a? 0 0 [u+7Svq֭y΅ ?ނ}XwŶv?ߩDZۓ-q/?߳=<~#>Fk"qzrQo 9r,nY[;o:)@-`ק-7({߯S@µK9֠ɸ>:n3 _[_*mtcmC>qSL=<6;ǫsaaa{xˌ\ފpx?0׋#5zяc]x^l򼠕(f:~٣^lin59W~\;?vn6erUbS~v^U O7O(|;+SG4|?f*?rW~2oNٟS9~daևmH6mX[J~s.ym4ٶO|Bd/b5ɿyU? 0 0 0 0 0 0 0.P~*1@G\⟿KrKXs2(ߥ纎J8'>X@▼QQbqwx b)_K|v 1M6kee-2Ǜ59?K^E~9ϱQﱮYF8N?~;:=J<-tĒyNAgC \NXKs)'^Kg\~2}6}Գ)n]Or^j~"{p29w6/.z-v:+M{WJYZ굢`% Ҥl9ힶկ#OUz+U?;sd~vND7*.Y+v:ye;8}~|+ÑޅN9}{Bƞ#txխsXɿkSV/uJ=o G<ջL'L:D]6jfgLz/+ؽ[{rCMYq~[{yy czA;w9zszWHVax3 afmkBTHxڍm0aaAXAtNuө~"B~v(I$Ic i#Gl6p8޾s[ouv?Ru߯+fԍ^|}m43ϭu!Z9RUY׽B,z"|~>/|RתY̞EGߔ뙷L?:fV\꺯Pv#R>cNb=^Fz=yNI}.3?3̥*Ǫ7٧ڞƵ2~zWİg#g&2yK;wʞ2vm"Ggʼd~g<[şXlk=^k͞Gy\ׇ3M^&}V3=3ڣ<_(녾v9> G@Sǿ99Gy*"QYu*lz;{-/9v=Q_s>c),k:gQ%ԝ,SFwA2vWcWqlׯ[},g7F}.2˘ڳ #include #include #include "cfdg.h" #define myWM_USER (0x400) class WinSystem : public AbstractSystem { public: enum { WM_USER_MESSAGE_UPDATE = myWM_USER + 100, WM_USER_STATUS_UPDATE = myWM_USER + 101, WM_USER_SYNTAX_ERROR = myWM_USER + 102, WM_ACTIVATE = 0x0006, WA_ACTIVE = 1, WM_DDE_INITIATE = 0x03E0, WM_DDE_EXECUTE = 0x03E8, WM_DDE_ACK = 0x3E4, SW_SHOWNORMAL = 1, EM_SETTABSTOPS = 0x00CB}; WinSystem(void*); ~WinSystem(); virtual void message(const char* fmt, ...); virtual void syntaxError(const CfdgError& err); virtual bool error(bool errorOccurred = true); virtual std::istream* openFileForRead(const std::string& path); virtual std::istream* tempFileForRead(const std::string& path); virtual std::ostream* tempFileForWrite(std::string& prefixInNameOut); // caller must delete returned streams when done virtual std::string relativeFilePath( const std::string& base, const std::string& rel); virtual void orphan(); virtual void stats(const Stats&); void statusUpdate(); bool updateInfo(const char* name, const char* text); static std::map ExampleMap; static void AddExample(const char* name, const char* text); std::string mName; std::string mText; private: void* mWindow; bool mErrorMode; }; #endif // INCLUDE_WINSYSTEM_Hcontextfree-3.0.5+dfsg1.orig/src-win/getopt.c0000644000175000017500000000445112076364074017475 0ustar brambram/* ::[[ @(#) getopt.c 1.5 89/03/11 05:40:23 ]]:: */ #ifndef LINT static const char Id[] = "$Id: getopt.c,v 1.2 2002/11/22 22:06:46 tom Exp $"; #endif /* * Here's something you've all been waiting for: the AT&T public domain * source for getopt(3). It is the code which was given out at the 1985 * UNIFORUM conference in Dallas. I obtained it by electronic mail * directly from AT&T. The people there assure me that it is indeed * in the public domain. * * There is no manual page. That is because the one they gave out at * UNIFORUM was slightly different from the current System V Release 2 * manual page. The difference apparently involved a note about the * famous rules 5 and 6, recommending using white space between an option * and its first argument, and not grouping options that have arguments. * Getopt itself is currently lenient about both of these things White * space is allowed, but not mandatory, and the last option in a group can * have an argument. That particular version of the man page evidently * has no official existence, and my source at AT&T did not send a copy. * The current SVR2 man page reflects the actual behavor of this getopt. * However, I am not about to post a copy of anything licensed by AT&T. */ #include #include #define ERR(szz,czz) if(opterr){fprintf(stderr,"%s%s%c\n",argv[0],szz,czz);} int opterr = 1; int optind = 1; int optopt; char *optarg; int getopt(int argc, char **argv, char *opts) { static int sp = 1; register int c; register char *cp; if (sp == 1) { if (optind >= argc || argv[optind][0] != '/' || argv[optind][1] == '\0') return (EOF); else if (strcmp(argv[optind], "--") == 0) { optind++; return (EOF); } } optopt = c = argv[optind][sp]; if (c == ':' || (cp = strchr(opts, c)) == NULL) { ERR(": illegal option -- ", c); if (argv[optind][++sp] == '\0') { optind++; sp = 1; } return ('?'); } if (*++cp == ':') { if (argv[optind][sp + 1] != '\0') optarg = &argv[optind++][sp + 1]; else if (++optind >= argc) { ERR(": option requires an argument -- ", c); sp = 1; return ('?'); } else optarg = argv[optind++]; sp = 1; } else { if (argv[optind][++sp] == '\0') { sp = 1; optind++; } optarg = NULL; } return (c); } contextfree-3.0.5+dfsg1.orig/src-win/icons/0000755000175000017500000000000012245646004017130 5ustar brambramcontextfree-3.0.5+dfsg1.orig/src-win/icons/busy.png0000644000175000017500000007345212076364074020641 0ustar brambramPNG  IHDRasBIT|d pHYs  ~tEXtCreation Time04/20/058d tEXtSoftwareMacromedia Fireworks MX*$uprVWxձ EQ FCl}&S/ .ۼLZ?5p~hN`dSZ&v OI5B_ ]f*HmkBF)3|f;~|RΕ/-|Xl4E4#5jjIGԘ>RV0{M3d mS2 j$ǧ='Odw3<+ nƂm.$ TYމJ|R#ԤDzwDޮ01uX˵4%~x#*_qV H/YZ`h6Bؕ hp4OK*kD*@{Ivu* G`P]/,Hq6pK)xty)aq9Bn3 t%s+#J<@S,H䤣c㰉׹QXYg@0D o<b h7Ǥ.Q7^p' u61؝HzL^Ja@fe@aL.L Q!\?pяq\v="Ì&z6ЧגȒqJQ%ؓ4Rq (`pH!c7rRtC8k'$u6e ) Qd(9hv0f(|ēXRQ7푐+Rvn~9#r`H\^ؐ4W(vy`n38+nROTyGK'؃7WÀcBK!RB8}pW!3eQ.Eh9\A59{),1dt9fgV3?If $Bo"L \~d38,o%"L-=RzMfml(D̅)`?ef@:($i#y,1?v8H}T>~8KV.1D*ADFHmDY/…_;;ԝ*?Gı&I Yoe䬦@K1IPHw3,8ÇH-Z5%Be b>R`$JT"Ddb#dcoɉq85D.b:*9o?݈"x +ؘ|ĩ=0OVevFfq BW&AG%} c,5fYc-i>DhtP$E'|1f)jfil#ƟsexmrƋ.etٵdHYd}uXGVhy(%oUK?yF%eljڜ8;Yzz ZY5*|J_u$a2p>- vc8~C)L,zT6>Ggr(QrMRׂIv[ʪ 5< %{̔2?-;zH19 ,ۑtioq&]#[tz!1uvx! >LI]fFR0<ȔTx.LT%+LhJ8;q;.wx.㵓ӐLP$a 5'5^00Lk4H!JG3/ҨȿH~-r6o-TGlo(~" ^l@sNRqo1[2֠I :h݆>Nt+Ɨpv)iN=t>'jCom{PK")OqawNS6W%K K8e'1eTV*TEeLBbTw/S,YI>Ul|߹$$_[lc(-zaSQ(,_?ф9@I|j*jʣ>8͇T-ԔGM-Bd;~q &ZX/FU}4jCq.֌y7ZO9X2whГ"yEpz+jTJn%j5&HT_2-A`^35j p;xZ52-"IJ44aݾ$,iӊFGu՘7rm\j(#׬]*GyedMT-u67 l,@JdM"yHV*,"vFOiu@^[ڞωE:Y.h|AfUdaIoջiu\Ճ1"zpO-HA@֨Duc >I^ɾ(l0^QL-vL9(sDuS-HocrwHr=JC;\g] 9Y57ג[a2囬CZg| 9/}`,_D9IwKs5=' K_ǁ=zˡu̕*V >+jp %*}tf5(_]< _5p7,ōr[8lHnRU/s,li>MO 7;zn #Pc^M~vG]wǹDy{+`3Q0tC`0C+zGKG]ptǀh("肝W傝 v.9Cc ]0R0tC`8Cpm}H|ZB]p9[/8삳3D>.`3ȵC -3ĒɕwZʻvv.+zXyW0ti[\yWp&pt肣8w;o;+ v.9KYyW0&0t`股0tb]ggwCoC+ .c&ӧDx8~zVWJjKax+mp$DwہI粗zRnUc$ s{ JVsfDWl"dgk̶ш~GFq{Ü~!XLt,*i(Ǻ#b_1Մ]D)0;04!u3k ]0tE` SeZ%_۶O9e:p[u.S1<qlFnӘzS+$B6-SDYjtv(<Ue1J§¬|U8BYKvSI]ڣʺn߽\ݠKPnS,h w)gֈPh_hYS.ͪ/rq `;ry )8+XsZ!Ɲޤފj>NQE?FHNq6hT4XS־LD=8#2VNka}O$h;m߁pM|"ݫ= &, hLy)Ft nXwLy:`|>#qwƱS!cIͷtuK7"p4e+۾?ѿrJ6QdBB 66 hNW`O"CO4FwPHYBl:߂#ȳdaecX@&o)QQ߽^h?v;(,B\2yޥ^ǖzu1sCqf>}cS4->Kaf?RN57݁t彠3벾su_)2U*qXϸ8(&`̄f&%D(xLOY.i<W9^рoFؖh4Ðn}j9Yhel5D Mk@T҇M۰_ O%wnFn˖n,nl__vu a9O O^_K9욞Mð7UӢC}'xN|1tWy:իXROϠk2_6$ɾ"3eq5=ɷ .~809`y?Q[K|S=b+K{,5͸k Mm|}bYtE͠M7S:v?qjXM3ؙQ6߇~Ȍu=|`DYO[S-ўFNC?ai'a,W;o59֣75#RIȷ.&4O*iB'>3JNxZ[|Z>VdwHtߑ:â,\µ,|Xx3ߝmN-Z_}Qmcv(v>,4su6f9h:ڢ5h)+f1pUyA0^zGP;B !AjcNxh(U I {DMf]+,>Eڷ-[gZUX7j b/٫ zmT-3򊹇a8=!GŶq{{T{R9HKRuuXڴj94guz}UcUUkUtm&-Y>\yنytc u/$р_ ݈vvvͅUJ@4ZaE6HxV:F6Q>KSy.&{<}Ad:KN?2 n37,OMEN#HF`?- j!j {r+%Aqh $S@%%|9`ƅ}6.?jU 7KBC_{-׮8`Se[ lhF-*,?nt WTe\ÚMOsf^|ŝ}Em ;GFn^Kb[dAݜҥy_g:=h5=#*|3z¡F#$̣[^Y EO)ـ~Iȑ8  Ľ&C}24 L >bXXFkhFWI. -h-yU`F m<}hRvTf}|dT@OP\I' 0%U-b2֓yxd^ƣcAēwP)Xͣ KZQX!+}~CX@- >9Fwx+$@>,#Xٵ1vQ5%tᑄJ#5̖3S=R e[OjRgfM߉ZpE9%辴tc⏥R1. p8Ywh;w@^tug.XHT^?2!+tU#_:{*!nygn:@ Zgpwp٧P栢=ԇ|Utl7~䙔@0 +h%\'̊!Lu`tp/߹÷0!:lH- gA ^Z1KO_<*•G}|;n'e}*#(4hB9Th玡NŶ@%fĠpo9,vrdԬ,qcD-7= 7V >v`f1B+?`ؕ?ջ+yKV"o6TpŚUk}"bɍ7!H*3(Tu|jGyŪEe18-BYYdf[L>='4"}\x乢2EOcvxV|MڡBs%ȧԜ?U$g{075պ[=h`Iu7ޡ1t(f\%}R@uPA(@0Mz>n /:{7l6u]~m'3u/OOX-?Jk3pMNVnuS>q$t>NSgِ,yfzkf6{4!ڵ Y̳X?%ţG|j}~H)'FCy6)$.[xgߍJ<MC+QgPX 7~PT֜~5=4WaH]0/qJ!Ѧ?q?+kpB7ޠ">G}W=\&fH0e kƲ]N0Gg45*O xFD ~Pv_u9%|?vǾal*.p,S?5jPt~ۢ4$FMm3\9\fVdٿIuKk+s]h?:iĺ-^pYljkeA ֣;$3~:LH Ip#W,%ebbad{O`eE}9!mB ,ƈyAUkb]Nø ˌD_ˁj5j%u^׸ `O g9cE @=BHMlk@$ ءۖ#iBOOA\zXCR%ˆ6 _loNVL?7\iB#~_l5zq#wRf|{jSKlcԁt*=LfLQJ_Ke[LE(EU0"R4hbR |;i@fT,}X?GBP7A#Hk2dwըU¢ {3eKxŨ!tϼѝ;ZهMK+2S:¾m:ʋT,شt|H>(;:HfT+_oG=3fLál,0K@I rHmD-Kɵ""7@8bRz=Dmc CF_ŀT-DM2_=Wl@F䴦"%b||+h Un+z`Dv~_ClO$>Y Bcyg |rp]o:8khۘM埁/W^ֆE^ls wfY~(cUSM6:-=j0y-AgЀNN2g$>+y| GA]cپ6m n5v{y4y:l<5y7/CBqP!L||R۝I׷Iw|X\Zꑽܳuu}1c%(Hh!!&>{Ny! BC~{ Uz-b i>hTN./hY}_sPp͠ '.D1bԿoK'mCn0H]_ _&kdx3{G!~KdlfPej9dm5Zq[nJ;#:u|CC-y Oo!N獼7;tYW[kcd [@P {q7wΎd'>{*QVؿMAN: Zl]ѓ䯹c[}: pz$1 U(rtH):=)_]2{xlu:0'Y0v~p %Nj #o^'X՜T¯-d'dT{voƧ߇&9ގlOz|lxq!leP>ޓ 4lBޞ}yơ$9Eg/>_Y\j*SCş9Pdo/g_J7wG`fע4>*04yWĉ &oD93mϻL}5Čގv$OEA0h61s_ qhL`Iw^%M2g 0=f_v fM7R;IEJQ04Ys N[4HWR99s_;o@O7 @s21FQyhm`:o_ π7:zAE^,έx!{>!7r#{77;"{&/0WßﳠA[yυmk}ݲC,NZ M9@`CtD"<p& ^K_J}GR}/ +-khO.ЙZ"W 83;&_ EKًH|!GCVyhKj-үP~Z̚lpyN7;aACNh }p*}FZM8oMGeh ŕW&;0ܕ +$Dz sD %0x/{gݷB#cpD˵#e"K/) !Y#̓Dlg4b>EM3T (9&p~-'GɑlY[?E.`ހM Evn4s<{nҟ4z3ƿM(p4x։m |&x%Z@({~N1qy8FPjDo6SXyhr :JgǾfN&b7Ԋ{dK<ڜw#sںN}xU~Mf_ 244yYhtvш̪>Qc8{Y oߛ|u߄6W(-ߺȍ# n֚MPj] Mp# y}XK sSU>q݁(yug5s3q !{;ߓ"4dG _4>7IH4(.#B ؜cz (#}%şnMC- }|[ϸ%6Pe>4RQoZ ]r;^@UofJ_nnaL3RlP?yרfchRr$R΄"rKG,-cJ铞\ੂJq{} y+wܥMYaq$xH{h2؂H!XG-Cz+Ng÷M#Y#dnrjE!ٯ.Th";vv ׏I42'ZJFBѳ$.2n;ӹtw=xt劉f>W:m+zl<Q CsBL@G1RB9zBG/u9߱\!p"Mj} ӆr)nST&t`&YfpKOm5oI~6;6h'!aG^drE% v <R1%/LPskK\wIΌ\ӀxI7Jb(i(H<'ߟ-Ԥ)ycNŚ:V J>̛jATg /d^YOCrG:ic;CʀW4' hJ7_sQL3!Mۯ6Ky{⼲q 7x˼`[(sk349bx7|q T zըH?-m䙄3ΐ{K@lg)ݺ@ RtiMd\zK.(\rZȞqp~M`d6 /wOd`.HyEϼ zd&<ʉdd9}hR^օ=W"3D_=,!l,ŏq?E?BІ^^c] J*סIq+\bjō 0}6?t6Gл̂:?s%V/Df= ~4_ M=? uA? L`R.[ B:RZ^A)D(ϼRSJu!lꟆ&/Λ cM}[cXaDe(_Lz"oHqcTxwt]8a S!BɄL}XJ" Y[8—>;r xDv؅7Q/b .=_U$?&Y ]X>e F€"UE,hi#z@7Hzc/x27m0"f\0Ѓ>#au Mb5s$Tvb18#{c4+Ώѭ _'2Eeoߟe-2$i%  MrNMAN.9$Dayj~\l;]?B~^Ng~5/Bmu%hk^BiJʵ+w @F!M*yg_8,|:ֆmWàc 3FGu~2'uF=!"ct8/ZԸruڐGtXCg5ZbKZbb[^V ٤)E=+!KΔ\C50!xV~&,~"1>ύ^/kdCmBb4 rQ"x D!W'ܻ}QΏy"Bx|31H.Ͷ2!qb̬?M!?q9><-lW]M}m5NgO4Z{m݅o #CÇM] 2h2_AG@nn*I J<&ߟ Jk`:1Ϩ#{D+B2y\i1^_E1lAbBAnE FX0>>H1'H$K[~ l5n}*jV9/@>RL.$?m>EN$D'~.%8yFc`}{C;+@03Ft̋g; $O)O:f |"""yAБlDk#/{φ7$Ő; Žz ,^rp"~}5C|pKAyɼ"7zq%{SJ{.̥܅ؔNICC!nVzСÒ+e1f(G -/3h)I=қUbPxF?M;YͶTj^zWyr>&5zRnqO÷ My}vP/vFZ4Z#GqES:/]`<{f#y3lfT9FG Oy6uB%|@uf~3˙@}XSwx$"Q}S!T AHP!.Eev_\κ7+miy4qv0‰jdž?+o^+-Y>VH?uhR?wX[ЦKZ$'͡WF E c[`P[Џ q\_]R +zZQ>3jQÉ(cF̬BYB-yFvrQYc? PCt8|];_ svXV +P٭o)1[H>fo]HL@c9w ttW#0*-ZDx}n;,^y{Rn] *j^D;b0 7 63&7*}QxoɶR^dte3a(ԍʛ?ߚW♰\#zz>% T,ȦRkYp\V$PUઐuAXcg{ .uU69WDԶ,|=?_xb}N@;|P%})A?zR!@@P?t@Jy1P{mS̔eYZ^w^1*| ֊9L'd !P'hKh70b:lf'bYykxDm1mx*|u'8B@(čbJJc~0y7ŏz #9{khA׿Y&Y7NU6S@cFLRz}n@*&d^O?bF4k@~O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?YMwMmkBTPx=KP6"\E:jqQDG?ꤨG뽱7mt!pIO~Fp?Q$fweICvkս3{\KgZiWۣO샪Oo @ɿbλ;YwScPyZ+d_5AYvvuykL3l'}M/{0P הB?B9 W;S?;qpfogn._[@|'o 0QVc>^_7Қ&/}hSmkBTox1k@a?WǪ(((ZFgNHgxK!,}/_guz8}'OkD{(Sݻk)߿Qy\@MO7nnSٶ_~Q;yZ[6PTp:"ۧ6Na tq9?8]vXmkBTx=KA`[[-UlELĔ")nv e[$̞TŅeg1E&\{x\[Unu_?}y<)}7k?v]{CO~wsW^}?;=IJɑmkouDi]J?l!ӟi-?0"AmkBTxOkALU'Q mڪR< m_gL,KwwCf1"]du&I7kf6ܽd>HLJ?/i?)Xӟ{x.ߝ__}ܸ~vj4}).[Aygu[{|7qtF_;-Jv2hdc/C[o6{z}s{w}yYW[G< 0 Qǃwl?}ͣ@:^hڻw'3R{`U[b<7l=~b{_w mkBTn`xKkQ|^w"" .5ؕ׊(ЊK=&C@,&L"bF:;=xo_׵po~l}9F~tϭ F4?g6/'GW&?j?NWWX'z{,^<ϝVڟ7e+훺TGϵ ~hb?yu޹ٓ^IHJڷMYEA[~f N? ,GjNb5?$Ø]E ]&_oY?({ /iuZ}}[S~[ͫ΅sjw}@gf] C{s?ݗu&s }[k򝐎mn?h(aoS?{\rڽW?K3,C1gѽ[|6Zkoc}dw_6{o4U7R^mkBT9xMkADD"=j'G(PmXڎ3LBfwwl'w׻ɏ/!]'}{1Ϛi`jWV}龱:û7K }SxKVXھZΥx à}[i?zu  `-PmkBT`xMkA|]=jūHNbŶҋ/[DDċLY& 9) a6~& 1!{PGb WUڇrY8xp/ #uE8>\yME;t!6c9 lK*ߕq?̞]rο GvguBj ~~5-E8??>"w~ŦfY}k_l}vQϗ1 o^g[3Pڇ LgBLE>oS,||5}j*ûffa8;?̳0W7= ~?3Pۛ~8_&wﶞ/"R mkBTpxkAD Dzb U?s<;}5O$C~ ~x!S4,_Խ.Ժ|^cu LG^[{`]iBTmkBTpx흍) q ĉ8D^>׻gI@XjjgiЃ`0 `0 ?ϟ|:seQ3|ӧO|:2|.};7eGFO6_Qv]T]^ˮg{>pjzkuo{yye?{-x/ D:3D&򈼹e^Hyi#/OGzϪ߯_~ :sMe#M3Y#=2 QЙ[\s=E8}E>GȩT ڲTg-}VfoSVwzV}./>~!?U1<#}=F[ ~QڋBN..+푹^edLo+[\-k dW(}6q$#?z6Bөi?L7!3O_Q}Пuo[=tkȋM!'}/Ƈdr2_Cﲨ: `0 :8o=+8-4}۞cĥXdq{bUq©ήm!ƶg*ΪU\z[GA=^+ru{LV U?)V>ғ)x|Yҁgi\yi^cUo*= !TY?rfgWsʽVn*VX#=Fϫ+[F~yH\L~[O҇h5ݵTow|Sfӟ+);F;:x )/OS yUo2e)Ve3'wgGg=J^`0  ľu kU,Ksؑ5nY,bXw{ w&3QהNQev ]ƷgcH˞i{A3I8hwduwUIWq8I>+@pQşGcZ\ƪUߝ]/:3d;ɫ:gB9R|GW~w2;fzt|+i5nΟgZY|<1NyŬ|E7k?z/k><=Α}N΅>uWydʬdz `0 *\?W8GY:Dgcg< 2+'W6qn؟{ru"wU쏘~c#T?+y{Q,,^qF/Xv8.֩g3}ȸOP ~n%hUG4(_sn|W}Tg&x^c,Fѭ+ <#+}/Uw8BRh_|33!mr\7U9m({ѝpvew[xG]߱?g;,nҽow8]וb?OV=Z_#ve?vN_WrYLo;1g9pV^G~>[_vNOS3 `0Q[ veO\k^8֔v<Zbz\Opbn$~}oz3ј mK vU]^iNWA#x딫jt q :E= z%օq)CcYEqyRG-+u (K\hP'*^ء^q=m=y|Kvūe\rȊ4={W1;=ݷxp;o@>ȘT\Ԏ+C=*ɫ|GJOCW]x1.ﵠ9_Eб Vq)v(ʑ}[GwǺ{-oSdו_˞׃2;iT&w*w:g׭SOsj%Z[~_˯d֮+w]7 `0]kIu+eL]ւoA^;=GR?v쯱;<y o$N1紈=:ߥPVu< <&3KyC/4r)i=*/|Ύ^]QNН1qGw>ù{ ?Kv:A}E:_n+{u=rq͓̳]>>d}+|L01`0 leg:׺񶊝`W,3O?]\9P~[kOWiGc~)-<w.3q}'vuw$Vnv(r52S;Wk_Kϔ8B/hEՠ'9w?K;x:x<|@cϽVyc@ۖSw8Bq]=2lBe6V}eR( VeZT4ade2ޒ+nYBTqSߔ<[&=f[|szP)G}{Zׅ3n7jpWwftEw[ǽ;`l? `0 `0 `{~i`oLy>uoi\qK|}7Svu9G쯿c¾#>,jow{ՆݲL=mW2u_8دjo?kD߱mw>#}E:OۡO;y`$j79 mkBTnx흍8 FSHI!)$FRHnw HYx3ꇤsaaaaxIǏ'U{o_ھgW9 o'GW {>~Jlo߾)*/N\ϱov[iZ_ձaJΝ/:6O- 92b?Tlk%?_21B sY5>:>c=1Ow y^- ڶ,XzusM#גU]>H_yYv!ۉ_mi Rus]Xm_g)YY)m]y,m z1aaaxEߓGקo/Y\k6xjgH|yu.\aæM&wk#ϐ$?]Mo\Ⱦ,/ڥQ@~6s?)}, l gX #vQg Bٙ^uのuhm?}{].~}v_J;xogJY]޳@.)oqC?}>@Xߘ'-(W? źvƔOʙRv[K?[A}?-wmՑ}g\=c}M ggg DŽ-B^k_g?F? v0||؎=ǧHPgs/hؑI t~{n^}ZyD5XWvO)"c0vY Z|~_%/,p\ɹyΰZ/;/xs_9?Pܯ5ݻ\[y|č8gʱL{? 0 0 _k3>z_\S |<)b|7aaaxn.ta?l^Cvkؽ#~e)3<3^kdlc&jK+o"e<.ʞ`^(3zu l+6v<ï k7]/lc[`On}򚄫 G뎱zt^v2)?;Wmr5ocIz?Ozx{&!ez."ѯ 1Gg{+ҏlw<=}GݽFƨ^)zIpG K֜{{e G12ۭqiumf>.}~a? 0 0 [u+7Svq֭y΅ ?ނ}XwŶv?ߩDZۓ-q/?߳=<~#>Fk"qzrQo 9r,nY[;o:)@-`ק-7({߯S@µK9֠ɸ>:n3 _[_*mtcmC>qSL=<6;ǫsaaa{xˌ\ފpx?0׋#5zяc]x^l򼠕(f:~٣^lin59W~\;?vn6erUbS~v^U O7O(|;+SG4|?f*?rW~2oNٟS9~daևmH6mX[J~s.ym4ٶO|Bd/b5ɿyU? 0 0 0 0 0 0 0.P~*1@G\⟿KrKXs2(ߥ纎J8'>X@▼QQbqwx b)_K|v 1M6kee-2Ǜ59?K^E~9ϱQﱮYF8N?~;:=J<-tĒyNAgC \NXKs)'^Kg\~2}6}Գ)n]Or^j~"{p29w6/.z-v:+M{WJYZ굢`% Ҥl9ힶկ#OUz+U?;sd~vND7*.Y+v:ye;8}~|+ÑޅN9}{Bƞ#txխsXɿkSV/uJ=o G<ջL'L:D]6jfgLz/+ؽ[{rCMYq~[{yy czA;w9zszWHVax3 )ufmkBTXxڍm0aaAXAtNuө~"B~v(I$Ic i#Gl6p8޾s[ouv?Ru߯+fԍ^|}m43ϭu!Z9RUY׽B,z"|~>/|RתY̞EGߔ뙷L?:fV\꺯Pv#R>cNb=^Fz=yNI}.3?3̥*Ǫ7٧ڞƵ2~zWİg#g&2yK;wʞ2vm"Ggʼd~g<[şXlk=^k͞Gy\ׇ3M^&}V3=3ڣ<_(녾v9> G@Sǿ99Gy*"QYu*lz;{-/9v=Q_s>c),k:gQ%ԝ,SFwA2vWcWqlׯ[},g7F}.2˘ڳ6Zl,/:VݽYO932B>=ܯL|=x&6 ۼ\̹\̝ -s9מLgiƸl0<;G%ͭT?W#z>O 1f࿃(vf֛P4įwv[M88<5(˘=e҄Y$H],M\66(:*.`pm6^IENDB`contextfree-3.0.5+dfsg1.orig/src-win/icons/doc-design32.png0000644000175000017500000007162612076364074022041 0ustar brambramPNG  IHDR szzsBIT|d pHYs  ~tEXtCreation Time4/25/05TQ tEXtSoftwareMacromedia Fireworks MX*$5prVWx햻u0 AW׎ԋ;LxJ.w.>1fcgR_ZB]d{moaݽ!;=Cr %xzWf~ eC+Wf͕>lBhϐ:W;N>˜9f{+߇'.Mwnr;ҡ٣thv:}0:M]tE^6,qJ!M: Ms颀fo[@ѶgܺR/!VuCaٺ6+ ➃`M EB%,V#"m2q)=W\ 82 MkE @ІORf Y/"S}l `cu8%M`>s|6"*?(%E40jYuT u>Y4!chHdwL2|jW2kZL\m,'LIV&owC(55x1w(AX+ uL],Sڊ"%~x).4`|VaiiX@p3A}ߒ7C`s!kD*@{I6i0fAԿ8}ǥOx>pa! INqb?t̏ Hq+p>iPasPRҨθ+3`lƐ)6U09P#^^3 "Y Uݓ ZķɎs+WlZ-yy =sQ%TFA`Gʻði0lȅ`^a@ :AGr|t \MweN!)ɵzګq3SD)vdӡ/GUr^DY"cb/q.ol4@LJ*D:dF+:قQ^ pD:3|ԁ( rY tf#C!j)DE~(М| 3Z5Ћ '!>}-a]4FD̄VLRi=ǀ\E`B c. ORB٠M¨W"n:m KZd$gPJ M2LhL (A6>`pH!cWr tI/k?lM- ) Qd(h^܏nŸ|ăX"n%{#!T113c! \Cp9B0I_9b/KybW;p| B ^dHPMe$'c\e Klѥ\ly/)3k3h(0oiCB(jD+ a.:{mɮrP!KFzXSZQ6"^_kh*8ɝYƠ0E;!\rb›LVJ#-Bg'#13cHģdUE58q3U-fJj`|䷀ _tGҵy+-2Htl#1lt?qw\]屌c?!0aiZ!|A[HpVgDBJs\!/l:3eu"FgWNty=/~"  }=Gwy;L)egЦ[m}NmS޸3%M>|otA=>갍Z*,#IwqaKLS_b~Dr7% D  iGi5Y5Y&7K,cMr@(4,eRc55J"b4(5eڔQAOS@;N3MYV#.x п~r}ffZDh~,G)WkzL4Sx^?JZ39U3iǼvDeQ1oGwֈ4ވMfe`yī5Фj2  w|D~`ZcMZrL \_fU3IS˾|Ѵ՚̋Q83e ?3+~Z48fľoCzŲKJ/r% Ђӗ4a&C i:֣uSkV(`m=d]?@_KVbQS 1g&7uAC)cIKEmy bT8 SƨO50ulyX#|_BlDWb4ꦭ :xLx}RAft<&r=UX١I47KkmrQ]5&E\78MɵVۣDҔ"(g]U4֊[$K_qflןvL_ t`zG =(3qGc>eiNf;qlQHCP7hXIWY P eUxUCiK\A`;>l[?4M}{й|v7!#_R#@n3g:iΨ_YS!mE_2uAwrQƩ~V<[s d;%,Ǒ?e[,_+(,կΒ>U\'IQhqOm4o* 1~O$(="O{C#q, Gd?'cXx>YK~)Oڌ!!>#ÿ5.yt$dBœ:6ŜhNW3AIF@>Ҹ5sFe#[62m dU7 iͰ,`ޱL8wC2{nx8dexM,vO21pe> -зc7Z홲Kf}"- +ߌOm?oy[)Ye=T[Gyds]mt=JblugL[2.%oD+xdB"ֽL䭢UTJTQJ|L;f-E݆?b zvFhoF8z10[p;/zZeFb+KWfkq86 M7,ʴs6ҵS޷6yJ[ #ʆO\_lxwV?Rtd R?Q%l-OZIg;:E$Y>jr@GkvkFz)[o&";4!GNл/v?'ڭGJ_nXu9%>T<|Mbኅz,fثc 4oVoϲþl,;R5ɜV|LNl#S;I ڇㅺ s[=Cz.K}sQ>f~&;}w: IoM6Δ__賯gDLhN](dfp{ /6#{I6oSy3OM1C:io㷝 9 zD=HoY3N|˃}j {I4vP;x?v mt ==0nj0-:*&H;{rz;E *ꭨv9:CҼp-t(zK{oseH"s/}@mM%`߅NnK\C;pQkTÆ;vzt;pY&ho .ŞK~ 7;jbf)6<ך+5̆z99z"S|x@$(9d d QL#ة◄98f^"ż߅zvh#;mIVG3981PK* i eڲ2=(mp_G~,=^# _{j>~| ?"T>ZDiܒࣕ{2fO c>ϺIB'Mki7nlLj'4Y,W͐,T6U0=5۰lк29鷨NPxj=qAWԪ5'Z?nZ{]s[>f C49^3`3R3c(Z8Ž(s튯jPt2,jVZ~!PPVJyB!:u/nXbU"JLj56z/r #sx!W/$0X8ġ5ku-C͌B5="PְLM--"vќf vB ؂Ѝe.\X5ۅM&-Y>\yنytc u/$р_ ݈vvvͅUJ@4ZaE6HxV:F6Q>KSy.&{<}Ad:KN?2 n37,OMEN#HF`?- j!j {r+%Aqh $S@%%|9`ƅ}6.?jU 7KBC_{-׮8`Se[ lhF-*,?nt WTe\ÚMOsf^|ŝ}Em ;GFn^Kb[dAݜҥy_g:=h5=#*|3z¡F#$̣[^Y EO)ـ~Iȑ8  Ľ&C}24 L >bXXFkhFWI. -h-yU`F m<}hRvTf}|dT@OP\I' 0%U-b2֓yxd^ƣcAēwP)Xͣ KZQX!+}~CX@- >9Fwx+$@>,#Xٵ1vQ5%tᑄJ#5̖3S=R e[OjRgfM߉ZpE9%辴tc⏥R1. p8Ywh;w@^tug.XHT^?2!+tU#_:{*!nygn:@ Zgpwp٧P栢=ԇ|Utl7~䙔@0 +h%\'̊!Lu`tp/߹÷0!:lH- gA ^Z1KO_<*•G}|;n'e}*#(4hB9Th玡NŶ@%fĠpo9,vrdԬ,qcD-7= 7V >v`f1B+?`ؕ?ջ+yKV"o6TpŚUk}"bɍ7!H*3(Tu|jGyŪEe18-BYYdf[L>='4"}\x乢2EOcvxV|MڡBs%ȧԜ?U$g{075պ[=h`Iu7ޡ1t(f\%}R@uPA(@0Mz>n /:{7l6u]~m'3u/OOX-?Jk3pMNVnuS>q$t>NSgِ,yfzkf6{4!ڵ Y̳X?%ţG|j}~H)'FCy6)$.[xgߍJ<MC+QgPX 7~PT֜~5=4WaH]0/qJ!Ѧ?q?+kpB7ޠ">G}W=\&fH0e kƲ]N0Gg45*O xFD ~Pv_u9%|?vǾal*.p,S?5jPt~ۢ4$FMm3\9\fVdٿIuKk+s]h?:iĺ-^pYljkeA ֣;$3~:LH Ip#W,%ebbad{O`eE}9!mB ,ƈyAUkb]Nø ˌD_ˁj5j%u^׸ `O g9cE @=BHMlk@$ ءۖ#iBOOA\zXCR%ˆ6 _loNVL?7\iB#~_l5zq#wRf|{jSKlcԁt*=LfLQJ_Ke[LE(EU0"R4hbR |;i@fT,}X?GBP7A#Hk2dwըU¢ {3eKxŨ!tϼѝ;ZهMK+2S:¾m:ʋT,شt|H>(;:HfT+_oG=3fLál,0K@I rHmD-Kɵ""7@8bRz=Dmc CF_ŀT-DM2_=Wl@F䴦"%b||+h Un+z`Dv~_ClO$>Y Bcyg |rp]o:8khۘM埁/W^ֆE^ls wfY~(cUSM6:-=j0y-AgЀNN2g$>+y| GA]cپ6m n5v{y4y:l<5y7/CBqP!L||R۝I׷Iw|X\Zꑽܳuu}1c%(Hh!!&>{Ny! BC~{ Uz-b i>hTN./hY}_sPp͠ '.D1bԿoK'mCn0H]_ _&kdx3{G!~KdlfPej9dm5Zq[nJ;#:u|CC-y Oo!N獼7;tYW[kcd [@P {q7wΎd'>{*QVؿMAN: Zl]ѓ䯹c[}: pz$1 U(rtH):=)_]2{xlu:0'Y0v~p %Nj #o^'X՜T¯-d'dT{voƧ߇&9ގlOz|lxq!leP>ޓ 4lBޞ}yơ$9Eg/>_Y\j*SCş9Pdo/g_J7wG`fע4>*04yWĉ &oD93mϻL}5Čގv$OEA0h61s_ qhL`Iw^%M2g 0=f_v fM7R;IEJQ04Ys N[4HWR99s_;o@O7 @s21FQyhm`:o_ π7:zAE^,έx!{>!7r#{77;"{&/0WßﳠA[yυmk}ݲC,NZ M9@`CtD"<p& ^K_J}GR}/ +-khO.ЙZ"W 83;&_ EKًH|!GCVyhKj-үP~Z̚lpyN7;aACNh }p*}FZM8oMGeh ŕW&;0ܕ +$Dz sD %0x/{gݷB#cpD˵#e"K/) !Y#̓Dlg4b>EM3T (9&p~-'GɑlY[?E.`ހM Evn4s<{nҟ4z3ƿM(p4x։m |&x%Z@({~N1qy8FPjDo6SXyhr :JgǾfN&b7Ԋ{dK<ڜw#sںN}xU~Mf_ 244yYhtvш̪>Qc8{Y oߛ|u߄6W(-ߺȍ# n֚MPj] Mp# y}XK sSU>q݁(yug5s3q !{;ߓ"4dG _4>7IH4(.#B ؜cz (#}%şnMC- }|[ϸ%6Pe>4RQoZ ]r;^@UofJ_nnaL3RlP?yרfchRr$R΄"rKG,-cJ铞\ੂJq{} y+wܥMYaq$xH{h2؂H!XG-Cz+Ng÷M#Y#dnrjE!ٯ.Th";vv ׏I42'ZJFBѳ$.2n;ӹtw=xt劉f>W:m+zl<Q CsBL@G1RB9zBG/u9߱\!p"Mj} ӆr)nST&t`&YfpKOm5oI~6;6h'!aG^drE% v <R1%/LPskK\wIΌ\ӀxI7Jb(i(H<'ߟ-Ԥ)ycNŚ:V J>̛jATg /d^YOCrG:ic;CʀW4' hJ7_sQL3!Mۯ6Ky{⼲q 7x˼`[(sk349bx7|q T zըH?-m䙄3ΐ{K@lg)ݺ@ RtiMd\zK.(\rZȞqp~M`d6 /wOd`.HyEϼ zd&<ʉdd9}hR^օ=W"3D_=,!l,ŏq?E?BІ^^c] J*סIq+\bjō 0}6?t6Gл̂:?s%V/Df= ~4_ M=? uA? L`R.[ B:RZ^A)D(ϼRSJu!lꟆ&/Λ cM}[cXaDe(_Lz"oHqcTxwt]8a S!BɄL}XJ" Y[8—>;r xDv؅7Q/b .=_U$?&Y ]X>e F€"UE,hi#z@7Hzc/x27m0"f\0Ѓ>#au Mb5s$Tvb18#{c4+Ώѭ _'2Eeoߟe-2$i%  MrNMAN.9$Dayj~\l;]?B~^Ng~5/Bmu%hk^BiJʵ+w @F!M*yg_8,|:ֆmWàc 3FGu~2'uF=!"ct8/ZԸruڐGtXCg5ZbKZbb[^V ٤)E=+!KΔ\C50!xV~&,~"1>ύ^/kdCmBb4 rQ"x D!W'ܻ}QΏy"Bx|31H.Ͷ2!qb̬?M!?q9><-lW]M}m5NgO4Z{m݅o #CÇM] 2h2_AG@nn*I J<&ߟ Jk`:1Ϩ#{D+B2y\i1^_E1lAbBAnE FX0>>H1'H$K[~ l5n}*jV9/@>RL.$?m>EN$D'~.%8yFc`}{C;+@03Ft̋g; $O)O:f |"""yAБlDk#/{φ7$Ő; Žz ,^rp"~}5C|pKAyɼ"7zq%{SJ{.̥܅ؔNICC!nVzСÒ+e1f(G -/3h)I=қUbPxF?M;YͶTj^zWyr>&5zRnqO÷ My}vP/vFZ4Z#GqES:/]`<{f#y3lfT9FG Oy6uB%|@uf~3˙@}XSwx$"Q}S!T AHP!.Eev_\κ7+miy4qv0‰jdž?+o^+-Y>VH?uhR?wX[ЦKZ$'͡WF E c[`P[Џ q\_]R +zZQ>3jQÉ(cF̬BYB-yFvrQYc? PCt8|];_ svXV +P٭o)1[H>fo]HL@c9w ttW#0*-ZDx}n;,^y{Rn] *j^D;b0 7 63&7*}QxoɶR^dte3a(ԍʛ?ߚW♰\#zz>% T,ȦRkYp\V$PUઐuAXcg{ .uU69WDԶ,|=?_xb}N@;|P%})A?zR!@@P?t@Jy1P{mS̔eYZ^w^1*| ֊9L'd !P'hKh70b:lf'bYykxDm1mx*|u'8B@(čbJJc~0y7ŏz #9{khA׿Y&Y7NU6S@cFLRz}n@*&d^O?bF4k@~O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?YMw\mkBTxOQi+Q*TAQQD#2"0q֝9N*-LW}ke=-IUSP|f_|:} s.s[rVc[%^f]\̻[Q⼝ޤ~Vt%ύeNs>w{nX(s7sh3_OxXS濜cf3Jgg=Q_+Y۷r.uX|x7?הLi嵞GosG8?λUju;/X?WŃ F=1M#׉6cuస`ky'&}k|VG?p/~k^Z2F!yg?g,g8{vi|xֻ}`x'ԟ>_H_2j OjgYglj/eNϚQڻCNmNt(j֘}!![<;0@nΦĆmkBT2xiOQ)&*b]b.=1s8b+1g'v y=)`0Ƙ<~\6Ù#r.|뫡̜rBZd?3//Y佟ߨ?.g-v]\Ya/ Wa1͹p6ӧ=;9|1l仝-_OӥRaR~f?e :Z(~Y/N2:{ 5t LN^f~#<{RZ;$S}{3̽}@Qjؐ*9sޏ dYi Le?uh.^{ށ Ә;f6^,˵r^:zV\OFJxߢ/]OqS/R*o:Oޅy5~6j 7noma$mkBTQx흍) q ĉ8D^>׻gI@XjjgiЃ`0 `0 ?ϟ|:seQ3|ӧO|:2|.};7eGFO6_Qv]T]^ˮg{>pjzkuo{yye?{-x/ D:3D&򈼹e^Hyi#/OGzϪ߯_~ :sMe#M3Y#=2 QЙ[\s=E8}E>GȩT ڲTg-}VfoSVwzV}./>~!?U1<#}=F[ ~QڋBN..+푹^edLo+[\-k dW(}6q$#?z6Bөi?L7!3O_Q}Пuo[=tkȋM!'}/Ƈdr2_Cﲨ: `0 :8o=+8-4}۞cĥXdq{bUq©ήm!ƶg*ΪU\z[GA=^+ru{LV U?)V>ғ)x|Yҁgi\yi^cUo*= !TY?rfgWsʽVn*VX#=Fϫ+[F~yH\L~[O҇h5ݵTow|Sfӟ+);F;:x )/OS yUo2e)Ve3'wgGg=J^`0  ľu kU,Ksؑ5nY,bXw{ w&3QהNQev ]ƷgcH˞i{A3I8hwduwUIWq8I>+@pQşGcZ\ƪUߝ]/:3d;ɫ:gB9R|GW~w2;fzt|+i5nΟgZY|<1NyŬ|E7k?z/k><=Α}N΅>uWydʬdz `0 *\?W8GY:Dgcg< 2+'W6qn؟{ru"wU쏘~c#T?+y{Q,,^qF/Xv8.֩g3}ȸOP ~n%hUG4(_sn|W}Tg&x^c,Fѭ+ <#+}/Uw8BRh_|33!mr\7U9m({ѝpvew[xG]߱?g;,nҽow8]וb?OV=Z_#ve?vN_WrYLo;1g9pV^G~>[_vNOS3 `0Q[ veO\k^8֔v<Zbz\Opbn$~}oz3ј mK vU]^iNWA#x딫jt q :E= z%օq)CcYEqyRG-+u (K\hP'*^ء^q=m=y|Kvūe\rȊ4={W1;=ݷxp;o@>ȘT\Ԏ+C=*ɫ|GJOCW]x1.ﵠ9_Eб Vq)v(ʑ}[GwǺ{-oSdו_˞׃2;iT&w*w:g׭SOsj%Z[~_˯d֮+w]7 `0]kIu+eL]ւoA^;=GR?v쯱;<y o$N1紈=:ߥPVu< <&3KyC/4r)i=*/|Ύ^]QNН1qGw>ù{ ?Kv:A}E:_n+{u=rq͓̳]>>d}+|L01`0 leg:׺񶊝`W,3O?]\9P~[kOWiGc~)-<w.3q}'vuw$Vnv(r52S;Wk_Kϔ8B/hEՠ'9w?K;x:x<|@cϽVyc@ۖSw8Bq]=2lBe6V}eR( VeZT4ade2ޒ+nYBTqSߔ<[&=f[|szP)G}{Zׅ3n7jpWwftEw[ǽ;`l? `0 `0 `{~i`oLy>uoi\qK|}7Svu9G쯿c¾#>,jow{ՆݲL=mW2u_8دjo?kD߱mw>#}E:OۡO;y`$j3K mkBTx흍8 FSHI!)$FRHnw HYx3ꇤsaaaaxIǏ'U{o_ھgW9 o'GW {>~Jlo߾)*/N\ϱov[iZ_ձaJΝ/:6O- 92b?Tlk%?_21B sY5>:>c=1Ow y^- ڶ,XzusM#גU]>H_yYv!ۉ_mi Rus]Xm_g)YY)m]y,m z1aaaxEߓGקo/Y\k6xjgH|yu.\aæM&wk#ϐ$?]Mo\Ⱦ,/ڥQ@~6s?)}, l gX #vQg Bٙ^uのuhm?}{].~}v_J;xogJY]޳@.)oqC?}>@Xߘ'-(W? źvƔOʙRv[K?[A}?-wmՑ}g\=c}M ggg DŽ-B^k_g?F? v0||؎=ǧHPgs/hؑI t~{n^}ZyD5XWvO)"c0vY Z|~_%/,p\ɹyΰZ/;/xs_9?Pܯ5ݻ\[y|č8gʱL{? 0 0 _k3>z_\S |<)b|7aaaxn.ta?l^Cvkؽ#~e)3<3^kdlc&jK+o"e<.ʞ`^(3zu l+6v<ï k7]/lc[`On}򚄫 G뎱zt^v2)?;Wmr5ocIz?Ozx{&!ez."ѯ 1Gg{+ҏlw<=}GݽFƨ^)zIpG K֜{{e G12ۭqiumf>.}~a? 0 0 [u+7Svq֭y΅ ?ނ}XwŶv?ߩDZۓ-q/?߳=<~#>Fk"qzrQo 9r,nY[;o:)@-`ק-7({߯S@µK9֠ɸ>:n3 _[_*mtcmC>qSL=<6;ǫsaaa{xˌ\ފpx?0׋#5zяc]x^l򼠕(f:~٣^lin59W~\;?vn6erUbS~v^U O7O(|;+SG4|?f*?rW~2oNٟS9~daևmH6mX[J~s.ym4ٶO|Bd/b5ɿyU? 0 0 0 0 0 0 0.P~*1@G\⟿KrKXs2(ߥ纎J8'>X@▼QQbqwx b)_K|v 1M6kee-2Ǜ59?K^E~9ϱQﱮYF8N?~;:=J<-tĒyNAgC \NXKs)'^Kg\~2}6}Գ)n]Or^j~"{p29w6/.z-v:+M{WJYZ굢`% Ҥl9ힶկ#OUz+U?;sd~vND7*.Y+v:ye;8}~|+ÑޅN9}{Bƞ#txխsXɿkSV/uJ=o G<ջL'L:D]6jfgLz/+ؽ[{rCMYq~[{yy czA;w9zszWHVax3 WfmkBT xڍm0aaAXAtNuө~"B~v(I$Ic i#Gl6p8޾s[ouv?Ru߯+fԍ^|}m43ϭu!Z9RUY׽B,z"|~>/|RתY̞EGߔ뙷L?:fV\꺯Pv#R>cNb=^Fz=yNI}.3?3̥*Ǫ7٧ڞƵ2~zWİg#g&2yK;wʞ2vm"Ggʼd~g<[şXlk=^k͞Gy\ׇ3M^&}V3=3ڣ<_(녾v9> G@Sǿ99Gy*"QYu*lz;{-/9v=Q_s>c),k:gQ%ԝ,SFwA2vWcWqlׯ[},g7F}.2˘ڳi_:D@k4RW._,666ą H)QJnaYe!;;;\t$RpOGJ0  dY\Ŷm,,,,P(Ǐ={,TD(bV֚J)F˲T*,..lz6NΎ H)1 d2z^i0 1 B`&eQ, ðs޽_{S0 AZjt:A֚v"233C .b ||75q  Czqc,J Cަnsm}<ϣV8NaމŸ@>X,t888@JIfyyF>wEkͧO}4]k! qJ,rfh4u].f\.G^Gk L`DRqibF*J0u_fii7n{L=D&*SN8Z-0}zkkk8jTƄ #2Й@tE&߿VuB(u,KQLU@k"rB>~HPڵk'r\x zDxR0m)%{{{j5bhU*rf3:„ZTe!m|ٸׯ_Ç@+aY?9^ _Fp2 =0pd8Yɻ>I,9L IILN?_BNBP:y@KkO%ڿگʏIENDB`contextfree-3.0.5+dfsg1.orig/src-win/icons/doc-design48.png0000644000175000017500000007626312076364074022052 0ustar brambramPNG  IHDR00WsBIT|d pHYs  ~tEXtCreation Time4/25/05TQ tEXtSoftwareMacromedia Fireworks MX*$ prVWxm0 EIj|g, J"m_$ č[/I'=qx& JӿE HOW4p$%_ ԾjSK2Q/)Ҟdغ~$ E>7ս/|Tv5WSd}OXG?-#?s Ċ" py^ ?o c62}G72lO<_Uyu2ϻidc]l-@#zy_Ϯl+c`{~Z'~lJBFV\,NX *a!^R"3Zm<ú9Ȣ.:,Hbw+,3m>x.EV`e _,ג~9ݳ}mQm_1yڀ=ƿx'm)~ # Jzwp  [=6)BHmkBF)3mkTSx][sƒ$q$d+/:Uw')ŔCPoy,^IVeow .C\ -`랯{hyj7gsml'ݦ?W/^˟bwo@͠с|YݫyۃZ)S fb`J6 J4g()~pMnPlnLElÕ`C'ym*vis4x;mI}kiszܵ+>kmB[ʖ G/ϰw ۡr%@&ZAqr3b[C&nqM&4&0&ZDnC&z{5b7p@^gb=uQy e48AR 4i0 =n0i <41pG]DԠ1SG]8~NԅҳѓbEED}$jF'86ɥ_1o\`[诡[7WnV+PkjW`eqAs?oqCHnDM&.GTxRƠa@H@5|b2= q\>ʢ~R/!j/M7و{|ь fR04?+znptMJ#=x3f8LoY~@_'ʈ3<+&i1qw'Lq֘@띨$"5JM / UBJG42M@sonW[. DY%Ϙ `՘ KKK0-yc0 l'tH| ^ljKWWgLC11d 1YQe~@7 x_xtya 8Bn3I9N81)vv=mH*24wK܃xLZTb(L4Sc2J X>2ddF`8,t(X/?( ,' ķɏs+WlZ-Ey |ip%ThFAʻðq6BDQɰaf:AFM9t &ʻ2C גFQ3H;ߊٴ)cc""z|o2iִȜ8t،8=Fb⿷<|K<1ALJ&ݥ1*:f .@@t#q_ψuCBW,z8(s%y#xLnd @tD%*\Ä[cQl{a&z6$"SĵdlKEcdIԸ\Z A4HSx ӳLan܃))_&F6hc0jUfCqR:EQ ~#^{~{1pp4&p$08!c>7>r tI/8k lm8nSKqrBB$c踷$c'X}E+DE\1Ig垱Je+A_.2~<g4TFAGGZI$ǁa%)kR)k2M ]f&7|uAC%#zN 2Qt',a=^jZaȖYUU5G|_AlD WbIq릭Ih⌭xc}ىLh mt%"~)F4{u@vb2b?3F;i .t"An' uu J Gk`i#6Gi)#ض!)~A@pz{u >IbhhևqzA #V9Byz|3-zFڐ k=oHo@oN)1șnౕA-MŞt8y>uGdW#C%,wT[#)GjK5=z`jBR$Ռ\nMF\-)dz%Fh.ixdyL<sb犝8wCVU ]1tVU}?8ZyWqve/g]wCW 2t B3xo"cmul=~s>hϹζbRt:z.{o. sl!2Gu''i+f+emO^勳5[ܜ9m OlmOE~ s7 bcQyNDe9V&*MG!CGоC/mc͊+,C?TdrӘH.N#SnZYY05sPa3qOs>EiN%f;ylQH۱C0nVG֗x(_ 櫬Ujmqɶ^m݋%˷Ի >ŒٍrKqCzFB˚d7}I9nPC52Jux.^o ĸb˂Wz9U6qxOS,ZťORW(oESi5$+>MDX<HFd?;ǰzI{F՞$b58;0_XXgSˀ'_7Ą[$KW=f<S~#:F'gr{J~F[]=SvI_`٬Od%xd囱I`"--}˜u"5jyojҹv\}]ҼX'_q*NzqI#=Ѓ̄u2IVY*+Qe%g%&'Ҧ-E݆?bzvFhocؚz1a(>v9_heQI>þ&pn^?,]upOa~_o |!3c"f). \;O}^^CUm$:p^@>nFEL,qﴐ/}J:za&t@qmǾ?wi}YChyMI?p] &l7UӲCQWcy&q tק3ZKJ5Q2_~KZ#ey=w\r+aQ2kr~3/*3|Sv=Fb+KWͥdkq(6͹ M7[|]bwetAA]n&tneyNȈקp7<-]Gʎ̸_@E ]8eA+MMѩE.,;왥cV=z^3r)Rj"/&{R+K_~&zZIdꫧħb)O$sx.ak\>lw W,ca0 ųz1^{@Ëjhvgs,Ϣ !e^Nfz`ub}(Xu81N6lm-:gehw.<2!`S"p E0+`vj>h:~@۝fH&&u,%oGjB&D NWs&7f__NfsG]{HC:k7g; M^곇7Xi[tO'ABNZm}BA)5r?}DVp9T`߼ï^gmTi6c-h>|ݥ(?@p [nHo<`ox >+T  d=fki>ռ7؅_V{;KDY^8 bhF=ץ3e'}@mO%nz6`σQt pj6qݩYᷗtn/zH65k\y^k"Qz?ʣ?ri֠+h񪉣 "ER[n9uMUl鼪^Sk5B2X+Z Sv;n]K 11 %{ȏ; WH5Ԅ@ FV$@3( &9qZ,Feo]=l3sl:κm-AsPO1?Qc]h%MGjSKju-u^Vö u)FBcħrX-S87\*9+-s Q*GpcY8A$cx.Z %vuLrH t ":#%aWϣ:ZEY=aqܷkxMSs–AlFjޕ!0z"0mGDeܺjS*:ӌ"3 bnݶykߘ܊:)ٚjf~+zPV F~+Ԋef]K `=SjũcZV\[, ;j-R q討YVr+\nͰݺS@ӎԊ4rZ6;Q/u'5ôt\{${1nE_06sq${@+Qwl Cu!`IS=5 4fMKy3ZTa`&n2.pf\CӬ\6L9m WfOJ^YgIhl&f$.[WKt{/jHjA\i;, */ߢRj %ʯz=黔)šGSCo0XGmkBSx]N0 QWV `o4I\fggg3 fѣFNBh|Z<ۃ8)AafsV XϞlbwfm !("eP`{evjm_ΩpC?PS_g 95Ҿjdb`#"QO#`Cs6S4 \X[f*mkBTPx}+$+nʔiSL")HdJ,DbH$T3;;W֊z]@&-Y>\yنytc u/$р_ ݈vvvͅUJ@4ZaE6HxV:F6Q>KSy.&{<}Ad:KN?2 n37,OMEN#HF`?- j!j {r+%Aqh $S@%%|9`ƅ}6.?jU 7KBC_{-׮8`Se[ lhF-*,?nt WTe\ÚMOsf^|ŝ}Em ;GFn^Kb[dAݜҥy_g:=h5=#*|3z¡F#$̣[^Y EO)ـ~Iȑ8  Ľ&C}24 L >bXXFkhFWI. -h-yU`F m<}hRvTf}|dT@OP\I' 0%U-b2֓yxd^ƣcAēwP)Xͣ KZQX!+}~CX@- >9Fwx+$@>,#Xٵ1vQ5%tᑄJ#5̖3S=R e[OjRgfM߉ZpE9%辴tc⏥R1. p8Ywh;w@^tug.XHT^?2!+tU#_:{*!nygn:@ Zgpwp٧P栢=ԇ|Utl7~䙔@0 +h%\'̊!Lu`tp/߹÷0!:lH- gA ^Z1KO_<*•G}|;n'e}*#(4hB9Th玡NŶ@%fĠpo9,vrdԬ,qcD-7= 7V >v`f1B+?`ؕ?ջ+yKV"o6TpŚUk}"bɍ7!H*3(Tu|jGyŪEe18-BYYdf[L>='4"}\x乢2EOcvxV|MڡBs%ȧԜ?U$g{075պ[=h`Iu7ޡ1t(f\%}R@uPA(@0Mz>n /:{7l6u]~m'3u/OOX-?Jk3pMNVnuS>q$t>NSgِ,yfzkf6{4!ڵ Y̳X?%ţG|j}~H)'FCy6)$.[xgߍJ<MC+QgPX 7~PT֜~5=4WaH]0/qJ!Ѧ?q?+kpB7ޠ">G}W=\&fH0e kƲ]N0Gg45*O xFD ~Pv_u9%|?vǾal*.p,S?5jPt~ۢ4$FMm3\9\fVdٿIuKk+s]h?:iĺ-^pYljkeA ֣;$3~:LH Ip#W,%ebbad{O`eE}9!mB ,ƈyAUkb]Nø ˌD_ˁj5j%u^׸ `O g9cE @=BHMlk@$ ءۖ#iBOOA\zXCR%ˆ6 _loNVL?7\iB#~_l5zq#wRf|{jSKlcԁt*=LfLQJ_Ke[LE(EU0"R4hbR |;i@fT,}X?GBP7A#Hk2dwըU¢ {3eKxŨ!tϼѝ;ZهMK+2S:¾m:ʋT,شt|H>(;:HfT+_oG=3fLál,0K@I rHmD-Kɵ""7@8bRz=Dmc CF_ŀT-DM2_=Wl@F䴦"%b||+h Un+z`Dv~_ClO$>Y Bcyg |rp]o:8khۘM埁/W^ֆE^ls wfY~(cUSM6:-=j0y-AgЀNN2g$>+y| GA]cپ6m n5v{y4y:l<5y7/CBqP!L||R۝I׷Iw|X\Zꑽܳuu}1c%(Hh!!&>{Ny! BC~{ Uz-b i>hTN./hY}_sPp͠ '.D1bԿoK'mCn0H]_ _&kdx3{G!~KdlfPej9dm5Zq[nJ;#:u|CC-y Oo!N獼7;tYW[kcd [@P {q7wΎd'>{*QVؿMAN: Zl]ѓ䯹c[}: pz$1 U(rtH):=)_]2{xlu:0'Y0v~p %Nj #o^'X՜T¯-d'dT{voƧ߇&9ގlOz|lxq!leP>ޓ 4lBޞ}yơ$9Eg/>_Y\j*SCş9Pdo/g_J7wG`fע4>*04yWĉ &oD93mϻL}5Čގv$OEA0h61s_ qhL`Iw^%M2g 0=f_v fM7R;IEJQ04Ys N[4HWR99s_;o@O7 @s21FQyhm`:o_ π7:zAE^,έx!{>!7r#{77;"{&/0WßﳠA[yυmk}ݲC,NZ M9@`CtD"<p& ^K_J}GR}/ +-khO.ЙZ"W 83;&_ EKًH|!GCVyhKj-үP~Z̚lpyN7;aACNh }p*}FZM8oMGeh ŕW&;0ܕ +$Dz sD %0x/{gݷB#cpD˵#e"K/) !Y#̓Dlg4b>EM3T (9&p~-'GɑlY[?E.`ހM Evn4s<{nҟ4z3ƿM(p4x։m |&x%Z@({~N1qy8FPjDo6SXyhr :JgǾfN&b7Ԋ{dK<ڜw#sںN}xU~Mf_ 244yYhtvш̪>Qc8{Y oߛ|u߄6W(-ߺȍ# n֚MPj] Mp# y}XK sSU>q݁(yug5s3q !{;ߓ"4dG _4>7IH4(.#B ؜cz (#}%şnMC- }|[ϸ%6Pe>4RQoZ ]r;^@UofJ_nnaL3RlP?yרfchRr$R΄"rKG,-cJ铞\ੂJq{} y+wܥMYaq$xH{h2؂H!XG-Cz+Ng÷M#Y#dnrjE!ٯ.Th";vv ׏I42'ZJFBѳ$.2n;ӹtw=xt劉f>W:m+zl<Q CsBL@G1RB9zBG/u9߱\!p"Mj} ӆr)nST&t`&YfpKOm5oI~6;6h'!aG^drE% v <R1%/LPskK\wIΌ\ӀxI7Jb(i(H<'ߟ-Ԥ)ycNŚ:V J>̛jATg /d^YOCrG:ic;CʀW4' hJ7_sQL3!Mۯ6Ky{⼲q 7x˼`[(sk349bx7|q T zըH?-m䙄3ΐ{K@lg)ݺ@ RtiMd\zK.(\rZȞqp~M`d6 /wOd`.HyEϼ zd&<ʉdd9}hR^օ=W"3D_=,!l,ŏq?E?BІ^^c] J*סIq+\bjō 0}6?t6Gл̂:?s%V/Df= ~4_ M=? uA? L`R.[ B:RZ^A)D(ϼRSJu!lꟆ&/Λ cM}[cXaDe(_Lz"oHqcTxwt]8a S!BɄL}XJ" Y[8—>;r xDv؅7Q/b .=_U$?&Y ]X>e F€"UE,hi#z@7Hzc/x27m0"f\0Ѓ>#au Mb5s$Tvb18#{c4+Ώѭ _'2Eeoߟe-2$i%  MrNMAN.9$Dayj~\l;]?B~^Ng~5/Bmu%hk^BiJʵ+w @F!M*yg_8,|:ֆmWàc 3FGu~2'uF=!"ct8/ZԸruڐGtXCg5ZbKZbb[^V ٤)E=+!KΔ\C50!xV~&,~"1>ύ^/kdCmBb4 rQ"x D!W'ܻ}QΏy"Bx|31H.Ͷ2!qb̬?M!?q9><-lW]M}m5NgO4Z{m݅o #CÇM] 2h2_AG@nn*I J<&ߟ Jk`:1Ϩ#{D+B2y\i1^_E1lAbBAnE FX0>>H1'H$K[~ l5n}*jV9/@>RL.$?m>EN$D'~.%8yFc`}{C;+@03Ft̋g; $O)O:f |"""yAБlDk#/{φ7$Ő; Žz ,^rp"~}5C|pKAyɼ"7zq%{SJ{.̥܅ؔNICC!nVzСÒ+e1f(G -/3h)I=қUbPxF?M;YͶTj^zWyr>&5zRnqO÷ My}vP/vFZ4Z#GqES:/]`<{f#y3lfT9FG Oy6uB%|@uf~3˙@}XSwx$"Q}S!T AHP!.Eev_\κ7+miy4qv0‰jdž?+o^+-Y>VH?uhR?wX[ЦKZ$'͡WF E c[`P[Џ q\_]R +zZQ>3jQÉ(cF̬BYB-yFvrQYc? PCt8|];_ svXV +P٭o)1[H>fo]HL@c9w ttW#0*-ZDx}n;,^y{Rn] *j^D;b0 7 63&7*}QxoɶR^dte3a(ԍʛ?ߚW♰\#zz>% T,ȦRkYp\V$PUઐuAXcg{ .uU69WDԶ,|=?_xb}N@;|P%})A?zR!@@P?t@Jy1P{mS̔eYZ^w^1*| ֊9L'd !P'hKh70b:lf'bYykxDm1mx*|u'8B@(čbJJc~0y7ŏz #9{khA׿Y&Y7NU6S@cFLRz}n@*&d^O?bF4k@~O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?YMw\mkBT@xnUmvMBJH6MZh PmR$!! +xy-emeM&WɎ=39oM{{{fRJr~O[}_7\{Q엋>  j`jƕٰ:X {:v>N3&L<B B6r^r=t}cA}͸}+3a-\+}}ߛs5їӼp1 Ëvx)q_u,y'Jx:l ]bxʯ/yȿٷ^iz|_njNr=׆>#|a躚&&Jݧp5pm~;ᮯ4Zq햯I 'Pp^-i}:ǾNyΖYI>aIlǯ:m9#@>S5_gqZm]ye۹S?Mym ɾ6:Zu]'&;y }f&ޖ}!2}{lz? 2k̀1Sg>˦ X ۧS_{Py1I~wo==oZyu*'Ly?-}4ο wPϤM]֝Ymv~HKU?vjo]r \pSݻ8 2kVsNXpyOF-{d\#m=<'rMp4-{Ffrp'C.>4c &~??B~n=ך_ 0?~U1^?sws=b{|S%tεv&wY(m0sԛg/k |]mkBTPxiOSA)]h d)o5 @ ?>^ $.֞9gΝ əH<^ z1/aHvY1HNJ7¤N>9P[\2MQ㠒s#Ea)=k P53kXWhУx,%yݼ4fM?=ޣ Ab_TK{?N(TfZ~|~o$x> ˪4^i.(+ 11c.J7J =ePq=9^Sy5n8X5tưbWRX%E˪10_Q?PTo>ZM~^`V;<|]q\9֕מ?4^WP?` =o\T*W5h xevΙ'(}h1V}M|l1/<ںm/yA}E}~s#_G*iV{C}}{ fUjA׿Dhyj9P;ߺx5.D5=xOv\Vcc5:+eq 'L4L%΋wdjwK#L 4r;뛡f T^buEtF^$փf}z4VkKY:46}i?p2tVܟ!1[ׇ#i?RKɄq[],eF})^qO~k ľ/yn#^g}냿O|!%={_SkC_Fu|)!zXc ~/r1 \v-3g t7c1_h?i>[,FmkBTn)x흍) q ĉ8D^>׻gI@XjjgiЃ`0 `0 ?ϟ|:seQ3|ӧO|:2|.};7eGFO6_Qv]T]^ˮg{>pjzkuo{yye?{-x/ D:3D&򈼹e^Hyi#/OGzϪ߯_~ :sMe#M3Y#=2 QЙ[\s=E8}E>GȩT ڲTg-}VfoSVwzV}./>~!?U1<#}=F[ ~QڋBN..+푹^edLo+[\-k dW(}6q$#?z6Bөi?L7!3O_Q}Пuo[=tkȋM!'}/Ƈdr2_Cﲨ: `0 :8o=+8-4}۞cĥXdq{bUq©ήm!ƶg*ΪU\z[GA=^+ru{LV U?)V>ғ)x|Yҁgi\yi^cUo*= !TY?rfgWsʽVn*VX#=Fϫ+[F~yH\L~[O҇h5ݵTow|Sfӟ+);F;:x )/OS yUo2e)Ve3'wgGg=J^`0  ľu kU,Ksؑ5nY,bXw{ w&3QהNQev ]ƷgcH˞i{A3I8hwduwUIWq8I>+@pQşGcZ\ƪUߝ]/:3d;ɫ:gB9R|GW~w2;fzt|+i5nΟgZY|<1NyŬ|E7k?z/k><=Α}N΅>uWydʬdz `0 *\?W8GY:Dgcg< 2+'W6qn؟{ru"wU쏘~c#T?+y{Q,,^qF/Xv8.֩g3}ȸOP ~n%hUG4(_sn|W}Tg&x^c,Fѭ+ <#+}/Uw8BRh_|33!mr\7U9m({ѝpvew[xG]߱?g;,nҽow8]וb?OV=Z_#ve?vN_WrYLo;1g9pV^G~>[_vNOS3 `0Q[ veO\k^8֔v<Zbz\Opbn$~}oz3ј mK vU]^iNWA#x딫jt q :E= z%օq)CcYEqyRG-+u (K\hP'*^ء^q=m=y|Kvūe\rȊ4={W1;=ݷxp;o@>ȘT\Ԏ+C=*ɫ|GJOCW]x1.ﵠ9_Eб Vq)v(ʑ}[GwǺ{-oSdו_˞׃2;iT&w*w:g׭SOsj%Z[~_˯d֮+w]7 `0]kIu+eL]ւoA^;=GR?v쯱;<y o$N1紈=:ߥPVu< <&3KyC/4r)i=*/|Ύ^]QNН1qGw>ù{ ?Kv:A}E:_n+{u=rq͓̳]>>d}+|L01`0 leg:׺񶊝`W,3O?]\9P~[kOWiGc~)-<w.3q}'vuw$Vnv(r52S;Wk_Kϔ8B/hEՠ'9w?K;x:x<|@cϽVyc@ۖSw8Bq]=2lBe6V}eR( VeZT4ade2ޒ+nYBTqSߔ<[&=f[|szP)G}{Zׅ3n7jpWwftEw[ǽ;`l? `0 `0 `{~i`oLy>uoi\qK|}7Svu9G쯿c¾#>,jow{ՆݲL=mW2u_8دjo?kD߱mw>#}E:OۡO;y`$j2 mkBTx흍8 FSHI!)$FRHnw HYx3ꇤsaaaaxIǏ'U{o_ھgW9 o'GW {>~Jlo߾)*/N\ϱov[iZ_ձaJΝ/:6O- 92b?Tlk%?_21B sY5>:>c=1Ow y^- ڶ,XzusM#גU]>H_yYv!ۉ_mi Rus]Xm_g)YY)m]y,m z1aaaxEߓGקo/Y\k6xjgH|yu.\aæM&wk#ϐ$?]Mo\Ⱦ,/ڥQ@~6s?)}, l gX #vQg Bٙ^uのuhm?}{].~}v_J;xogJY]޳@.)oqC?}>@Xߘ'-(W? źvƔOʙRv[K?[A}?-wmՑ}g\=c}M ggg DŽ-B^k_g?F? v0||؎=ǧHPgs/hؑI t~{n^}ZyD5XWvO)"c0vY Z|~_%/,p\ɹyΰZ/;/xs_9?Pܯ5ݻ\[y|č8gʱL{? 0 0 _k3>z_\S |<)b|7aaaxn.ta?l^Cvkؽ#~e)3<3^kdlc&jK+o"e<.ʞ`^(3zu l+6v<ï k7]/lc[`On}򚄫 G뎱zt^v2)?;Wmr5ocIz?Ozx{&!ez."ѯ 1Gg{+ҏlw<=}GݽFƨ^)zIpG K֜{{e G12ۭqiumf>.}~a? 0 0 [u+7Svq֭y΅ ?ނ}XwŶv?ߩDZۓ-q/?߳=<~#>Fk"qzrQo 9r,nY[;o:)@-`ק-7({߯S@µK9֠ɸ>:n3 _[_*mtcmC>qSL=<6;ǫsaaa{xˌ\ފpx?0׋#5zяc]x^l򼠕(f:~٣^lin59W~\;?vn6erUbS~v^U O7O(|;+SG4|?f*?rW~2oNٟS9~daևmH6mX[J~s.ym4ٶO|Bd/b5ɿyU? 0 0 0 0 0 0 0.P~*1@G\⟿KrKXs2(ߥ纎J8'>X@▼QQbqwx b)_K|v 1M6kee-2Ǜ59?K^E~9ϱQﱮYF8N?~;:=J<-tĒyNAgC \NXKs)'^Kg\~2}6}Գ)n]Or^j~"{p29w6/.z-v:+M{WJYZ굢`% Ҥl9ힶկ#OUz+U?;sd~vND7*.Y+v:ye;8}~|+ÑޅN9}{Bƞ#txխsXɿkSV/uJ=o G<ջL'L:D]6jfgLz/+ؽ[{rCMYq~[{yy czA;w9zszWHVax3 -fmkBTmhxڍm0aaAXAtNuө~"B~v(I$Ic i#Gl6p8޾s[ouv?Ru߯+fԍ^|}m43ϭu!Z9RUY׽B,z"|~>/|RתY̞EGߔ뙷L?:fV\꺯Pv#R>cNb=^Fz=yNI}.3?3̥*Ǫ7٧ڞƵ2~zWİg#g&2yK;wʞ2vm"Ggʼd~g<[şXlk=^k͞Gy\ׇ3M^&}V3=3ڣ<_(녾v9> G@Sǿ99Gy*"QYu*lz;{-/9v=Q_s>c),k:gQ%ԝ,SFwA2vWcWqlׯ[},g7F}.2˘ڳgI$pVO^u]4Mc||7o^8 ߝ@lh4VH)ySSS&PUUUB>m8tK.r` qMJ8!BPױ,l67o^/ \g> ~KIBjJL&K6!籿dhױĩ 8i 躎mۨ(躎6iH L@5,aP*PU(HMqDa۶O1M XXX`tt7n L'!9Lj(J2;;;|!H$looST0 Z@>B*s!I!WWW߹s'|Bd,5yhzuT*8C>u]t]`ffgϞϟ^/p9fggRF|GU:aܨ.//qss U\y"a9h4P!dB@шU*rLm&''I&H$H&(h4jA"4MP(1Bl6jR),ˊ4i&a0>>΋/B`6AP*d}}O2??(d2ӔeXZZbcc\.|aјkkkoan d` .$0 |۶١T*A.LOO?h4wމ,l6y Lю .JXXX0K=|WRTXYYayy9R:[[[ 珕}Dj' -䭷bssL&X\\ÇqN$7U*-wڟ a ^߅S((LNNfst{D"qxA !#2 d:4"kkk!A nҭOB"L]Bx񂃃 `rL`aaȢ؋H'~r^I!DJJY(xG^'J!bY?3J4I$h48r%;ALk0pC.^Rh[[[ò,fffzj4q8yTݻE)8Ip)K)K=8!$PVB044M\BP|>ǏGAl@iiM蓅lւ h DUUEիW\tV;\.(? t"MZQo\3Mt:,rb:333$ay) !XZZѣG} !@xVAP(,+:64M+x!SSSxnWݬEhG& a`6+ccch,###J%,:RujS( B,뺌`hh4V.W~O</֞d?R XN7M\EA"Z%IXf N!Tܧ5pX?-EAӴ>O!p]7z6Hv`tt/3 x?pur+(³gώu0 ؋[N}jdӼ#ݻ7]޷V @7& 2̱׶mS,`{{ovֹ1k̠þ+++ѹQXV?:R)υ vdo&f`qK' !|2eq-Vq~mt]gddUUrÉ,Z7_~'|•+W~z񏀃@/bNT.u9sssG #>a/' RJ,ˊWʎ` ޺FA4k0H~YHBB%/t:^u 8Jkr'OȢm/æv?Iw[$ g%1IENDB`contextfree-3.0.5+dfsg1.orig/src-win/icons/doc-design.png0000644000175000017500000014316112076364074021666 0ustar brambramPNG  IHDR>asBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time4/25/05TQprVWxZu8 @uDi'If\6 .IIcrK@J___~{y n<nSt_z*94sǃC'x* ~ @=sp<ʎG"C JOŀ8v7/O!?]άi _KbU>Uo*p?1PyO=?7@+wr+/+YȮP?( xVwrћ6S820HoEP)Ql28tY @ɿZF S@=cIpX1(:tS,X)] WxO35I3k^oASr,ObJc笳Tϩ}d]鼤2T.7]ɺ 9!? MX:L-"DCr_0c.^&Te?SU% T>*<oo*Hd_0A)@}CL["yԾ]:6CR- QePOt@`[V5*~WBel@GVE|-g1>a/;s"VJ;DŽ{D?,~# ^JDx#W$8n/Tr7)>`t S`JEt_>V! |>6bSTڛ'bZ|߂5Lm>{mT^iFWV7 .t/,>Xž@9U~yh OP !wLP&~qCx*|Y A9|^^jC V=/&I0gL Ĕ!OٖV|l#&U/E/yTiƀ?j^㰆Mר O?M:m$+ǷV\ <+陼>&RݚP$-B1u ZtzhƋ3%Iʱtxhp~N"|]UkcX|m@m?< ivs11Tr*$<}kEXzJm HrruNMPkA tWW8o'ܶ|yj|Qn{݊%)>BYoq֗+TK}j8{&WG~Iػ̺8wx)U\b/€'_=-i쯴=9h+=`7plƣv oIu'_ :8.?[{&gg'УމGKBYUaBo+ %`4 % iqV8ܡc0o:`i#xt7?!߬so/AC/~SfZ6[h:`=|a7%O.'ݍqv࡟+eaXVBx1,`/`HmkBF)3mkTSx]YsHL[՞٘}ElLln4$1%qJcYJz *\Iy-(e֗YYev?|N؞XYo[kvxujCv2ud7 ~~whz! VjK#ZK?p}_ISiKA41}Deo6v`|1\mwnr؉O=vxI#^ntoMߺ:n!K҇.KKD JtW7Xw wwXf= Y܉JbF^K{8$ HP,TŹ__[QJ%_EfMV޺6@aɛ4A;d T"={Ed_=kR_ܺq^n1b }ǥOx\+X/h*rf*K$f8ĉYd)?8n ( %X̌:f1@S2"#M:QM. )R^/dGϓ9KN6 -<ٲOƞ0h*4P*(#}f8 r!bwFg051tj+1t:G͑:=4^K(N Nь˵( .(Og{H=g3骊^ՁM1fUvfN1s?l{ Th@Icc.٪ђnqǃ(P/p$s]׫q=Aٳ-e]FD̄V&JЧLO{^ ӋLal܅)dF1h2jU&#q: 5˽<'Œ“ 0}+QVQ{C l|ȄM\%˩f 9?bPdVF05a$',DIB)@@~ ]wSL ʞ2 w5dJͽdo$j9>8Abz"d7`N[;"G+%I~9`WH6g-e89{Ueuc >lε6>"su3%o6׻o Ww Ǻ=^|c5sFh*Xk%y:0^@3$S+3"&"-  kl1Ɲj*ShWFO'ɒ9jՑP,mcS{1\hAϨ#Y:S0;:^F 2Yf*j0#.4GHᗒkQhQ !b&ԑL͢}7.os48dT@7:p ֲF,Mru, X/bDyxxpi >uEjQ+]뉙T(uRƋ g8BZls=V_AYG.f/`7"XÌe 6fsX$t)j;25̒YLHy{P>_B윴WAG\z~ s,`[D-)1DhvP$I%*;̪8ZҖ 4me?9ͨ0#Skq3J^L2Ye\ߟ6K,s#\6T_<aͬxxm~pr8'uzZ YU7pw$(ٛĴAmaJPu0 QEdTe 8y%SfN]-SA;d2Y5{iBNOȣ:7S%he0SS#|Ren]jwA3wn60HF7=_(Y D{柵QL-!2z:+c -Ӆ䴝>e12̱>80+ܶ^<U2s8'R(zb0MvD܈ =z~׹]toxKQDp=XB$7e=eue0`i4Y9k "}-ܔi{aS^@C&ahv&ܾoilL0Ѓ@nw>a^벇dcIJğôט&߽e"$w5x|{ԜBjSq = uI{eQncô^z/ N Җވ"+;h/cˉhĴNLbsz|\?ɹFLˈKLC<qDOr/'&S1=b叽}"*[\0YwޱFu M/᪌>?s3r4#б6"(EE) kk62R+~s}911-3GK˾|񴓂D%Z$T4:$sZVEOJҗkǎQߴ7=mH;k= E6zYKc p׀v㾦c`e͑o2}B 0Z 1hkyFeu4ԃd#,+Z8Ԙ2whГ"fv4bsJF:6żfQV "Hݷu)FL!{E+MEZ8S{b$0՜3̛'Ӵ(ӄuۚ]ڐDkfv4B1$ٶ+cRyJtO7r&Enb+E6Ve4e[,B4ӕ$f<$Y9**ƒnyiٞ/EܡuA<MHec~bN,fg9 _u .UVp2G9y#XW7X+9#4 ? kU-уnq|/r[V|5 8zq&ϝruS-HocrwHuLW ҢZݗt*Gw۹]vc3< o,|`$}v_/!?a^C4 @C !# J=ktG;)WԢXX͏I~ Kx$$GDUghaIs&{H9:<_dQ))%U 'pڔ^`5 RX ӂ 7?QF`I/B6cw?ns~EfO`$Cȳ гiAN+!ޑ~E|a- ,4+~E[nmN p=IC*0v&|ZsAY<}7vg_!{"%135{ di3zfWNȝo$Gܧ[\%<.8 d?;52kA)#9e=H%KgcXuj\ .M|_;rN̹G'݉]78;!=~uka膡3Zka3f%膣h膣WAc@44t ;gѰskq &o C7 fha膡W j6pv6pڼg7 0t -rm CCghŚwE-jع;7;v^=;s] CK kz ޝw G7-qt8Va熝%vnv5켾:v5 0λWk] gKk8{}^:v5 0λCw|ԥ߅Md VA euΨbf?dMeшӅ7OVAҼsQЯioFЎg ۛpM)DOuͮkhߠ=g WqOAb-l oTG7*j]_TǺ}f|QE,h@sjiT4m8E膣K/x-*ؼm3Tsή{uL_(`zG=b-6qGs[6'3˵H񯣁R$W׿(HІZ^G z9|t(L3!Bi }^8Wʮrs=BN)O&VC]C)GPSzQǼ]Q+߄h_د--5,[ o;i%so+#ŧSϛ5=_ HG~bU{?zzz_\xwRG<ĜY{BY3RzDO=`vD&eiŵ=ĢbJM3pU8^YI-뵩kcp:AF;4?40 hCjeGD@*7W-]ٌ-.d^5%!Mh2x#PKD̈ߴz3ܹw֌f܈嗂F,6R&97 2-*Y 滌Y8ֵ77wC%}4v>i?]vOf?'~LgO"{>K/}ga<3&Js^%wis.rۆ>k*9g}kr\н%{XҾWg:@lµ''L%3c6D^V8ibQ۵twJaThMTJ4QH|#Om6 +bvjFjD\=N;\mP^e3R$t/.`Udǹ,e?+Q j꫋i{#oCBjU{j 73洚J_w3Lb+x}E~9#EL1?W2|!yu5k' I -havLkc-'ɫ+Iw$1bVj{$:'l{V|e--'E~K3kzoi֫X~:;\h?oBH>#_lW8 r}CvRZP41}LO4[;ޫa:2ڠyV2WL׼ZLÓsm"XjyFV̜{.`;gDHZ?D1']אr@әBMO ǫw3K[M3f3SIY=&*%)B~Z;O|7&٤o$ا~|lx7b⛫nX]<E{7_xo3?~ޒ68+%OhvAx=n|!e0`iw¦1CfD3v방)rW;]tvXpǍݽ>$%HckL^RTL?EI3j ]wtS7@c]57{mR*@ ;ta\(ewv0) jǣ˾Cum{x&}8z :sIe^웋b:xkՌ_H9.{p؁L>IH?Pb/D,P\(h?Cڌ !?{{w:I&!xunI-2m?sDvG~Ovx?pGiGvx{ ۆ~=0k0"U$ZLV8Ƿ @eM x|hx.`߅GȚ߅ Rt]ulٚc. uAwmp(\2mGwTʚS(fF{ ~FVNXfPXf,"BfCYQ5ý JCcueʎe52V 7̌uE %(M8\d]ļ9!+a||DddGDJ @$0-..OxK@-΍hP ?szyT@:ޠ>Ѕ=hqDOOVȲ2' q#X3kb(OMByjvybwEY3Yn&ˍǶ"m"95<6g ޻U/j}S94yl?Y.m1M4`bL`އA[2eqG=f0eS+lY?w/xT ™jQ58mzfҴczӡeA+[ Bg 2 [bW)+Yvtǒ-JQn[VP-8-t4B)z+-1uwi1P jTctGvL3Q B#`*+ʀ\>ܲ@@F B1P>rdYsb]d9z˱M d1(.Ɉ#7ޒGQ^ ~M7 %ք9i./&6*cQ1hIudR FY) uԖeۆdRzXeUӣR є $T2GdG $Tױ[vqP|IUd*k)PbUo,hɡ4e+.We,E0.%OWڏJs+ϭ6ͱJa+x~t`&bF{٣` &_OwCu^27Sqwƚg[%񋰞KeH@krjE"X]۴ʲwAmkBSx]N0 WV `o6I{ٙͨ26UbDZ9u3\dTFTFyqnSz ¾3 Aك=ٚy`C"uIQ:!eP`{̦23U;/T8wi_521?b0zX&ΏwN>]ZpzѮ*mkBTx}+$+nʔiSL")HdJ,DbH$T3;;W֊z]@&-Y>\yنytc u/$р_ ݈vvvͅUJ@4ZaE6HxV:F6Q>KSy.&{<}Ad:KN?2 n37,OMEN#HF`?- j!j {r+%Aqh $S@%%|9`ƅ}6.?jU 7KBC_{-׮8`Se[ lhF-*,?nt WTe\ÚMOsf^|ŝ}Em ;GFn^Kb[dAݜҥy_g:=h5=#*|3z¡F#$̣[^Y EO)ـ~Iȑ8  Ľ&C}24 L >bXXFkhFWI. -h-yU`F m<}hRvTf}|dT@OP\I' 0%U-b2֓yxd^ƣcAēwP)Xͣ KZQX!+}~CX@- >9Fwx+$@>,#Xٵ1vQ5%tᑄJ#5̖3S=R e[OjRgfM߉ZpE9%辴tc⏥R1. p8Ywh;w@^tug.XHT^?2!+tU#_:{*!nygn:@ Zgpwp٧P栢=ԇ|Utl7~䙔@0 +h%\'̊!Lu`tp/߹÷0!:lH- gA ^Z1KO_<*•G}|;n'e}*#(4hB9Th玡NŶ@%fĠpo9,vrdԬ,qcD-7= 7V >v`f1B+?`ؕ?ջ+yKV"o6TpŚUk}"bɍ7!H*3(Tu|jGyŪEe18-BYYdf[L>='4"}\x乢2EOcvxV|MڡBs%ȧԜ?U$g{075պ[=h`Iu7ޡ1t(f\%}R@uPA(@0Mz>n /:{7l6u]~m'3u/OOX-?Jk3pMNVnuS>q$t>NSgِ,yfzkf6{4!ڵ Y̳X?%ţG|j}~H)'FCy6)$.[xgߍJ<MC+QgPX 7~PT֜~5=4WaH]0/qJ!Ѧ?q?+kpB7ޠ">G}W=\&fH0e kƲ]N0Gg45*O xFD ~Pv_u9%|?vǾal*.p,S?5jPt~ۢ4$FMm3\9\fVdٿIuKk+s]h?:iĺ-^pYljkeA ֣;$3~:LH Ip#W,%ebbad{O`eE}9!mB ,ƈyAUkb]Nø ˌD_ˁj5j%u^׸ `O g9cE @=BHMlk@$ ءۖ#iBOOA\zXCR%ˆ6 _loNVL?7\iB#~_l5zq#wRf|{jSKlcԁt*=LfLQJ_Ke[LE(EU0"R4hbR |;i@fT,}X?GBP7A#Hk2dwըU¢ {3eKxŨ!tϼѝ;ZهMK+2S:¾m:ʋT,شt|H>(;:HfT+_oG=3fLál,0K@I rHmD-Kɵ""7@8bRz=Dmc CF_ŀT-DM2_=Wl@F䴦"%b||+h Un+z`Dv~_ClO$>Y Bcyg |rp]o:8khۘM埁/W^ֆE^ls wfY~(cUSM6:-=j0y-AgЀNN2g$>+y| GA]cپ6m n5v{y4y:l<5y7/CBqP!L||R۝I׷Iw|X\Zꑽܳuu}1c%(Hh!!&>{Ny! BC~{ Uz-b i>hTN./hY}_sPp͠ '.D1bԿoK'mCn0H]_ _&kdx3{G!~KdlfPej9dm5Zq[nJ;#:u|CC-y Oo!N獼7;tYW[kcd [@P {q7wΎd'>{*QVؿMAN: Zl]ѓ䯹c[}: pz$1 U(rtH):=)_]2{xlu:0'Y0v~p %Nj #o^'X՜T¯-d'dT{voƧ߇&9ގlOz|lxq!leP>ޓ 4lBޞ}yơ$9Eg/>_Y\j*SCş9Pdo/g_J7wG`fע4>*04yWĉ &oD93mϻL}5Čގv$OEA0h61s_ qhL`Iw^%M2g 0=f_v fM7R;IEJQ04Ys N[4HWR99s_;o@O7 @s21FQyhm`:o_ π7:zAE^,έx!{>!7r#{77;"{&/0WßﳠA[yυmk}ݲC,NZ M9@`CtD"<p& ^K_J}GR}/ +-khO.ЙZ"W 83;&_ EKًH|!GCVyhKj-үP~Z̚lpyN7;aACNh }p*}FZM8oMGeh ŕW&;0ܕ +$Dz sD %0x/{gݷB#cpD˵#e"K/) !Y#̓Dlg4b>EM3T (9&p~-'GɑlY[?E.`ހM Evn4s<{nҟ4z3ƿM(p4x։m |&x%Z@({~N1qy8FPjDo6SXyhr :JgǾfN&b7Ԋ{dK<ڜw#sںN}xU~Mf_ 244yYhtvш̪>Qc8{Y oߛ|u߄6W(-ߺȍ# n֚MPj] Mp# y}XK sSU>q݁(yug5s3q !{;ߓ"4dG _4>7IH4(.#B ؜cz (#}%şnMC- }|[ϸ%6Pe>4RQoZ ]r;^@UofJ_nnaL3RlP?yרfchRr$R΄"rKG,-cJ铞\ੂJq{} y+wܥMYaq$xH{h2؂H!XG-Cz+Ng÷M#Y#dnrjE!ٯ.Th";vv ׏I42'ZJFBѳ$.2n;ӹtw=xt劉f>W:m+zl<Q CsBL@G1RB9zBG/u9߱\!p"Mj} ӆr)nST&t`&YfpKOm5oI~6;6h'!aG^drE% v <R1%/LPskK\wIΌ\ӀxI7Jb(i(H<'ߟ-Ԥ)ycNŚ:V J>̛jATg /d^YOCrG:ic;CʀW4' hJ7_sQL3!Mۯ6Ky{⼲q 7x˼`[(sk349bx7|q T zըH?-m䙄3ΐ{K@lg)ݺ@ RtiMd\zK.(\rZȞqp~M`d6 /wOd`.HyEϼ zd&<ʉdd9}hR^օ=W"3D_=,!l,ŏq?E?BІ^^c] J*סIq+\bjō 0}6?t6Gл̂:?s%V/Df= ~4_ M=? uA? L`R.[ B:RZ^A)D(ϼRSJu!lꟆ&/Λ cM}[cXaDe(_Lz"oHqcTxwt]8a S!BɄL}XJ" Y[8—>;r xDv؅7Q/b .=_U$?&Y ]X>e F€"UE,hi#z@7Hzc/x27m0"f\0Ѓ>#au Mb5s$Tvb18#{c4+Ώѭ _'2Eeoߟe-2$i%  MrNMAN.9$Dayj~\l;]?B~^Ng~5/Bmu%hk^BiJʵ+w @F!M*yg_8,|:ֆmWàc 3FGu~2'uF=!"ct8/ZԸruڐGtXCg5ZbKZbb[^V ٤)E=+!KΔ\C50!xV~&,~"1>ύ^/kdCmBb4 rQ"x D!W'ܻ}QΏy"Bx|31H.Ͷ2!qb̬?M!?q9><-lW]M}m5NgO4Z{m݅o #CÇM] 2h2_AG@nn*I J<&ߟ Jk`:1Ϩ#{D+B2y\i1^_E1lAbBAnE FX0>>H1'H$K[~ l5n}*jV9/@>RL.$?m>EN$D'~.%8yFc`}{C;+@03Ft̋g; $O)O:f |"""yAБlDk#/{φ7$Ő; Žz ,^rp"~}5C|pKAyɼ"7zq%{SJ{.̥܅ؔNICC!nVzСÒ+e1f(G -/3h)I=қUbPxF?M;YͶTj^zWyr>&5zRnqO÷ My}vP/vFZ4Z#GqES:/]`<{f#y3lfT9FG Oy6uB%|@uf~3˙@}XSwx$"Q}S!T AHP!.Eev_\κ7+miy4qv0‰jdž?+o^+-Y>VH?uhR?wX[ЦKZ$'͡WF E c[`P[Џ q\_]R +zZQ>3jQÉ(cF̬BYB-yFvrQYc? PCt8|];_ svXV +P٭o)1[H>fo]HL@c9w ttW#0*-ZDx}n;,^y{Rn] *j^D;b0 7 63&7*}QxoɶR^dte3a(ԍʛ?ߚW♰\#zz>% T,ȦRkYp\V$PUઐuAXcg{ .uU69WDԶ,|=?_xb}N@;|P%})A?zR!@@P?t@Jy1P{mS̔eYZ^w^1*| ֊9L'd !P'hKh70b:lf'bYykxDm1mx*|u'8B@(čbJJc~0y7ŏz #9{khA׿Y&Y7NU6S@cFLRz}n@*&d^O?bF4k@~O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?YMwg.QmkBT~|`xk]U׼3~=v+8q;c4MҖ &-M@xQDJU^*@Z BB COa8?ξ5=_wk[FFFFFFFFFFFFFFFFFFFvCF=cd*gY? (-$fw7%:EW9 y\uO༝L݌h!>OymA_$?6  S\wfM_3ڴ?: V~*cs qþd s?:/p5lXv(Y>j`F y>څ?q[2Ѧ܏=v>n; ӣx}7x;q |~K|7xΒ|61|?Cۦח$nU㾓8?+.pE`&]yˉ JVNoQ=t l]WdaM"p[GoҮث?2b]Y9d_'!U.[5N>>wwT7cy /i{}\$OHn's5U\I|W#JfC;, B̋GcaWm!7ozܕOl]qVN:1N_xQ2x*0-buy5Ϛ),WbӜVô{|{AϾϛV>׷^GNZm-9 >S#ս%}?b ԕ9i_sڪ9A;n[H??=?V;>+Y/,=|{'t<~d3V|O[5KsV}14ǩ5[ys[{#׍Vۡct^BqV; amUfa}G^?h8ĵ׫[vK)`cVoJf4iTiu%u=܏:ddQ]cuIי{Ucu!s98d|h[i 5mJG|9o}Ov>:v?$Yhʷp?OA}]"2ksN-Y;׮M%vuV*l5}Og3_ߘeKV?%_ҿ2c?<|%]'خ.Œ|p_Ϗ^ MF:I3jI&8~:1+H>=Sװ,G3O\;l5[D6&bmUy.ȬCO{}'`Ȏ3^:$']}mĒf Xu+ct؎W% r2 ^z|Ϊ_ qe#]vq^׊z:h%/Hu X) }t䁾cTGk!qǠ| E[9f8n.Ŝ3>?,.oA_uu=?'#\lmBr@ZsnnMěŞ^"ӽ3s+YY}ЖPOl%ِ;G,>%y |̷ϐ?)ۊa_YnSC_/uL1zx’!>+V?Zp۩a-X[}i=R\m?io(ڑ3B3H[ȑ۾iŸϚϖᄃCEf?x&z]mE]@ƻ'Cuq߯O|Pub|uz\ĩ8׏t9$Êa-HF>4/iYEvm뭂9:.ػF!sݞ=ynr߳-:QGp"g5_o\cd`lS>0y""Eblgo˯Xi_{^9> wVy=Si{wynVƝȗ!5wc{]:k1q_yGFٝo؞>l+UsN1 4q[vsHzq,u+uy蓡NB~P||u3M9 ǹyWy;㴯[xt0aiXԾd8QəoJC[ 5OKDZs?~ύ>3|>D>/"_lz%kJ;GZbG 9&O1ÃߦZnݾgfpbU.*]`YSsR5>Nd|m=~E\}7sKSLPƿq?sFhY򟒁_ 5aq+Y& Y~/G'xOYqv{@!CVF)?B Qu~<;>wx9C~7|mG[q ;p@g>)5꺏 d)UcΜc&-gS&sMi89m +s|ur@LZ(#FJ(?ClL Nǻ|r6O~g= _, [x/m9 y^CTvmq>W&eE68^2py';Ӽ )SoϮyQ sy]!/- , q#56MXѧ:?umR>+a2V¸{Ί9a 9eywU><or_6)y=;e!cfޝ䑏2ӅO7faEZUN|x_osBoׇC9ñ^ܞ,Zwؑ]GV}?e?ȁg1y3SY;_SNE|8]C^y6^,eaض`-! Ĺ$޶i󾏗G9߲gAǑiM*96w۰A~7۴ia|SnShwP^XcGVo4m[,X4'x^~y +'_2eaۂ?<"6ܵ0Jn/؊M=ԞXq0 s޿0w|sd36lfB9yW 9q_|\ Xs.|vTrk9[S.8Φ䫨vLkc) ّ{sIK͘OYc%ǩ8>erp᳋:jxBs!;exr[r)(őH֕Zx?G5ǞS_ߣ쀷j3/ʳ([ߏg \erPKx@~a`Lߥ|(BYڰ,[;ԼA)⿦:#- (zي侟29E φ-~!Z;]= kB7\j uu`W |nG9Cb=NUr6k!/z{;Dك?Iǖ l1GlZkK`(Q.Hqb"hGLX]-R`+ j!oO ~~nBAwu4v@֖dcdr"Gpk\0?uݻn<~l!9D'ף,oRk4f@0clsqMraPn˞K|]ޣnWݜGޗ7ӸxJ:ycH޿s 1W;ɡ|ʋ/T;@"NNÌeƊc:>ߵ*Oy'>KkM{Y:zQr}k >rK}~ oaׇ 2ej:k 1aZ)K|fu&!eI QVAV(Ci#\:c}?Kh^T56u9 _ 2!__!? _BKMex\Py>Gp0u+1=.ӦѿV̧u8+#~k}euc H+#f.[ jj'mʉrB|s[{κv푏CkBG~%46yn/x|c'|{:Oיߛ@2PV[vx8<\P?zv` {e+֎vLaͯL~`ټi;'y3PR6ܴiP} IWq*kD>9#9Pgό>}ߑK}nCNyYi#mn޿> B_o7gjp܊{KZu2q8ΊE={GSʆ֎=" ke?5X|[X[1cњV=5~?_@aál)O@)_?\y.r`Z#d% M~F_Ǫy\<mg-ea^_u?>@C9=@:Y[A4Ѵgs5?>>Kjك^ \[:TԾ<^7z`?0N '9eޫFFM{֦5^ihO)qB;穳{}ڮu%6Hqc(k(Ô銅\v,u*poj9uѼ~qI.je=wynm|my} 9Px-~^Ju z*Z~V/ j~Ih3|<֬j7ψ!F-te瀴nhƊ=67y {{7nH.#v6ǖ v,idϞY~Jy)ǩ~πy l5ޑqc!ﵐfa_>GC&(k-k1iaj?X?_y;I٪E5nMk( rjs:Uע}/c_A(w5 sx{2Pm6NſoKٸ`OX4 vWcuNYk_hF'NS5$!זǁSE>u} u2.X m+jO,_gaLUXkJOdڎ#^SokW;dqWӢ6i U0_"9mo0?|@NߚE>e`/޼;(}GA X; w8{퉂]Z;wڝx/#?5Z;|՚0ozDϮu0 }k[xT[|}_ޔ}qqҧM6C~W 8I{ɿ9H2ٟ֣~穮~ Nr< |Ж_g. )|>yg쓆] * g-|遽IޡW>-3ŀSMlVqfamj'Pϱ Xqց~2|ky`Y㎩ 5<;ڄmP6jē,S}uUh,zʿ!߷M35Wڥz},Q݁~clGKJ[ߦ)ͅ'O oSi_ϦY \{VsME [qt4 }!0WuU3jҴg}ž]R|= O>ߧA!QwG_k8nu? ?[lZݶQh_ȵ\]a?%Ȼz6?=5OJ÷ʫޥoi#` w'<:) k$߯Sp5+7b-~kZwlgB'樟ߑw~/ v!څe~=X{wf~~cy53y{}d}qxL\ۻ׻gI@XjjgiЃ`0 `0 ?ϟ|:seQ3|ӧO|:2|.};7eGFO6_Qv]T]^ˮg{>pjzkuo{yye?{-x/ D:3D&򈼹e^Hyi#/OGzϪ߯_~ :sMe#M3Y#=2 QЙ[\s=E8}E>GȩT ڲTg-}VfoSVwzV}./>~!?U1<#}=F[ ~QڋBN..+푹^edLo+[\-k dW(}6q$#?z6Bөi?L7!3O_Q}Пuo[=tkȋM!'}/Ƈdr2_Cﲨ: `0 :8o=+8-4}۞cĥXdq{bUq©ήm!ƶg*ΪU\z[GA=^+ru{LV U?)V>ғ)x|Yҁgi\yi^cUo*= !TY?rfgWsʽVn*VX#=Fϫ+[F~yH\L~[O҇h5ݵTow|Sfӟ+);F;:x )/OS yUo2e)Ve3'wgGg=J^`0  ľu kU,Ksؑ5nY,bXw{ w&3QהNQev ]ƷgcH˞i{A3I8hwduwUIWq8I>+@pQşGcZ\ƪUߝ]/:3d;ɫ:gB9R|GW~w2;fzt|+i5nΟgZY|<1NyŬ|E7k?z/k><=Α}N΅>uWydʬdz `0 *\?W8GY:Dgcg< 2+'W6qn؟{ru"wU쏘~c#T?+y{Q,,^qF/Xv8.֩g3}ȸOP ~n%hUG4(_sn|W}Tg&x^c,Fѭ+ <#+}/Uw8BRh_|33!mr\7U9m({ѝpvew[xG]߱?g;,nҽow8]וb?OV=Z_#ve?vN_WrYLo;1g9pV^G~>[_vNOS3 `0Q[ veO\k^8֔v<Zbz\Opbn$~}oz3ј mK vU]^iNWA#x딫jt q :E= z%օq)CcYEqyRG-+u (K\hP'*^ء^q=m=y|Kvūe\rȊ4={W1;=ݷxp;o@>ȘT\Ԏ+C=*ɫ|GJOCW]x1.ﵠ9_Eб Vq)v(ʑ}[GwǺ{-oSdו_˞׃2;iT&w*w:g׭SOsj%Z[~_˯d֮+w]7 `0]kIu+eL]ւoA^;=GR?v쯱;<y o$N1紈=:ߥPVu< <&3KyC/4r)i=*/|Ύ^]QNН1qGw>ù{ ?Kv:A}E:_n+{u=rq͓̳]>>d}+|L01`0 leg:׺񶊝`W,3O?]\9P~[kOWiGc~)-<w.3q}'vuw$Vnv(r52S;Wk_Kϔ8B/hEՠ'9w?K;x:x<|@cϽVyc@ۖSw8Bq]=2lBe6V}eR( VeZT4ade2ޒ+nYBTqSߔ<[&=f[|szP)G}{Zׅ3n7jpWwftEw[ǽ;`l? `0 `0 `{~i`oLy>uoi\qK|}7Svu9G쯿c¾#>,jow{ՆݲL=mW2u_8دjo?kD߱mw>#}E:OۡO;y`$jڿ mkBTyx흍8 FSHI!)$FRHnw HYx3ꇤsaaaaxIǏ'U{o_ھgW9 o'GW {>~Jlo߾)*/N\ϱov[iZ_ձaJΝ/:6O- 92b?Tlk%?_21B sY5>:>c=1Ow y^- ڶ,XzusM#גU]>H_yYv!ۉ_mi Rus]Xm_g)YY)m]y,m z1aaaxEߓGקo/Y\k6xjgH|yu.\aæM&wk#ϐ$?]Mo\Ⱦ,/ڥQ@~6s?)}, l gX #vQg Bٙ^uのuhm?}{].~}v_J;xogJY]޳@.)oqC?}>@Xߘ'-(W? źvƔOʙRv[K?[A}?-wmՑ}g\=c}M ggg DŽ-B^k_g?F? v0||؎=ǧHPgs/hؑI t~{n^}ZyD5XWvO)"c0vY Z|~_%/,p\ɹyΰZ/;/xs_9?Pܯ5ݻ\[y|č8gʱL{? 0 0 _k3>z_\S |<)b|7aaaxn.ta?l^Cvkؽ#~e)3<3^kdlc&jK+o"e<.ʞ`^(3zu l+6v<ï k7]/lc[`On}򚄫 G뎱zt^v2)?;Wmr5ocIz?Ozx{&!ez."ѯ 1Gg{+ҏlw<=}GݽFƨ^)zIpG K֜{{e G12ۭqiumf>.}~a? 0 0 [u+7Svq֭y΅ ?ނ}XwŶv?ߩDZۓ-q/?߳=<~#>Fk"qzrQo 9r,nY[;o:)@-`ק-7({߯S@µK9֠ɸ>:n3 _[_*mtcmC>qSL=<6;ǫsaaa{xˌ\ފpx?0׋#5zяc]x^l򼠕(f:~٣^lin59W~\;?vn6erUbS~v^U O7O(|;+SG4|?f*?rW~2oNٟS9~daևmH6mX[J~s.ym4ٶO|Bd/b5ɿyU? 0 0 0 0 0 0 0.P~*1@G\⟿KrKXs2(ߥ纎J8'>X@▼QQbqwx b)_K|v 1M6kee-2Ǜ59?K^E~9ϱQﱮYF8N?~;:=J<-tĒyNAgC \NXKs)'^Kg\~2}6}Գ)n]Or^j~"{p29w6/.z-v:+M{WJYZ굢`% Ҥl9ힶկ#OUz+U?;sd~vND7*.Y+v:ye;8}~|+ÑޅN9}{Bƞ#txխsXɿkSV/uJ=o G<ջL'L:D]6jfgLz/+ؽ[{rCMYq~[{yy czA;w9zszWHVax3 Y:TfmkBTI xڍm0aaAXAtNuө~"B~v(I$Ic i#Gl6p8޾s[ouv?Ru߯+fԍ^|}m43ϭu!Z9RUY׽B,z"|~>/|RתY̞EGߔ뙷L?:fV\꺯Pv#R>cNb=^Fz=yNI}.3?3̥*Ǫ7٧ڞƵ2~zWİg#g&2yK;wʞ2vm"Ggʼd~g<[şXlk=^k͞Gy\ׇ3M^&}V3=3ڣ<_(녾v9> G@Sǿ99Gy*"QYu*lz;{-/9v=Q_s>c),k:gQ%ԝ,SFwA2vWcWqlׯ[},g7F}.2˘ڳj*a w}?]ǛZA6,pw]q TU*llG}g}6n:q -ﺂ _͈p`}oݔD*a]whjrLR\.S.)Jַ:ɈStͿ4A>r 'qA8' z]@X|il6[<'M@B?@"(Ќ2 .%O]X޿bL<3 E"8Λn0MRil@'(JJ0 CtKJ2O?50n(<4 :'X,qy\.M ~ @p8n]T*r9,b|>_'n6"DSM7ÁaJa,l5jB@Xdbb7|t4딴jJ$n_8) i<6.,q 8]uU'D>v;JReV(HREl6nJ@'F@fB5o~ <|MMOncx,gd\Pʝh""j5rH$fS_XTP(T*\THDpS@c| LL&CZvxO&QD H\DpC?oYW333,--E&QlRHT"JL&BU1$ ϩS#111餷B.o~ l00 V.` uܹ7<|^B@2pK\faad2ɹsB0??O2{Wxb kcffn a(ٞrJ%裏 Hfpvqx^<^]vKgg""WMKoƃ7@ K$ s ٱ22 |ϧ|)JD"N'sss " JfhhHkql6^/>T*@>Wc= X,YXXX,p\*IDU}BWq4W^M$QRg?__=3:j"h[0HעuJod& )d24yO8f߾}AU $0$~/ q1>>ZMH|o6JUaG9q4s+]Z%, ҆իr9:;;d2eN>M,|X,t Q(&)Ep(BW&^z\A6b{w 6%!l6岒 KjEBN<T*1<ݎiR)r^W95Ar.C3,aНw~=S ,VpZF>' *p8(Jr9\.ҼѨ2Ϯ^xv;@hTVHٳl6(={k.l]?Lt:9|Jrn{S%. uB Ip[+f7ac/.TQT*6 ۭ8COO^ZfcR! 1>>,Pnz{{q8r8s `KRPVezznM^% BꞚU*u}v#sbf=ϗ{{{l߷Rl;M.`y". ݮ;\.rЈ.^=Qn):::roGG2n7Pϧ^b~~1 H$p: +YXaD%RC`X}JyԹb¡P9e0*" rʣ&qxHp8wͻヒR{!~?###j5&I]]]<# ٭H*RcNOO!hyOBL":J+XDPf V N I6%XAvCWW333ʹ+[7e|>v.>"}>HIƔO!(9si8gnvX^ eRh4J$!\ҝb0JROR.eXA}"&m@4d]njaqqQ)2;"b7k^nEQr R(DQv;]]]q?dttsΑN9rwu2A] !L255E"a^o].tEO2,PJS8THFVcdd׫^{5z{{?Ͼ}h=e8W^fq뭷[ zZK:A˃J 4ORBP(0??O<W >{ LZ7}2#$-[H$HRD"|>vbvvd2I(Fn?OI$r-;vAr'T\nZYljD"޽[=빃rBH8ѹM"$6%;\.+,244Cǣ4h4<^/pXb-dl4LNNreKt\*RՅ$ (8ΝTgGG{W_ɓ*' H$B$!xIbY\\ĉ,--ͮ]ʯ!xM@71Wak;D[VDp'ab@D1dL4M BA>255ɓ'ٳgRyy~\r˅P(p8'<yjyFGGpHAu=Tz8Nnk)kc.kF?P7h@ TRK_|, ݦ{T/ʈF?~s4v;C]\.~:::㌌(P,yy衇0 L&C6@ PwL4 pb9J@ql{F(r j,QXy~OKP3_ĆV~Baq*)a̛.`$fZET'|x<O%3000АrFA`3fvDvcby @ Q0 4˫]sj56(_NS[vww+ ޾[n^{^{y|2a bD"UZ7~{]AVܿ5,P1MU< }rf㶜Cx#all㌏S(Ob_U^RQɤ߮2;;;U&~"!:[-i`0 ײqw2H¾uz711믿g>{=:;;PA? 뿎!Hp%b.ݭhU YYjXܢjFKO[uK:w7~T\.sI8'N`ppP=iCqIU!$\_t\z˗/|E"$oV܂>` ,#ʬ(Y4 c4 ij-UŢbօ)IҡT*ӟ%pm)](*v"` b;v Cy~|a[[%pV*,GXvlFKa{$?(މ0Vfǒ2/_ԩSn9,ejt:(DK.¡Cd||'Orӳ.bVcEX +,A(QX~0.5z RΤ,{־Yͼ@X?ԩS\.?iN---Q*TPHD"B2;;˛oI"W~WU/UZ3|VAiۅ \x @?0%%Lo)˪f̥*={>LGGpY lr\״Yo, (\NuRߦix_5P"ff+Vme/':f X1e*(i5ҀIBNH$2JcޖԩF\p)zzzZ2==J7.̗&fW'Jt:9r/^g~җT'Z[ f^lp$p+6]Y%gP_`K.1;;XLJJV&"~8ennt:"h4Rv {5"V ,awyhn $Y҄IkRTILLL(M$!Nx74RPYƆaYYe~?DBz %Hy|;!J4z3l|!XʒU,B[ݵM‘;i}8g<*AS:߯l[e56Hb>f#Oc&="`U@b!ǰ&ҡS̾R14j!!a]% !z1F+Q0y\.|A8@`K~/!X=5=Plfx^,lVT*8q9߯b>OzL&Mf C@ں fffaxxUN&ܭk"VtECSV P}t@H$BXdffi^/jl6ŋT$VMyi^dPh4J^x7|o|s۲ݙ]pY fZ D.ʞЩ)|tvvK*\.Kۭb1tbXG|+A߫ko3Ǭu&#PX)d-6*Gq7Mnh4 䤪rjD×B˽Bs[=Igy~ҡU+kX"`xU?R+;) V155"i233ӧ9{*T*Oo#۬3~/ۢFQS˿|Gk̭ޱ %1O i@Ћ4MFGGUٵkJKMiZJn X-* W^wW_ŋ|_~Z&߯=.@%m˗iZ]&'')۷OdIUnT?QB!>ކuj&looP*ѡ[p V ͦ[Mh[jUL )4MSnKl\.355*|uֶZH٬G;;; ɨҲ`+49\4j2`*2MS+q|),RvehhדkYp^v;.]駟k_'NfnGo\@ ЖfDӮVzŊt7+9ۨoOGt۬| &:sX"g`EA' w1ߪ*`Pe\K8R\>ůNzUU)%߷$_?oRKXڒ#Gz4 A䩛gzcDt:s277ѣG7fp;~mlc8C,?x= hsNnГB A5,_\Dzʷf4ⷖ52 ϟ9u_җ8rȚI"DZij p9nq,)XV8 mR&.I\QdaH=~h1{h#5"hvߒg +z>6ADU5 ^’y,ͿHm @Q/T"~JfMd[Q' J:t@ ׾U,}Vup E`r^,K}~ۡJն:Ac5Yi>%"\k~i~yjaV0 +%7i VK6Օcec7; ˏcyg9rȦA3BwK,6 d/SXGI\m@]}oʢQqz(xffa``@fYRJr]o8T dI වtckXOsp.VCj7Տ7+֛@H$ljFrرk<;-߰X{X +7]8)U4͎[kP -lkvf\@b1O6U [ٳg>²7VWn,a'FzѶпlkՕ\qk]\.y7;^z%fffz5fu\Xd||b(r(ۯ`85&aa=hUЏ5 4k Fa#7 ab1??GGx8Lb)}{=%ty,%pCCwD \k{mGZO}ǎcttGD|)lJ%op!~aWq]wLaepC#]ckA3Y0DQz)j xo[Y!|رcol6` `w y#4\kj ce}QLX䥗^bdd\tl6~{1DB:ŰVw垀h[0؜Bl=_{ ^x|>ߚP8}4*}my {_ . ϟرc?8l={x".]"N qi`qȇjzVOnvvt9^n7SSSE@([oq%{1yyyꩧ7+W裏TedC/fJxGd2;wNeIICwwf}oksm2؈]fqwP.9sZe$Nկ~d2#L277صkSSSWR===tvv*\*Tqo|2f'=nDj>v"?~ZVu"E^LH^ n(p=,v IJvM`0ȓO> Y%HY?ɰ,q[?q]x{ٽ{7lV3lTm]8Zmzzߢ y' lakw7r܍;um#fi|^ܟYNh9l7"ٹkjclQ1.h'7:VfFkm׋`"CVٿXoֺf7ȍmfn͌jh/F)~oc6[6?V?@m>h'bm`-6뉅VX %ߪ OI Q] \o&Ȳvv ZN@෰bX=kk)EbyB\H#2VjE,t6f*X7XjM^MgOaS 3-+ZX7U2,[*K>C"ֻ%`VmhFYoYS:WMcp7/7 +dMOa zU iw-b`[ T)'; L&|F:l˸GPDת"msk,IENDB`contextfree-3.0.5+dfsg1.orig/src-win/icons/app-design.png0000644000175000017500000016317012076364074021703 0ustar brambramPNG  IHDR>asBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time4/20/05犡 prVWxZkZ"K͢PTH`w;nf0{LOĉDD?4ԉGw9gy||^z=?qv;~?~]y|$~>GI]'tXc`31#ߪY >j G׍" aç=dR_D_8?Ӡ!Mj2;>8O$7[HI4f p~ LE*ՂFYع! C2p}@ԆI|꣰:<|^5]  ^^B:*g*N  nXޠ @|Fyd29xU w;؈LI4_] K3cMLwBK3L-օ<?ʙ*YMa#6*͔ ID)ݹ"ط]Y sžA˒o|7B&@b~˒}Ut@\T( Tu?p 4`UǝΦ΀_X$ %wx&Hqҿ˞8EE\D69 tQ_lh<)9!'ʀ7 ߨf)@ՏzѪÜ  At uD}u 0mLQQ : >Eտn P/9֒EG<(3FG/ okA~ɏO= `4nnJu\wNY[M[K̀KIѳQ \wS^keE)Y4"W8WO }΀CikνP3Q-䟠=%1Z汀>駑'5W`Z$Lnsa4ZyIzDo53t98i2bZӝ|P A|`SJ}3)r+~Z+j@կ,6vF 'D1ד8ꀆjt_V=rŬ]s)J0;#rw]d`<‾߭zj85u;~"'}{co[7) nW8O~] lR9>O,X&, Y5/syGq _Wqm|6څ;Sgte_"ky`x)G_iz!w?ןaErq=k<1@O&ޮ%,9ng&FHoWFXӫv$)4x XƄj^ͪSC: J/qv20dcWޤXwQwuoƀՀg=)ٗMt1nGVTeBf8c! @BοiI84$EoOZ dsOv-[u PmwIH:ڎ|:m>:{ڽHi͘(?&r˟x3U.#pZF`1zY{E;]{ǐ ` ˝єkLNҜ_s/^`XkXC\H3ᜑ.^~{g/¨1xmN|A}(I:gY+^9-LA&}@w$Y)wy݆d\&|JTcPjn?;!6CWoG @A>K2b2RFqm5MMPs0z@ڻѼG=NxZz$jc>%E8M:9V uXC3 M>c2 zjޏn)6y_o>E \I9P2x\f֦qa^bBLpcGV IWH WɱӉ-PƯk?{l1,?f߇9pvSs"'`ηN;\Ħo$R\ڳx9oE>xc O#n}􄿷3.5LJ{U(wb=jMaz6q?Wt{McY`~vGh9*/DenM*T_lCV0onG t+,~퇡Z30۸l9پ6mMfmB9 thM膯pa_%?>o.^nLѪۯ,:pmQ (~ӽzA ?O01d+1p4"iMLVv$Ѓտ_Wy|y| g& rHmkBF)3mkTSx]YsG[Nkfca_1aD@bРLESŠ$E[YWI۴Gue֗GW7/׋vwЂ? }lLG N;b[у2 Pnj zك_;˅F)SYpxԅPr%Ε_ኳ:a;GT?_S7hnZ M.TЦ١=?M:jisN³X5e2(5пl+;p 3K(h%!x!U>P?*8P yer֐[M6ijԸ2Vˏ{ƭE 1vs'^|c-#>`5T>)J*$Hqi.!IL ?1|p' w&͎2< R@fO곥a}sB(138Ü@\YR0XtPolVc> ?LJC7XFbɆKu#*K xREaDHBm,e>0L q<>ʣ~JbC^]P3rF g+2`1]SD3J3]KeC`fy73d mRL0%ç}E2”U6*8oNȊNT5^J=N>h*窀ݮܮ(3oJ/X<_oMVRX@psEGN9B(xBckX:~quq"/ <K*> voY?OWlZ-yE f r@D)΃˰6B$Qoɰaj i^(AM5t&&*SsC3ըBiHXBiScc""z]7U.U4kZ&&=|${wd/ b"PR!55.1Kl7\xDVK=׍ ^IHH "GϝV@ALo7Y2xD7!#*ɡˇ~,y49gfjhІ`_B ZR%1$ja& US8<zo!d<+ i6vK^eN`(Ebf*e%g}N[# GgRSpңpc>uAGHGN?8VtѤ9[:\;Ω 9; #Y.]iN-F[%`UY RŇqj6,Ib_YDr0g(ahQ X8\r0pdhӈ +bKuDOvy{t|*ȃ(H[1C6[*(Ps42#3'!hH]}O)P衍fMLBTr"\s<]{Ccۃp'g#I )0kTؘD(SKމ`0K0= Q#5;obg紽*Ȕ$95Cm]Zr2E d>W:p| B)DL*Hr-W? >_.erc±kz126G=Ĕt8~{ V>9Æ]A赅;pfYrfe:Us ͵' C7 J ~Hm!$(;%dǢ(^V:m>$ӂ;׏'3TA<7%IYU[T1n9S%c1SQDG|AI歴D3 ҥW&SN/ Ev$w^6ɟw|]>์aNCa,뗔H Kz ؎gx̖UHtN+%Pcy2̟ qSy#G"pYNzN>eEJFKf?,Ḷlrـ{t~.Y+A;% }Id(ۏ:2^1pEJsߘ?hA1VD_HivY凰÷0 EZXòWX޼m*"|,9RL-+Od5)Xh1~+i$5'%YMZUD0{E")ܰ$l5Ȫ,Cz5^ 69IdbZEL=r'Ɖf%.'W&Db!>Bl,Z3j"ȱVQX\"FaqjšZrL K+>q~51Mk1aG0e'9elHqHi #`(bIAj`[zH}"اTdz@' Wi+z`0Ҿy:ғ}SV<wȦ~.6<q#HՇìOfP.;sa6S5%+Z:-le8ݸTNԴґ-kܪ=EuS P^ъj`z9 &h⎭tc}ҁLgx,taӶf$ѳYZkO+ᮢ98ݷk#FYJM͙ie(=U-Kɗ+R\)_E!۶g1͜.)x3B5i8IEߴ"0tjK>(Գ)h\©SUmrWlMXׂ ^d`Sǟ)^3C^B9Ct_iUirN~[ltOZ^7gS Y(׊ ,.Smd{ڭ^;rJ0:Sc>>F `_/Z{?I 1y|/*H⸀s{ʌ޵Dj:ثAk%WܣDDˏޑp1 @wERw>K~:[GN<'NS]ġ]Y(ڊ?+?Ї]8@ EW:[< Rn_y"aʟ+أOWRD8%ܳлliAFЧߒ~5>.;k7YY׋-_i iqJI"V]Qȷ7g~HY.luEt&HICfOf?wv4[ XͯakxD5q?qdY i`Y>i/H6W@\MfOs)+xʋL܊g']]8;&=~ mf蚡% m ]32C+z5G-h蚣aO/4t5;٪ٹf8wDf蚡k^fhf蚡 jԜ]svkή9{c^ukfh C\[3tзʻG5;糳V=`z]gMf诉w5C7蚣&WǺW\ʻ7ʻk^yW3~9쯉w5goΫʻk^yW3]1t G]J]Dxj]lp;LB_wn}7q0_fI2ob.SL@}OD8C.t'V5P۞rmK~ skӸqsި5퍊Q닊ش/Z3ޜ/ 3Va>;Q-* 9Zk9ѿ|mS/}%ⶇò01N8 YU5bZ< 3yoʜh PW*ײ3=KF͕4qJ ֟n=Y Ž/8cgaJ&ޟ ?4Cs#u9tjM(7r\]b55D?ޞ_-5aD3/70 %UjEZ߂^BA" *L/(};m#Z Uɖ$/L?ofzy*?얲Fߊ8d1JG,;e{*AgR$ʴ(r;.Gd?%(c}=S)-=L!!Ud]DQEJiϚZ1܌<" ,(k)[(d)1G.wϡ(!PK#wy2瘝+$mlmPIҘ!*s~Ĵ\/N;'^M-ŝ`Nfc{> kϕjG0tNm/ӓh$~j;.bۆ>2>e2խc㌮G(=DƲ}\&=KYd5%?P>aؒh8̼1hY5۵oУUg%D>+ '6{݇om kb~TjFjH\=I+\mQZRyHUlU2򶫡?5*`FH`J

u_s[ϛҼ?[Ma=thub^_)i\4JMіA*fǸzhf{lrɄ?<цO YD[\/bݲ_('3ބR&wqaYn.$⚴oSRzqU# ٺ֌I~+Ic"/^&Q^0ݤ0_d45.xX>ꚅk,faz?/@Aogphv/h?AٺG;dlgIvh,pZoj9/4 : C84]"l0h{soS@fN6_fWצ.j7٦O'I7_xIgpgw(>CpI9Y:fMY'ؖGԭvE7y[a9|P ;akԙPbnpھ݅nAw6izmp;_sdv8^!zX-Gcza6;lӢL޿u?zqc!Ckc~:G7-$W>;qҌ2.Ք_hK+66]{mE6qOʏUs 4|T#.D"pP6%SvEG`AtmvI&~wBN[4wڧD4*f'gP$ g1`nUp5kFcUS#(!<u^6vv^; p}M$S,~I?w; {X k{' W6{Sw _/4=;? `p|:[`m{m@Ӛ0-C-8bMoت@3{B^-Mi =􉙚~8|nQ Fh^ô=<LC#8[c5<Ƕjn%h2HT V-Ucՙ qlLjjYmp O34MmzOocfT*t{T{ 54UTf:UkB0N0! r"pC4Px#3Q[ʲa-NT jauw?auժ}r-GsP5hXB*# dz`nMRvv] ckZu~=8=&bc G&\ϙ>[༘?,myQƳ 3*j8 un6a͆ey|ƥ{v.-k! x蚦hؚ+2Pؼ>5]2?2Pjr{ٶhmE8>ӴñBKS p5ʆ1 b+ PW3do6U9I53yi "4 lrsmZj9T]haj.3Nh -n uM| [1)ç#PACď}%^qp<5񨎫Wu!~lx]x/]ރ L5R^Hl bӑFfs0ӜiV ô-eZñ!ڰ]ԋkSoz "r- [pCEА&u 2a-NAdZX̃qLa[1w" x+F FnGX HFв;+-ρIJ~;M'Qd=L3cu4akϵ\she]Bӽt^.mKzZ`qbnX11&1t~㍆3t V+fM-5>-hSv@c,5[׋}fA} WlB(M\ߢ[/ `%6da6-*)ĢEE?EEOP{&tYP|(8)9w(-ĔkmkBSx]N 0Bm ݨ􁭷VU! (evfvel1䌂:98`FTƠTAu;8w),¾pd+l`O6;[3A~\H>)K/-*[ٻ:חs*2\/3n95ʽjT$+ K.8Y[*mkBTx}+$+nʔiSL")HdJ,DbH$T3;;W֊z]@&-Y>\yنytc u/$р_ ݈vvvͅUJ@4ZaE6HxV:F6Q>KSy.&{<}Ad:KN?2 n37,OMEN#HF`?- j!j {r+%Aqh $S@%%|9`ƅ}6.?jU 7KBC_{-׮8`Se[ lhF-*,?nt WTe\ÚMOsf^|ŝ}Em ;GFn^Kb[dAݜҥy_g:=h5=#*|3z¡F#$̣[^Y EO)ـ~Iȑ8  Ľ&C}24 L >bXXFkhFWI. -h-yU`F m<}hRvTf}|dT@OP\I' 0%U-b2֓yxd^ƣcAēwP)Xͣ KZQX!+}~CX@- >9Fwx+$@>,#Xٵ1vQ5%tᑄJ#5̖3S=R e[OjRgfM߉ZpE9%辴tc⏥R1. p8Ywh;w@^tug.XHT^?2!+tU#_:{*!nygn:@ Zgpwp٧P栢=ԇ|Utl7~䙔@0 +h%\'̊!Lu`tp/߹÷0!:lH- gA ^Z1KO_<*•G}|;n'e}*#(4hB9Th玡NŶ@%fĠpo9,vrdԬ,qcD-7= 7V >v`f1B+?`ؕ?ջ+yKV"o6TpŚUk}"bɍ7!H*3(Tu|jGyŪEe18-BYYdf[L>='4"}\x乢2EOcvxV|MڡBs%ȧԜ?U$g{075պ[=h`Iu7ޡ1t(f\%}R@uPA(@0Mz>n /:{7l6u]~m'3u/OOX-?Jk3pMNVnuS>q$t>NSgِ,yfzkf6{4!ڵ Y̳X?%ţG|j}~H)'FCy6)$.[xgߍJ<MC+QgPX 7~PT֜~5=4WaH]0/qJ!Ѧ?q?+kpB7ޠ">G}W=\&fH0e kƲ]N0Gg45*O xFD ~Pv_u9%|?vǾal*.p,S?5jPt~ۢ4$FMm3\9\fVdٿIuKk+s]h?:iĺ-^pYljkeA ֣;$3~:LH Ip#W,%ebbad{O`eE}9!mB ,ƈyAUkb]Nø ˌD_ˁj5j%u^׸ `O g9cE @=BHMlk@$ ءۖ#iBOOA\zXCR%ˆ6 _loNVL?7\iB#~_l5zq#wRf|{jSKlcԁt*=LfLQJ_Ke[LE(EU0"R4hbR |;i@fT,}X?GBP7A#Hk2dwըU¢ {3eKxŨ!tϼѝ;ZهMK+2S:¾m:ʋT,شt|H>(;:HfT+_oG=3fLál,0K@I rHmD-Kɵ""7@8bRz=Dmc CF_ŀT-DM2_=Wl@F䴦"%b||+h Un+z`Dv~_ClO$>Y Bcyg |rp]o:8khۘM埁/W^ֆE^ls wfY~(cUSM6:-=j0y-AgЀNN2g$>+y| GA]cپ6m n5v{y4y:l<5y7/CBqP!L||R۝I׷Iw|X\Zꑽܳuu}1c%(Hh!!&>{Ny! BC~{ Uz-b i>hTN./hY}_sPp͠ '.D1bԿoK'mCn0H]_ _&kdx3{G!~KdlfPej9dm5Zq[nJ;#:u|CC-y Oo!N獼7;tYW[kcd [@P {q7wΎd'>{*QVؿMAN: Zl]ѓ䯹c[}: pz$1 U(rtH):=)_]2{xlu:0'Y0v~p %Nj #o^'X՜T¯-d'dT{voƧ߇&9ގlOz|lxq!leP>ޓ 4lBޞ}yơ$9Eg/>_Y\j*SCş9Pdo/g_J7wG`fע4>*04yWĉ &oD93mϻL}5Čގv$OEA0h61s_ qhL`Iw^%M2g 0=f_v fM7R;IEJQ04Ys N[4HWR99s_;o@O7 @s21FQyhm`:o_ π7:zAE^,έx!{>!7r#{77;"{&/0WßﳠA[yυmk}ݲC,NZ M9@`CtD"<p& ^K_J}GR}/ +-khO.ЙZ"W 83;&_ EKًH|!GCVyhKj-үP~Z̚lpyN7;aACNh }p*}FZM8oMGeh ŕW&;0ܕ +$Dz sD %0x/{gݷB#cpD˵#e"K/) !Y#̓Dlg4b>EM3T (9&p~-'GɑlY[?E.`ހM Evn4s<{nҟ4z3ƿM(p4x։m |&x%Z@({~N1qy8FPjDo6SXyhr :JgǾfN&b7Ԋ{dK<ڜw#sںN}xU~Mf_ 244yYhtvш̪>Qc8{Y oߛ|u߄6W(-ߺȍ# n֚MPj] Mp# y}XK sSU>q݁(yug5s3q !{;ߓ"4dG _4>7IH4(.#B ؜cz (#}%şnMC- }|[ϸ%6Pe>4RQoZ ]r;^@UofJ_nnaL3RlP?yרfchRr$R΄"rKG,-cJ铞\ੂJq{} y+wܥMYaq$xH{h2؂H!XG-Cz+Ng÷M#Y#dnrjE!ٯ.Th";vv ׏I42'ZJFBѳ$.2n;ӹtw=xt劉f>W:m+zl<Q CsBL@G1RB9zBG/u9߱\!p"Mj} ӆr)nST&t`&YfpKOm5oI~6;6h'!aG^drE% v <R1%/LPskK\wIΌ\ӀxI7Jb(i(H<'ߟ-Ԥ)ycNŚ:V J>̛jATg /d^YOCrG:ic;CʀW4' hJ7_sQL3!Mۯ6Ky{⼲q 7x˼`[(sk349bx7|q T zըH?-m䙄3ΐ{K@lg)ݺ@ RtiMd\zK.(\rZȞqp~M`d6 /wOd`.HyEϼ zd&<ʉdd9}hR^օ=W"3D_=,!l,ŏq?E?BІ^^c] J*סIq+\bjō 0}6?t6Gл̂:?s%V/Df= ~4_ M=? uA? L`R.[ B:RZ^A)D(ϼRSJu!lꟆ&/Λ cM}[cXaDe(_Lz"oHqcTxwt]8a S!BɄL}XJ" Y[8—>;r xDv؅7Q/b .=_U$?&Y ]X>e F€"UE,hi#z@7Hzc/x27m0"f\0Ѓ>#au Mb5s$Tvb18#{c4+Ώѭ _'2Eeoߟe-2$i%  MrNMAN.9$Dayj~\l;]?B~^Ng~5/Bmu%hk^BiJʵ+w @F!M*yg_8,|:ֆmWàc 3FGu~2'uF=!"ct8/ZԸruڐGtXCg5ZbKZbb[^V ٤)E=+!KΔ\C50!xV~&,~"1>ύ^/kdCmBb4 rQ"x D!W'ܻ}QΏy"Bx|31H.Ͷ2!qb̬?M!?q9><-lW]M}m5NgO4Z{m݅o #CÇM] 2h2_AG@nn*I J<&ߟ Jk`:1Ϩ#{D+B2y\i1^_E1lAbBAnE FX0>>H1'H$K[~ l5n}*jV9/@>RL.$?m>EN$D'~.%8yFc`}{C;+@03Ft̋g; $O)O:f |"""yAБlDk#/{φ7$Ő; Žz ,^rp"~}5C|pKAyɼ"7zq%{SJ{.̥܅ؔNICC!nVzСÒ+e1f(G -/3h)I=қUbPxF?M;YͶTj^zWyr>&5zRnqO÷ My}vP/vFZ4Z#GqES:/]`<{f#y3lfT9FG Oy6uB%|@uf~3˙@}XSwx$"Q}S!T AHP!.Eev_\κ7+miy4qv0‰jdž?+o^+-Y>VH?uhR?wX[ЦKZ$'͡WF E c[`P[Џ q\_]R +zZQ>3jQÉ(cF̬BYB-yFvrQYc? PCt8|];_ svXV +P٭o)1[H>fo]HL@c9w ttW#0*-ZDx}n;,^y{Rn] *j^D;b0 7 63&7*}QxoɶR^dte3a(ԍʛ?ߚW♰\#zz>% T,ȦRkYp\V$PUઐuAXcg{ .uU69WDԶ,|=?_xb}N@;|P%})A?zR!@@P?t@Jy1P{mS̔eYZ^w^1*| ֊9L'd !P'hKh70b:lf'bYykxDm1mx*|u'8B@(čbJJc~0y7ŏz #9{khA׿Y&Y7NU6S@cFLRz}n@*&d^O?bF4k@~O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?YMwg.UmkBTyx]idW>wWO/=ݳtOgߒL811f1jLbј$7?\Q7DbDACQ"B ߩw}U{{z=>YZZ2fEt,eOrY_gjṭkYG'dlyF$AҴ {Qs=/EH0:|z3,o,ǮD V=PvL1ҽ|}!lC$jޜ0}R!]쯤u\[)hB#<Y^0eg}dJ:.$$fH8J/$OV}ɟvlco"R J:6%} ?xޗ>O HR^uw:?Է-Qy .g;S :Xi ǯs˚l݀6`w.$(=Fs9 X w 1cdo8$OV2/^_Ans$z"Hg_q:=F2{rWWjsAWRv>/i /v^ʥ u y 0`?I%w3gG^{ٶ ʢea4fx7!M`w&8_=,qD1q!48*Nmk53@}0\66m1I0s齟t7z\ ngyve@W~g~_BohWC{6q"9ӝnhߜύ{ixA zzP5π8]uQAq`?yƏ%Wޔ6>nn鯱8:2qv@ۭ H|^w28jq1~*9|Esō6+{*HNPF_'҄ |mbV}={8~8[M $!x*~ Oüo׆r>p Q}/iXc^IA~(+Ҽ-hlmE:_G~$f:CRX|?iHG n8vG$~8Gx3>jx P~x|8y3lvHo{#oHju$ZWkY[t鱅mP>q]&x8۟E[Hk#VPog99B}%_Aד{ȚVp:q_K ͹| _'mA199F\fKڌLˠ`-hl[(Cρ'q5t}4²vY?O@/5>_3%l<9 19KN_/g;NY8!@O5mM<4)x6b7jW?vПН5 [}UK\//% pn?EZu/7Y&<~sͥls5VU6PvNt\9~&l }EC?H`߮|XUCq#T2B?=#ymn!a#\?GslOC9](D\w$eWGW9&ƮꙖ>?OnxluBMS BK%f)ك^fq(_KSC`^L YhBzz) ="@o7<*SGM}h![Sv|ƭU_Q5~9Ҝ}7<1`9 =~@_3/ߩ|`~}@_'IkzTo!Jr{%<<'6 2 zs@1/׋m:iGɣ*/@_VЙ; )s-s}!;)!K!Kט>z+ þc[6uQB| t9ez,]Qҵstwi-v<;/{u/:4'[y9LZ˴b?k5}SИ27NA)6A>exUVZHm4d~< l]6? mVe3YX%^= @=.I^OH7-~V5\aٺ/#Wo34 Fq`čsgZάr؟5{2oA@A1>B:W5Z lGzǺ ŀ47cVX+-?0~FܸkM\ Blq_~r'O`|ry ؚq}qP u]a<=GokxunC^bmi_v -|`^ QS>@sLK@sJ~ *{WF3Yamό9ADŽuIS/]ȧ8x{ܖ^mυnD+>|KڇЃk)i]WF>(^O|ƆOS%_>ި7r_fn}ynclYobۓBw[~c~Ob3mb',⹫W|ʯ[x Tecu21]jSx۽D3:=@;oz-ՠ/h5:ի!gmk4so~E;kZl%_k>h}u_gOH91NJ]=E:SU`y@h 閵W}{̰uHo;&_Ѻ(~7e" ~*.Oq-@gb{M?*M5㍒!+}gKn>%#@wkn>Kĭ=/r~W`@z`F+t# 4GV}=,dbǤ]qqV؎WipaɈo9XJciBh7i{ݱ(= |b?/}VC-hSiR;g*\r15v15/yW:Խuh:שC}sbXLMnoJ:6ԭvg N+l*@`zBsGԗ W\疋l[Խ$o#?hnnԿX;m\O1n)Y4\rsVx6dS ~"n]a}L~eXZ`T~(_s`(n;$cߕrM}xkIk,W?'N#Gp_McȿYGw/~Υc/lɫDwj[XoK[7?}D;&&bY65h~E%ſkkIcc--O9[;vE:>~Q5yH h98hh  mkBTyPx]gs|@A$0@̢H)hےT]v]?vc.Uupw;;Ҽy3k^v {ueGn~~2 2gu< ?}sG3zw_"Y:l;O83P],| ='Gݿ,ߊ+s:Fb_?BsO5NGed d::Lt߻=xxyO>{S|R^GDz+/}SmSf2LgǗ]MqyʕlMkʯuXc<7c7oߣ_uW =/gXMe.^4n(^|~DSO) .dX0˾oӈ.3\ʰs6qeq\nıgG˝ql(8mnY\AE/Z-gx΋<E9o14;J+m˃pa$vK~($8aqfD>B,8diAezH_g!vq X봓ـqq5Ö_A:*yZy( 3ҏ5zyƇ>dt6g{Av?vuB\4ij/ew ʼ1 YF?R7./-c;AyX 9My̚|GFYʻkLq u͓׫p [8~]p:Y&LY>_ N-F3?[ ~L?>W\>.`' ,oP>#k{ 3{NQn!f܋k$zׯۀ 6rY b?"m.y_% |RMCl7e{?s)w}>g/U Nd_'m[I ce''fx}3-uyJIŤ;ϕ⏎q/;Γ8Z7-r{gk8X`_-č3 "E9Z96( }N>//%WR8GyR{+G' ya[e[ke2MYXKևy6edx^y^p\^diy0fw c[<Ljg~>T>!b|̱=EvnУahBt?uܘbXn_s.k:akg˔mbZ[Xir~*=l#emmXoԍx*cjGr?>o8N1uqCwȗb^w|k>Ͷ{;˿wz>dԄBS'T#LxӯPF0r6>oZSNy2{ _\f#wM^GrqZ[I]_+/lf@4 ۭy!؃q ~D5 v1yx;͛@0_N;lVȿ8y s>W^2W5tȣ/Bc?|ó ]V_$(]!'b jſ콯eA|"_7 ЧDžن}Jݪ{>5ǯ O)_+VϥZl"5wC?|.ϣ ޑ7͕tW~ׯU~Bnq(>/P'_6bKڡZwP8@ys}3Y/PEn繋k 0G|:>ؤkvȀb5r2A}W@y0CGs9V;rV<ZW7fk&@>s|;sUQ56xBm_hWxkE.3r c su2}r_o?5qOsCr甅QtpS }`fa,oWÅ" V q =x@)庶<ڿj?u31E {;5Q}< 9xb ,Z͙Ck.:_U׈?GJ݆݅}Gl)麗'(7;e=٠t+>q/woXO/l!ۡ|Y{~ҘqcFWhoO&jz-T4puhcwJvo2kwjW׎ޠ{Zw2nޣo셅yS"}v?UI]5Lo@ ;pmPں]OlgSr]ӿTc5]X]Y3x ? 16|vh?C#FAmGӾcj-_7y |tJYY[?=`NDǢkh"t/=ڤ+m}>VZ d\{9i8׼csN.v~gݰnn_sۈlobvrk+Ǣ Յ_ [i *U:΃k G5+{r;Oxo(̽Sk*S¼5t[=SޯR}t1t 61CrRY~5WU?: >o넵gњ -W~?ֳ.w2-m;J^l6G^<½Y}P^E9n {ioϢKɗZw2~sǚ[#][ u5y˕R=cXݼG0- >mڳɊ!ǔ#V :"~,El-;vm yI;}ޒ={S6CWWk:jߝ2 _ |~=djwr{@܍0gVLwHs6s6񿶐g{/ܯm{gh?tٱba {k~ҼIɽl󤵮Q u7u*o3Q- hOX`Y9?T>r$lSKq l!C|Zfщ㺃Uozfā>yWj@j~\?28pjT(8_y,83 -c}ԭ'hwԳ ɿ+I=# ;z!h>OEZrww{~hm9p{=+J"^: R5cB墅 s=?5 5i5> F;thgZqxT*,bsp.Ԏ> F)Wkgw"^q<^cf_2Gԉ=o-A~,Ȼj#6Q=>~88kkr~ 7/}=ڳcgV\X3b8(Nm``?$ O`gd}1;?^q_c/53ڊc[GtD&~+q~1E6+ڊڠdOYי 5[uzF6Y$ܗ~?l7*Xrhwc,cCq(;7zg%Ϩqp6aaA{g$8ocCA mkBT~x흍) q ĉ8D^>׻gI@XjjgiЃ`0 `0 ?ϟ|:seQ3|ӧO|:2|.};7eGFO6_Qv]T]^ˮg{>pjzkuo{yye?{-x/ D:3D&򈼹e^Hyi#/OGzϪ߯_~ :sMe#M3Y#=2 QЙ[\s=E8}E>GȩT ڲTg-}VfoSVwzV}./>~!?U1<#}=F[ ~QڋBN..+푹^edLo+[\-k dW(}6q$#?z6Bөi?L7!3O_Q}Пuo[=tkȋM!'}/Ƈdr2_Cﲨ: `0 :8o=+8-4}۞cĥXdq{bUq©ήm!ƶg*ΪU\z[GA=^+ru{LV U?)V>ғ)x|Yҁgi\yi^cUo*= !TY?rfgWsʽVn*VX#=Fϫ+[F~yH\L~[O҇h5ݵTow|Sfӟ+);F;:x )/OS yUo2e)Ve3'wgGg=J^`0  ľu kU,Ksؑ5nY,bXw{ w&3QהNQev ]ƷgcH˞i{A3I8hwduwUIWq8I>+@pQşGcZ\ƪUߝ]/:3d;ɫ:gB9R|GW~w2;fzt|+i5nΟgZY|<1NyŬ|E7k?z/k><=Α}N΅>uWydʬdz `0 *\?W8GY:Dgcg< 2+'W6qn؟{ru"wU쏘~c#T?+y{Q,,^qF/Xv8.֩g3}ȸOP ~n%hUG4(_sn|W}Tg&x^c,Fѭ+ <#+}/Uw8BRh_|33!mr\7U9m({ѝpvew[xG]߱?g;,nҽow8]וb?OV=Z_#ve?vN_WrYLo;1g9pV^G~>[_vNOS3 `0Q[ veO\k^8֔v<Zbz\Opbn$~}oz3ј mK vU]^iNWA#x딫jt q :E= z%օq)CcYEqyRG-+u (K\hP'*^ء^q=m=y|Kvūe\rȊ4={W1;=ݷxp;o@>ȘT\Ԏ+C=*ɫ|GJOCW]x1.ﵠ9_Eб Vq)v(ʑ}[GwǺ{-oSdו_˞׃2;iT&w*w:g׭SOsj%Z[~_˯d֮+w]7 `0]kIu+eL]ւoA^;=GR?v쯱;<y o$N1紈=:ߥPVu< <&3KyC/4r)i=*/|Ύ^]QNН1qGw>ù{ ?Kv:A}E:_n+{u=rq͓̳]>>d}+|L01`0 leg:׺񶊝`W,3O?]\9P~[kOWiGc~)-<w.3q}'vuw$Vnv(r52S;Wk_Kϔ8B/hEՠ'9w?K;x:x<|@cϽVyc@ۖSw8Bq]=2lBe6V}eR( VeZT4ade2ޒ+nYBTqSߔ<[&=f[|szP)G}{Zׅ3n7jpWwftEw[ǽ;`l? `0 `0 `{~i`oLy>uoi\qK|}7Svu9G쯿c¾#>,jow{ՆݲL=mW2u_8دjo?kD߱mw>#}E:OۡO;y`$j q mkBTx흍8 FSHI!)$FRHnw HYx3ꇤsaaaaxIǏ'U{o_ھgW9 o'GW {>~Jlo߾)*/N\ϱov[iZ_ձaJΝ/:6O- 92b?Tlk%?_21B sY5>:>c=1Ow y^- ڶ,XzusM#גU]>H_yYv!ۉ_mi Rus]Xm_g)YY)m]y,m z1aaaxEߓGקo/Y\k6xjgH|yu.\aæM&wk#ϐ$?]Mo\Ⱦ,/ڥQ@~6s?)}, l gX #vQg Bٙ^uのuhm?}{].~}v_J;xogJY]޳@.)oqC?}>@Xߘ'-(W? źvƔOʙRv[K?[A}?-wmՑ}g\=c}M ggg DŽ-B^k_g?F? v0||؎=ǧHPgs/hؑI t~{n^}ZyD5XWvO)"c0vY Z|~_%/,p\ɹyΰZ/;/xs_9?Pܯ5ݻ\[y|č8gʱL{? 0 0 _k3>z_\S |<)b|7aaaxn.ta?l^Cvkؽ#~e)3<3^kdlc&jK+o"e<.ʞ`^(3zu l+6v<ï k7]/lc[`On}򚄫 G뎱zt^v2)?;Wmr5ocIz?Ozx{&!ez."ѯ 1Gg{+ҏlw<=}GݽFƨ^)zIpG K֜{{e G12ۭqiumf>.}~a? 0 0 [u+7Svq֭y΅ ?ނ}XwŶv?ߩDZۓ-q/?߳=<~#>Fk"qzrQo 9r,nY[;o:)@-`ק-7({߯S@µK9֠ɸ>:n3 _[_*mtcmC>qSL=<6;ǫsaaa{xˌ\ފpx?0׋#5zяc]x^l򼠕(f:~٣^lin59W~\;?vn6erUbS~v^U O7O(|;+SG4|?f*?rW~2oNٟS9~daևmH6mX[J~s.ym4ٶO|Bd/b5ɿyU? 0 0 0 0 0 0 0.P~*1@G\⟿KrKXs2(ߥ纎J8'>X@▼QQbqwx b)_K|v 1M6kee-2Ǜ59?K^E~9ϱQﱮYF8N?~;:=J<-tĒyNAgC \NXKs)'^Kg\~2}6}Գ)n]Or^j~"{p29w6/.z-v:+M{WJYZ굢`% Ҥl9ힶկ#OUz+U?;sd~vND7*.Y+v:ye;8}~|+ÑޅN9}{Bƞ#txխsXɿkSV/uJ=o G<ջL'L:D]6jfgLz/+ؽ[{rCMYq~[{yy czA;w9zszWHVax3 fmkBTPxڍm0aaAXAtNuө~"B~v(I$Ic i#Gl6p8޾s[ouv?Ru߯+fԍ^|}m43ϭu!Z9RUY׽B,z"|~>/|RתY̞EGߔ뙷L?:fV\꺯Pv#R>cNb=^Fz=yNI}.3?3̥*Ǫ7٧ڞƵ2~zWİg#g&2yK;wʞ2vm"Ggʼd~g<[şXlk=^k͞Gy\ׇ3M^&}V3=3ڣ<_(녾v9> G@Sǿ99Gy*"QYu*lz;{-/9v=Q_s>c),k:gQ%ԝ,SFwA2vWcWqlׯ[},g7F}.2˘ڳpD?r7 aYMi^j CCCoꪫ?$+O|Iٽ{e RLRÇf7^>0xU锝d( ׇasZ-*@;BF/D6M&˲l!Hr9'i@8( cccLMM }@hocnv3ٶk,TՊf)Q,I){BTUEuy?>g@#{5?+*V۶6MsS^/& 4|1JҊv\Te=XEQŸE|#u 8 J4\.GTbbbB!/Kҁy!C4@@BW0x" ͒Y~=b].W  |!^|Enx'k@H&2!?/q.7Msl ÈerB8A I$ ЇO @T@AP /˞MRi"[l!ϣ(J Qc(@藯J% ؎\\v;^bA2,`[maA:^j.]<0<.BiO2=;^s=- V2l[{i4 TU%TU%HJ~FϹlQU2 ]wu,J3Hٖekqw:Auce Q*Hg2gݳ.UU-+gYB*1HP./y.Kyy˕pmHH*ng4ތ[m۶L&f 144D&*,XU+lUUi4!HӱVy.$IĒl61M3Fyi/o} `dtF :*rou֍mΝ;"R8Z2P(088H?teK~*e2?W41MMcy> 躾3,,,`;}"a$,d4??C8@Cx4pF;7#|>0+3)Uy*{%t:ibѰvIH> LirvTjMy+?zq/EFˁ+.gJ&_~ؚ] ڙD3e:z% +2ɤiE>jĶmZVu]d xFcWmQ r Vm[ؖmc;6:]o5m>D0_ϩ+ng:p{!nB":C"y޹.>mcYN4 qX\\ZR*N1/4J/"7?og+~!q=H0;;zlذ]W|-Uպo @2+V u 뮻QQ@gBgQJHR!h49rh6rEOXĶmNR.xaUNk{o=gggt: %9Fdttm۶%G іc05Øp 㜺 Al*sss9r˲\BZ-ۇ1ٰa@E"۶s 1}$apw6 LWjޫ"+t3Lsqqe1K&l277'iTuͱgKTk5uN88Vm `llT2cǩ(纘Ici*gv"jl6˦MK"۶ٻw/\r1Ba #j6myBH9z9pXd"OIk D\1<<|@E8:18S)/msbV388Gv2B'NhW_MVcZ>o>&l#i0G.[E 'ON{hm~Ai$S+"ellJRB*>^m- CQx_ @kFAi8:@U<#C9rMӹHglLoࢋ.PV8zA*"zѰ?*F\|1SSS߷-[0uo`Ӧ/]ץ\^ѣ_nI)2ؽ^G{ebK_R62 A,į}F-;yv;BE!<2NUUx.R֭[GX$088@q) [+ysIqPCEQJF^͞^bbb/=L#~еm&OL 7Əq]w pUWX+Iݭ@dJ iE$b B !jys:Yc|}mw45M 9Vq@fe Ri] "Z_j|֐^bb=yQ,j`*ٶ<[%E0rY|?ɓ5.r2Lѣm;rY,˦jc6 k RTӪ 7_Q=t jQ6{A8AzWVc1p]@t}ZŀjlX(tL6>F9,bMv7 T]?O^-Lyt|.GP,YXXl. )JH? F+jw<{4kW|bjjl4h6[hmmaJeE;<̺u|vC-AP.ޱ=`~nNCѣi,]teQq]'v n+PVy饽 Ş@A2i ^.#$9H /}kǟyyjN CoB,KF3&(g50d2i5 #u#O\]۶NAes/CF8CH_H&IӜfll]yH$t&6nD( PfݺuCOl61- MyG K.d*I\ƶ$l\.8EQh4޽no:>5F?᷽}G"n^| &xx#pAtx(\\^B$ʺ!TR8Kyf1vn=].GhrW044ݻm#0,]4ӌʌidrsd޽0j7Z-i~B])jt8>-b4]'X۫s]K,Ve `˖-lݺ2ǎhĥ[mz.zEU}sI%9RTP!駟attp !Q^"d'? A8Hś?Li(`ǑLcU[vyc}Vo?~o \o|.aqJᅒ^Z8 sFͣGrO"=QRICGs&!D_> oph틇Ζ\myZST =X Ͱd=KUUǡSy^̦"dm{EfGa``u|>.h;vI 6ZzNզG6Pk gfzmd20s('0ĚXƶU7v0m >}#PY &Ga([n:AГj =baa!|"#Fjaqq=zTR!AI&_ iazzjBVC_n 6`Z/<?8fDBD)D7!ͲmVd2mZe^->餖U y4 QX'| T`B]R~?ͮc3/nrtfUBQ,,NiZaYvL/,`Y\۶EUFu Ep"dY N188HyK{zZ1>n?n!%NL<>ޗ,)Ш?ozIԪUJ&O.,#|wK{RK4 ?2x-R:+PR;FJ8B+P0j`9Š]|EQ'JẲ'aa'N`&Kzku;t1[neuGᔪ4 &6MdٰaϿ Du<^z)dju\!_(X2AP(ذae,l WOh7WLNqHB+@):QvU|gw>m݊eY,V*XQZrZxllz>RPm9{htCϲt8^!3Ph*m_*EBQBUۊL,..bIN$I@t%0 jJVk&.)(/,],,̓0 ٺm+ <쳜<9LLlbllq àjj*jAwɳ>kf˖-EΟbae$)J1CB ޽;4$?kO ,VB䀄5"63 7xpnb7؁ @ wB!&TUe'elby\.Gرci<וմ纔j#i׼aYg(:v8Z ?mHL8Aզnr\v?p!n~Tt&a$(rWB= ia]Ivmҗ=K'АFBℸsF;oLرcj5ҙ, NcC1MSAQ'InGLziʰS5t\"r?N__?~L6e1i63w}g~$i$BHz8;\}D QU59?|"t= 9zTGK"@.A]Ѯb$6\e\sjd`lt$Ѿbɂ u,fSveBL&,t:M4Yذavždݺu,(cd3%+-iqN< DңU̇f&E5|KGTBCB{v犧Cҽ%5؎CВuxx!d}qV $68݄-HtaQJ%c6Lb۲<d89}M7rJٰa=Gx7S,^1wC gY~~/s-FGɤX2yǭSd!| >n<DzF>Fq2ellBu$%uFJVG:/̳HшSdBe7s,Kf'O2==;y"ϓf_1w:饅EرcU,Z5" 㻞+~vc*pPp?(Dj:Lz0B:%GhTMb8.cKox{{#cʻUv V+I?PIeq'fgiZV@Uyfbbɤ?hQiGWFAb*Nm;~k9YF'8PEUq4ZHF,ȕ'xvt:mjJJ*V*TUf/f3:2`8+LӤV177iNNOX^ja$~팎φbvM#|`Ϟ=/BrZxhh(jc)-*K>;:30/D"JJ,  ~ m@4LahtDUE BLSRQH"@4Pp]/LzK@\,+ehZj- ?ea%qb͛xf\b\aEK q+&ha0H&/۟zꩽÈB U/-8h{?ߟyO{䎫6 pY:Ia/쒑./;֥k* ['1255v9|(ϳY~~lټQy:߲=3i.ޱU2-78QHFidwؐn7Jo^cfI ]("+:܏KF D؞%ĎR>d!BBl&s2hZy>(dsy'`6Fjя~bw4MMkQsk-+U !Og%_7!RK> 4v>//!+ ۀsyj$ l.W JKG\9Rg}=.Z%\-FGQb>+  l5yn~]vx.Jc#{qNtG.5g$BCw?zů[`!GR8"#@r P"dGGGr3}Wj `vvizHI\2;;K6ݿc``6}5a/-:LJ#{!p4|tk c7:3+73KyfI&+SSSsh4x9B޶) tL9ARɤ!ydr/l6i<ȣl߾5e%ZxDm]JhY0EA `iL-w9}`!|J*UQPqK)j4xi 8vy',o{VE^n.VS9|'VؖeT5~;v+/3~7x5gn%UB" =*؆{$#W2@hI~ǧrxy$P,xl ˼_pn=z{UzO?i,.V8yR&Tk(,YT,a"3L}iWJ™L:1.NeP"|\ | HF`E ?ݰ#??O.>X{ҹPp!{'`mp q_VXl:.;x W?/!8~8O=4ׯ[nqT*qNBSU |R䓎*KfGɵZFA\l266(3ϐN0M36+ׯm]2T(o"k~2\U$;ŕbWy>wvq#$(芬rZwʐ_>|7ojPfqqN  s(Huts{$uoS.0?m E֍sqKDk%i၁,{zG̻ W~)|\ X-RЃ_F T MASZ>% .Mj4|[ĉl޴Z,rs)~:FFF(qMboaԣ;`X,22:F,Ynٲy3j_ç5Q[F !~I{}!H寸4ơD^ w#Dw" !E) MeʒM^ti`[% \.0 24juE0qQjyENe0::J__ M==3ÁȤ3$:eϽm<d||<:j&Eԁ {NN$i =.ʙ^/j__J])H Hh ]#P+^@iOF#U oEʟD6y>爊Ew95 % M( jp@^wNp482¸]\Im\f,.tlv/2۷9޺nA*,!?LؤTAJS0d|k7XaqgZu-!ui~@0D-N"].x>_Y044֭[d\ޯ~{/_=KD ¿y{8vۿGx Ӿ29t 9suBZWHR?9}{B.c``FɉS1_ *m[ MHe!I4)r$6WNf^JF07s-J'Xj5,"J]d He/ K J=VUbaaO~?jZ)MW DGXՈk6r X=&'O5RϽأIJcY A 7p=4-fggcj.<أ~r]wq7z=\BnG^;@5v#Nm: UF0JǨ_aX*(ؿ333[?L^i68@ )ib,V*o&`e&dfflt}]w] aߪG˹ϽM{~\&.j<LNV}z4i qqZ`6'&8|ǎG踷,+\5 49r0wǎY$_7G>Qo׽Χy;m 6P92؞ ";W,SO=0W\q|81ٰaC|Fr&a``!:X:/󩃎ȡ~=oӯkt9?(nGJdVd FCe~~qQ8Myq1Fssdinݺ|$4M IPxq.R9?|W?Ħ *NNO3}rT*gxD14` nd) 1>>%8˛FV- [?j븩ی,cNJZ4=[⫕JXUahh(,[D8D}T:MyLCCk2rԬcsǏ)28t0?+y|yi?BL8ž>r,b1aBF4qy@襈Ɵ+oClW!Ii7/#%ƇB(DLYTMU2ǾCe:KL&[n]x=\{5!D" 2CC9rVő#G9|0'-A6''J%Q(Z$;nXXZlrzW׾~}2")svz[{7m6ҙ #755EP rsԕdF<yak| ~fgg #kwsesWẮ^j 322*K|{믿~駟 U΁ 駟>%܄eEm}/r99::Ro$w 7oGNBAtMQ5}AN#W,fyǙ^+$R GAe^ΝrUWH؎C_R_ /9m_VuiB.Ç&.zCaفSh6fMӘaaadxD$șS ӢA=sDQr#a$V ؿ?Ϡkη5?ud z"A!T*L&Z`=@ztt~yt58e@VcoX qG:roA oh&˻?O`qq1,UѶmk-R[o}3CCC\r%ev~zBm lRĆ s9(apX^= _{e =AdUQuyq1H >Q4g2eY48{(#ߣPް+}uXM&hR*q7355EX`ppё+ y21Ufͣg ЃzX<%z+-[Vxk-QgMyiַK_ 7\<۶mX,022J*|'l 6eYDШX)"(#FeZ4D##sʠH^+XYXX`bb=}xBJ6]魋8RhAd4f itBV.P(Sh;v{\ 6t]DzmDx^@T|\ ux[g۶m GO,Wt<'wB"6lXq,rT X?%OV8aB`gÚE"C6W\~mNPdÆ rS#G/r{]J~=?*mT« |@MJZfrPL4<T*:tjh4ڻw~GyY2+:Rl\fxëO<puv޷o_~'8zg9}uF=Sz/Vg?k OY,}Y[ήct/,ıwt iO|dRܫޕk]Jʎݫ^p]AxqD%@0?{oV `@0VX J6/FfzzrLIJ,t]ǭoۍ}٢{4[v-zrc8 _IqB}XW5ˀkl6l6{^@x|P̶j5Z,.M&7[;|}Wg9Rw4Q5:7:9?o 4?սYK=q-,,rg{W|^4MyTp۶%iTku>7.Ᵹ?xfnE{u"EFn wt"/_uAB){%YK A0SVW.V[IJO(z޼V5۶1$25=s/)Ѱ\މL -rˮF-WG<]XXx8 bєprlYț/ɌAě|9jZY3ku:i6h h*U&@>staΧ|9Ң*lhG{}t]pVyWw}2/q7[!xsh6qlš0_K=PMh@WUr&_jt߶Z;f֡KFnIW*AxukJ$ _\9{uש\6<0*oG,={G^gffr,R|D"Qƹ)"P,xhz=fU\o1}. d*P CSH&x@o}t]}OV}p) aWJJV_5bz"zLwspr$)Mqi9]TB5҆TLpWynIwvYtc^7CW#@;\zN}ɤ=77Wۿ//f&&e|N .i'uLi#AI L&Q}|}, "fY{]~d1@(o+ҜwsId4F#]s띷 dRI|Ut( #aL褍NH6L:x`_S?붣b{7IYS(  "4 $*eҁԭ?۲#K=HkI.[FtB#cf厃ߨT3Ǐ9]e<'H^ Ѐ4r 0qWD@T'{>1_SxZ'1iC#HR8O(KW}EwQ O^ԑJv7? dcHL^3>6N' t$:)M!а]=5,ǣ=}ħXZ'E]ɺH#Y4C5 fOՃ86PԶ􃦣(&KǏWz(DS +@,J-:VP1 SaBγx7ΨH8M 켽}grQ,䰆k[o =x_lM hC~s6O-$SJq :Lf oBe{5{}iE&y}'eצV$11?A^\?Ъ⭽I^$ߠ/(&10 sxzyа 9 DvNI^$ T|v2ꘁ!AL3wrϨ W`Ƅ}~v"[Ko":.PÇwz}F=8qaKbUqA?˩dґèK. z L"#>g ,VIENDB`contextfree-3.0.5+dfsg1.orig/src-win/icons/newbusy.png0000644000175000017500000006703312076364074021351 0ustar brambramPNG  IHDR szzsBIT|d pHYs  ~tEXtCreation Time06/12/05 tEXtSoftwareMacromedia Fireworks MX*$prVWxA @Q'5Y^n>*KYzﭵpw&S3{׍ߟov?{_->=3pĶ5:z/?ӝ$?v/cg-\t>FS ?HmkBF)3mkTSx]sFL&dfk~QVmeEI1)qJƑ}{ݸILܢ~Gށ}ݼ[zؘqͻ]biԽ[P;[Ԡt kB'3zݢك_ByVi*CF+c O ꏠZ(JZo p cx|aznwBCIn∾5;xM M:ݤo>'c9`e]+8K/H+P7QdU#ؗ dΔUdV$V+%ݐ+\F%)'^aMIIYE,N#Bm2r=\nj582 0.GPqf座TQ%O8K 6|<-@MPlhu}4.8CEy׋9>̕w@PWpDT8|ƗfF@M5׈F,12f6\&g mRً6apƌ5>5q %1dzb#W rqUF8kMNPq&璽,`IT] }hRT^X(B9?$&Z/X,_/QZd6I@{r M }2|_ ^lj Wi3 9ouk؂Y/=[͇R|̷h %2y\AfDP`?@>1q}:e3u)p}2L%BI%Ksum,^ll7qFlTÒAG2^~^3F0d)XTyY;#os++Ep{KlbhWhη*?ĦM\oUyc205Hd5dыqDM9< {2KsגVګQ2ӏB4|-6psΫGS庈^afMv"tO'G~{qNBǏJ*ݥ5* +:لYN@p813|V @EBGW9zδwz3S!qfK/tJ?sO1?,5Ԣo! &z6çג-Y%Ac fP 8{ܸ !8Ml\C2#E02oc]\'F^rׂ} XSpy>R>>pOјlL#e,Xss/ |%7Epj/SKXqpBB.iI\9~ ջKLC2$w1UDBͽPHr]f_qsߑse= IS^BxLj6+YY7 Њ$BA=P{ _:|leA  |WH$/Tf@wƺ=!lqyxⲲ|stdh.XNt"7vu|Q= ,HRw9)ba-yyl2aI1Y*^;şT8'.t'IX(F> OYH-m}cJlYљ H8R%g5`Q?:H`}DsHW EJf#v# u$fl_ G ls׍8Fjn&Z#8[fHbFyxx9aA߇"h\+NȌER 2q$)U#pY{}}a,+\t΅a1ekU@c;D2!aّ'8+8q{U&h+L/!R3EBnEW)۪΀ Wd>{pJ-ZfEl#n%şr!qH0d&=ib4 wj? {,Qti{H]5y8Æ]GQ4p 02}UeS7VIɡiFNx-E)R"o/:U<%0|=6sJܻ~,5ēDTM5.azhr̴f1SRGl=J[iwArwnbda3HFww9^OI.şB)[Θ!U|<k ;L8UxWtx.i$ܠ8)? n(h9p_laQL\qJz,/f3& '=XވI;=z^Ӻ[SgByK;!u3(霳pmxی)eߢS}v2h m$|@Ҙ;ϰj?٧7؃Z*x&oOqa%UoŸ(sQ N",L)2"{EGG 2~+LvLhm9Km6]My9%p@1޲D[ ̐·tC8K:9@,,)*b#sxןWSMđI_aYJ}519RLe?,>I:,jBK!\Mrܕ\L&P3YME5\E:UNr@kM .UNpWpݨ^`SO Y#c`^pOIdSm7O5ķ&{IɷEˊG<>%^SC^΅bh[i]ir_n.uuhLlB?bU ria~-`"#{n-ڑSb138 =i@] ZTXtf ~kЂ߼ب;!@GE8rO,ŭQg٦B"kj%\sZpY8(~}ʜj_1~EW+ҋnSG_ZFO$i f9(߁|T4G /"gvi-c;4*tGLϯVwkN|5U0Y~W#C <"Pa=<>phJjJIWFf.V\. )V9-fLnIRݦjpT ׵x'~I S2\0]_@'?Ҋ('5>ʓF0 :pt~Ck N"D{GhC"Dh2B+hѦhK8@%:?:[%:Kt.p<\s%B7B%BK.Bf9-11[-1[bv :%B;BX+Z"׌ U$:o:˝wj* -wI]Ɲw;8w;8w; y'1{;0[-1W켓 -wI"t B3xo"Cmh=|+&|&ПbQw8vu>%!6DMӹZ%i=_vcRV;"ܪ|uf ٟSZk[#o3gl1oش'*w=QMXM!BGB/G-%BK"OI&FIqbC$n{{o{X/:q#*Q:<u!lQ̇xT[@|wE4M=4@>|Žj1ZX6_e%W-{I׽0 ؎Dnjm`,\ޠMh/h@g:i(g/Ԭ G_澲/4uAwrSF~Vܟ_GZB !mE/>#~bZAꧩ~uUũO)QDǩ.wAӼ4W&yF|ȉ"=qcy1HHa/yv"ƯK߳nd<#=qB#·kY3#&h y zpDAtȽ1){0,9u؎}'E߂}5KFe'[@NR"$y ޑV [I1Zo9 = }{:ݲX-xK}ba}> -Z}۱)D^9"Z^A٬Ϥ%8z}hu^ϷR.Y(Zޚ>+>йzܔ9R\-ԸDb?8N6~'W^̄d&L$+2+!2+Yoi8:mgQ'AW@gFjH<Ҥ݋QtC oF*+~톨1#؊QIoN&SSpO>^yo_R .yyUYn[$z7Cgt_t7z|q5ōB>9+پվ&3sl(#M"okv<-/1kaք1\&JZus\] p7N-wS^}:՛ %e-?۟5>dH28"}8"lz'QX(P]wp8]UԿ[h=/ĪF^6%vbW{:1yKӸ[4_ҳ~žpF݇BZ.kl>tjb6kǾ5{nъ] -hm{POkiΡEpf;g7[8f;_Sk@Nۅ BCIn#*lbwpЦnO'u{Ф}A?V7^;d#JβW7!Πo"5gK56&ƱtFj[tJڎͻ?!ͯ@ ^-~]rཱྀT88[O860A?~̿Y ufLugKg-?C5?ć_k~MM?~Tr ~_!Ιch=ySQ(+AQ \T$!F3k˪J"D3U|6˩)oI_/}K_[MĚ[y!7K_/}K_|yw~yŧR[~_8gc_H=lzj"s+H}Vp)O˾G}ŏ.3}`w?MbiG,=OW0^jƪM,رZ9t7h@kh0|.Jz%wцsmۂ.;++1U2V>s2(AbaǮ21L/})WJlkY=ڊF~=0ӏϝ/hA;"1uQ){'4)tEoQ{x']nPTXB (x>Q*5h%'=Av* {Ni\GV0לjc:1[t77U^ڃ ~gIP5\jt\|":s{pUH'jUu*4iRJK5M(ul`$ln_8!A pppH5>Uy0]e|oDb8& Jfd5pXfXXM%JXkj,:uZµkI)B&-Y>\yنytc u/$р_ ݈vvvͅUJ@4ZaE6HxV:F6Q>KSy.&{<}Ad:KN?2 n37,OMEN#HF`?- j!j {r+%Aqh $S@%%|9`ƅ}6.?jU 7KBC_{-׮8`Se[ lhF-*,?nt WTe\ÚMOsf^|ŝ}Em ;GFn^Kb[dAݜҥy_g:=h5=#*|3z¡F#$̣[^Y EO)ـ~Iȑ8  Ľ&C}24 L >bXXFkhFWI. -h-yU`F m<}hRvTf}|dT@OP\I' 0%U-b2֓yxd^ƣcAēwP)Xͣ KZQX!+}~CX@- >9Fwx+$@>,#Xٵ1vQ5%tᑄJ#5̖3S=R e[OjRgfM߉ZpE9%辴tc⏥R1. p8Ywh;w@^tug.XHT^?2!+tU#_:{*!nygn:@ Zgpwp٧P栢=ԇ|Utl7~䙔@0 +h%\'̊!Lu`tp/߹÷0!:lH- gA ^Z1KO_<*•G}|;n'e}*#(4hB9Th玡NŶ@%fĠpo9,vrdԬ,qcD-7= 7V >v`f1B+?`ؕ?ջ+yKV"o6TpŚUk}"bɍ7!H*3(Tu|jGyŪEe18-BYYdf[L>='4"}\x乢2EOcvxV|MڡBs%ȧԜ?U$g{075պ[=h`Iu7ޡ1t(f\%}R@uPA(@0Mz>n /:{7l6u]~m'3u/OOX-?Jk3pMNVnuS>q$t>NSgِ,yfzkf6{4!ڵ Y̳X?%ţG|j}~H)'FCy6)$.[xgߍJ<MC+QgPX 7~PT֜~5=4WaH]0/qJ!Ѧ?q?+kpB7ޠ">G}W=\&fH0e kƲ]N0Gg45*O xFD ~Pv_u9%|?vǾal*.p,S?5jPt~ۢ4$FMm3\9\fVdٿIuKk+s]h?:iĺ-^pYljkeA ֣;$3~:LH Ip#W,%ebbad{O`eE}9!mB ,ƈyAUkb]Nø ˌD_ˁj5j%u^׸ `O g9cE @=BHMlk@$ ءۖ#iBOOA\zXCR%ˆ6 _loNVL?7\iB#~_l5zq#wRf|{jSKlcԁt*=LfLQJ_Ke[LE(EU0"R4hbR |;i@fT,}X?GBP7A#Hk2dwըU¢ {3eKxŨ!tϼѝ;ZهMK+2S:¾m:ʋT,شt|H>(;:HfT+_oG=3fLál,0K@I rHmD-Kɵ""7@8bRz=Dmc CF_ŀT-DM2_=Wl@F䴦"%b||+h Un+z`Dv~_ClO$>Y Bcyg |rp]o:8khۘM埁/W^ֆE^ls wfY~(cUSM6:-=j0y-AgЀNN2g$>+y| GA]cپ6m n5v{y4y:l<5y7/CBqP!L||R۝I׷Iw|X\Zꑽܳuu}1c%(Hh!!&>{Ny! BC~{ Uz-b i>hTN./hY}_sPp͠ '.D1bԿoK'mCn0H]_ _&kdx3{G!~KdlfPej9dm5Zq[nJ;#:u|CC-y Oo!N獼7;tYW[kcd [@P {q7wΎd'>{*QVؿMAN: Zl]ѓ䯹c[}: pz$1 U(rtH):=)_]2{xlu:0'Y0v~p %Nj #o^'X՜T¯-d'dT{voƧ߇&9ގlOz|lxq!leP>ޓ 4lBޞ}yơ$9Eg/>_Y\j*SCş9Pdo/g_J7wG`fע4>*04yWĉ &oD93mϻL}5Čގv$OEA0h61s_ qhL`Iw^%M2g 0=f_v fM7R;IEJQ04Ys N[4HWR99s_;o@O7 @s21FQyhm`:o_ π7:zAE^,έx!{>!7r#{77;"{&/0WßﳠA[yυmk}ݲC,NZ M9@`CtD"<p& ^K_J}GR}/ +-khO.ЙZ"W 83;&_ EKًH|!GCVyhKj-үP~Z̚lpyN7;aACNh }p*}FZM8oMGeh ŕW&;0ܕ +$Dz sD %0x/{gݷB#cpD˵#e"K/) !Y#̓Dlg4b>EM3T (9&p~-'GɑlY[?E.`ހM Evn4s<{nҟ4z3ƿM(p4x։m |&x%Z@({~N1qy8FPjDo6SXyhr :JgǾfN&b7Ԋ{dK<ڜw#sںN}xU~Mf_ 244yYhtvш̪>Qc8{Y oߛ|u߄6W(-ߺȍ# n֚MPj] Mp# y}XK sSU>q݁(yug5s3q !{;ߓ"4dG _4>7IH4(.#B ؜cz (#}%şnMC- }|[ϸ%6Pe>4RQoZ ]r;^@UofJ_nnaL3RlP?yרfchRr$R΄"rKG,-cJ铞\ੂJq{} y+wܥMYaq$xH{h2؂H!XG-Cz+Ng÷M#Y#dnrjE!ٯ.Th";vv ׏I42'ZJFBѳ$.2n;ӹtw=xt劉f>W:m+zl<Q CsBL@G1RB9zBG/u9߱\!p"Mj} ӆr)nST&t`&YfpKOm5oI~6;6h'!aG^drE% v <R1%/LPskK\wIΌ\ӀxI7Jb(i(H<'ߟ-Ԥ)ycNŚ:V J>̛jATg /d^YOCrG:ic;CʀW4' hJ7_sQL3!Mۯ6Ky{⼲q 7x˼`[(sk349bx7|q T zըH?-m䙄3ΐ{K@lg)ݺ@ RtiMd\zK.(\rZȞqp~M`d6 /wOd`.HyEϼ zd&<ʉdd9}hR^օ=W"3D_=,!l,ŏq?E?BІ^^c] J*סIq+\bjō 0}6?t6Gл̂:?s%V/Df= ~4_ M=? uA? L`R.[ B:RZ^A)D(ϼRSJu!lꟆ&/Λ cM}[cXaDe(_Lz"oHqcTxwt]8a S!BɄL}XJ" Y[8—>;r xDv؅7Q/b .=_U$?&Y ]X>e F€"UE,hi#z@7Hzc/x27m0"f\0Ѓ>#au Mb5s$Tvb18#{c4+Ώѭ _'2Eeoߟe-2$i%  MrNMAN.9$Dayj~\l;]?B~^Ng~5/Bmu%hk^BiJʵ+w @F!M*yg_8,|:ֆmWàc 3FGu~2'uF=!"ct8/ZԸruڐGtXCg5ZbKZbb[^V ٤)E=+!KΔ\C50!xV~&,~"1>ύ^/kdCmBb4 rQ"x D!W'ܻ}QΏy"Bx|31H.Ͷ2!qb̬?M!?q9><-lW]M}m5NgO4Z{m݅o #CÇM] 2h2_AG@nn*I J<&ߟ Jk`:1Ϩ#{D+B2y\i1^_E1lAbBAnE FX0>>H1'H$K[~ l5n}*jV9/@>RL.$?m>EN$D'~.%8yFc`}{C;+@03Ft̋g; $O)O:f |"""yAБlDk#/{φ7$Ő; Žz ,^rp"~}5C|pKAyɼ"7zq%{SJ{.̥܅ؔNICC!nVzСÒ+e1f(G -/3h)I=қUbPxF?M;YͶTj^zWyr>&5zRnqO÷ My}vP/vFZ4Z#GqES:/]`<{f#y3lfT9FG Oy6uB%|@uf~3˙@}XSwx$"Q}S!T AHP!.Eev_\κ7+miy4qv0‰jdž?+o^+-Y>VH?uhR?wX[ЦKZ$'͡WF E c[`P[Џ q\_]R +zZQ>3jQÉ(cF̬BYB-yFvrQYc? PCt8|];_ svXV +P٭o)1[H>fo]HL@c9w ttW#0*-ZDx}n;,^y{Rn] *j^D;b0 7 63&7*}QxoɶR^dte3a(ԍʛ?ߚW♰\#zz>% T,ȦRkYp\V$PUઐuAXcg{ .uU69WDԶ,|=?_xb}N@;|P%})A?zR!@@P?t@Jy1P{mS̔eYZ^w^1*| ֊9L'd !P'hKh70b:lf'bYykxDm1mx*|u'8B@(čbJJc~0y7ŏz #9{khA׿Y&Y7NU6S@cFLRz}n@*&d^O?bF4k@~O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?YMw5mkBTNxQn ;eٚh=o۶*oW}/bL[LֱF:'U4 MGct.迨_\CGGϣ$as;OyȬtN述7_Da[\)͛PoyMњ]O=nӵw;iP6z(myǯC&;=wϩ^1;؉1]΀p7?Z9᤟#qmkBTxx흍) q ĉ8D^>׻gI@XjjgiЃ`0 `0 ?ϟ|:seQ3|ӧO|:2|.};7eGFO6_Qv]T]^ˮg{>pjzkuo{yye?{-x/ D:3D&򈼹e^Hyi#/OGzϪ߯_~ :sMe#M3Y#=2 QЙ[\s=E8}E>GȩT ڲTg-}VfoSVwzV}./>~!?U1<#}=F[ ~QڋBN..+푹^edLo+[\-k dW(}6q$#?z6Bөi?L7!3O_Q}Пuo[=tkȋM!'}/Ƈdr2_Cﲨ: `0 :8o=+8-4}۞cĥXdq{bUq©ήm!ƶg*ΪU\z[GA=^+ru{LV U?)V>ғ)x|Yҁgi\yi^cUo*= !TY?rfgWsʽVn*VX#=Fϫ+[F~yH\L~[O҇h5ݵTow|Sfӟ+);F;:x )/OS yUo2e)Ve3'wgGg=J^`0  ľu kU,Ksؑ5nY,bXw{ w&3QהNQev ]ƷgcH˞i{A3I8hwduwUIWq8I>+@pQşGcZ\ƪUߝ]/:3d;ɫ:gB9R|GW~w2;fzt|+i5nΟgZY|<1NyŬ|E7k?z/k><=Α}N΅>uWydʬdz `0 *\?W8GY:Dgcg< 2+'W6qn؟{ru"wU쏘~c#T?+y{Q,,^qF/Xv8.֩g3}ȸOP ~n%hUG4(_sn|W}Tg&x^c,Fѭ+ <#+}/Uw8BRh_|33!mr\7U9m({ѝpvew[xG]߱?g;,nҽow8]וb?OV=Z_#ve?vN_WrYLo;1g9pV^G~>[_vNOS3 `0Q[ veO\k^8֔v<Zbz\Opbn$~}oz3ј mK vU]^iNWA#x딫jt q :E= z%օq)CcYEqyRG-+u (K\hP'*^ء^q=m=y|Kvūe\rȊ4={W1;=ݷxp;o@>ȘT\Ԏ+C=*ɫ|GJOCW]x1.ﵠ9_Eб Vq)v(ʑ}[GwǺ{-oSdו_˞׃2;iT&w*w:g׭SOsj%Z[~_˯d֮+w]7 `0]kIu+eL]ւoA^;=GR?v쯱;<y o$N1紈=:ߥPVu< <&3KyC/4r)i=*/|Ύ^]QNН1qGw>ù{ ?Kv:A}E:_n+{u=rq͓̳]>>d}+|L01`0 leg:׺񶊝`W,3O?]\9P~[kOWiGc~)-<w.3q}'vuw$Vnv(r52S;Wk_Kϔ8B/hEՠ'9w?K;x:x<|@cϽVyc@ۖSw8Bq]=2lBe6V}eR( VeZT4ade2ޒ+nYBTqSߔ<[&=f[|szP)G}{Zׅ3n7jpWwftEw[ǽ;`l? `0 `0 `{~i`oLy>uoi\qK|}7Svu9G쯿c¾#>,jow{ՆݲL=mW2u_8دjo?kD߱mw>#}E:OۡO;y`$jS: mkBT.x흍8 FSHI!)$FRHnw HYx3ꇤsaaaaxIǏ'U{o_ھgW9 o'GW {>~Jlo߾)*/N\ϱov[iZ_ձaJΝ/:6O- 92b?Tlk%?_21B sY5>:>c=1Ow y^- ڶ,XzusM#גU]>H_yYv!ۉ_mi Rus]Xm_g)YY)m]y,m z1aaaxEߓGקo/Y\k6xjgH|yu.\aæM&wk#ϐ$?]Mo\Ⱦ,/ڥQ@~6s?)}, l gX #vQg Bٙ^uのuhm?}{].~}v_J;xogJY]޳@.)oqC?}>@Xߘ'-(W? źvƔOʙRv[K?[A}?-wmՑ}g\=c}M ggg DŽ-B^k_g?F? v0||؎=ǧHPgs/hؑI t~{n^}ZyD5XWvO)"c0vY Z|~_%/,p\ɹyΰZ/;/xs_9?Pܯ5ݻ\[y|č8gʱL{? 0 0 _k3>z_\S |<)b|7aaaxn.ta?l^Cvkؽ#~e)3<3^kdlc&jK+o"e<.ʞ`^(3zu l+6v<ï k7]/lc[`On}򚄫 G뎱zt^v2)?;Wmr5ocIz?Ozx{&!ez."ѯ 1Gg{+ҏlw<=}GݽFƨ^)zIpG K֜{{e G12ۭqiumf>.}~a? 0 0 [u+7Svq֭y΅ ?ނ}XwŶv?ߩDZۓ-q/?߳=<~#>Fk"qzrQo 9r,nY[;o:)@-`ק-7({߯S@µK9֠ɸ>:n3 _[_*mtcmC>qSL=<6;ǫsaaa{xˌ\ފpx?0׋#5zяc]x^l򼠕(f:~٣^lin59W~\;?vn6erUbS~v^U O7O(|;+SG4|?f*?rW~2oNٟS9~daևmH6mX[J~s.ym4ٶO|Bd/b5ɿyU? 0 0 0 0 0 0 0.P~*1@G\⟿KrKXs2(ߥ纎J8'>X@▼QQbqwx b)_K|v 1M6kee-2Ǜ59?K^E~9ϱQﱮYF8N?~;:=J<-tĒyNAgC \NXKs)'^Kg\~2}6}Գ)n]Or^j~"{p29w6/.z-v:+M{WJYZ굢`% Ҥl9ힶկ#OUz+U?;sd~vND7*.Y+v:ye;8}~|+ÑޅN9}{Bƞ#txխsXɿkSV/uJ=o G<ջL'L:D]6jfgLz/+ؽ[{rCMYq~[{yy czA;w9zszWHVax3 @fmkBTPxڍm0aaAXAtNuө~"B~v(I$Ic i#Gl6p8޾s[ouv?Ru߯+fԍ^|}m43ϭu!Z9RUY׽B,z"|~>/|RתY̞EGߔ뙷L?:fV\꺯Pv#R>cNb=^Fz=yNI}.3?3̥*Ǫ7٧ڞƵ2~zWİg#g&2yK;wʞ2vm"Ggʼd~g<[şXlk=^k͞Gy\ׇ3M^&}V3=3ڣ<_(녾v9> G@Sǿ99Gy*"QYu*lz;{-/9v=Q_s>c),k:gQ%ԝ,SFwA2vWcWqlׯ[},g7F}.2˘ڳOvq8>gn6^Nd3l" K$q+QUIгKNy]ig0L0<Nx̯΅IENDB`contextfree-3.0.5+dfsg1.orig/src-win/icons/doc-design16.png0000644000175000017500000006437112076364074022042 0ustar brambramPNG  IHDRasBIT|d pHYs  ~tEXtCreation Time05/10/05 tEXtSoftwareMacromedia Fireworks MX*$wprVWxӻ1 @AБ{r| :0çD^ =bm9轷HPr>ޏ~ ]d<_z8IGgy yHmkBF)3mkTSx][sƒ$%d+/ڧ (J)!(^\-y%Y=` dbHĠozZ7No67Ofss\ewϛWxq憳8<Pwy\ݳT,zͼՃ?{FiSfڇ1lC9/P;+>,ricja#[$(pr"Cu!.l=b`CӢO>'ۛ͛΢5`vrNJ]lBI)hp>GjWP3Y%-!0!x!.@ WFնLoz[LiLaLo]Eo]]!ېw뾞gNC8Ze?R j}Aݵ64)HH2HfC L K \l2| }PFLsxrx%Rj RFO$jFg87ɥ o͘KW[oѷg]P(Ի]Q[*?*X ~qsCHfDu,.۰2,A!1V"?323hrdQ"vlsl>P@6}_8>[EvćQSf@C΀xYwɐHd3Kr|z0KDu!1ëbZ6S :x5&$5jM=eBjG43Mh.+T4k(Zk]~3f(\4-H(CoV0yBgE9/^}\->crj+!># Ox7|o.O8,6PA0\_")0 Nsܞ /݂w/67 %,XFXik4SHCt fQDaɀ`dXxLO#B~L|),9TZf[d#<yrH@QF^iadPF-6Æ̧!::AGb&"CGx5B5ʡbf8><(E3η"l:IPıẕjc~4.Ul=UzfN6q;1(cvcLR KيYnpX:73bm "a#ƴ:bdr܌b*DWX"JT꧒1L(aeȀyJӧג%Ȓq \ AySx Lan܅)8F6h2jUfCqB:5<~py>R>?w1 Ak%713' )dl&Q"NN`JYH?m M`aj 4NNHY!CGq w S&VczISn%{C!UF1b) B>Cs9B0I_8b/hHM…r<799!;j?8q,AGcV9N( rNCՑT{ 鴝b%O=jVv 3(JLř*@OG *OM/ý(皇d܆#Cİ-GdXGj# 6]W^y<@I{b5hUDgI FVF#~S=Z"BCݚ  |C) en!DdղleSi>ȥӑ d[]v3wl|[)"9V1L,>G̾ IXwD(Qp<h&3cy`= <Q4"jh)8ʃiƤ0_SR9o32>@iJ &>p|F>+354,'eUynQOn,c%Gg̔u(=]PH7,Ԑn™m:3搘nr&D{柅QM,XSz%KĴE'xW y.㹟Ӑdcic!|E ;/>!UA Q%=ي fڈQwD2px#E۾w<yO-`,xسeל)\q0;lv}2NMs4)v1{yq*1_0D:A=z={QKE[\X (y "]ͻovދvr]fU]V.s Q |KNΒՔ*=֒-BIdO֜֔kYMy%tP1C/i<њrV:8ҋf0g)u]uSn#cy|?K9_U7!2 #<r\75n*Mx7V>EGcdW^QU'{[rx`guи"Lqt|Dbֈq`XS&Ug\/h#4g)uӴ2^A;˨+e^EÙj#M}(APr3l;m3d> .2.KCpU6c`T#36W;T0K15\. GϥAk؈niOi.V*>Ϫ0%*5red{;~'X9%h)cZ:_ ~Ͻ3}ͣ&d e{RKqeDALHksZj̀_]3_x gMKp5:tePn:j $izȕ/]klQG٦BM0d-]a,{.^ҦG5oi4|NrWD-&9J{z[gE!mqU(0r}M| ZRӜ^x6}]|H{#fR=n9>_)IB~ oM,TE~;<;|$kDZt酩 i!\n.X !<ݓ-=1F9Z#׮idyש_yjV )k$C; Sr7Nvٗ\| vןWSDw'¹Dyk{o+V1tC+0v5芣+8@O/4Ttwv;W\ y8*کb芡G.>$v=?VN*ή89۬8슳 Dήb;ghk+kfh%;7w;9۰׷bM`j]C0׸Mj]Gq|;*vvvU\s׳bM`j]C0tj]gwCoCW;*:d6\{CƛUe![Swk,XmǤYGe_%pC4gh `|{ډJQWDWl?˳Fa[h [cnmQ#Fa~qMXTu#QQuG.b$jcDaȧoϗѿ7CfCW ] ЏB>&}s4o='~D,l)r,S hob犝fv^E~ۀmUϙfߒEMa*X eOb}CZ6۱V& `ZjMnsx j[HܣUdE -n;cfwWaur)ccwZ G:Zp}y+,kKXZMle xϤN{ܥ{u`^%l.n-(z4n JD 4g/ )]Guԃ퐟~9 |~R;ťdq'İ׊Oz^)[P8`G45Ӝ}(}Ҵ~4uFCo5?Ni='R$T F9b/Gd[:ǰq9YI~c)Oڎ!!>#*E#S&Z'i#.D|t$ohADec*R법 2WퟐMXi2 RS!Ɔ,i?TRg=O4FeيdO' sW3Y-8<{CV,P8tnh]h3Wz_v~ŊExδmv{20Kߏ-b!O`3Y >Yy9> 8kW?nx{)YT2ŽC@׎ދۉ<.>jyI U&#̋n[yLAf޸̄L*+Qe%DX}V;`2i?y} ;< w9^1;}(;۴ #n9_6ywe2Щ?yB;#O\_jjx<[UOq3~o )p6S^AkёANmΫ蟤w#cd[{tYtا&,:S¾{px,>) ln§ln,:6]ﳺC,9{w0c{z<轜␗5AGmqU,NyxR{{]p=ҡ8gb'y >e `^.{hSpe~~m,]=so.^3r}~s[}GsafEץ9yE.+}dPI51u?1I,^w89n!c ](`E nO -}}83 <#G^>gVwo!ҭRlx2is:tӗ5ep ^ɞNOS}O-xnȥrt7[P-l1#8qxnzMl\DLQ,$gr.Yr rHs潾_ ^ȆBHNOiSYL ,KGgQ3<Ru|αn)ݤYaPNɮ4M[纝=YVVtŰH H:E9*h< P"8b*I)*f@%Q`Y~8]qVyjƫ` ja,$ A=KPB./%!#JiYtlepaUlu{[*1S$+[S*.W/JT(wkRhVTB)2e UF"(NhfT`+c'{Sxr8;9lQBrf g9%N٣ I񺲴re(KةޛN;;;FI}u)i[HO- */h聤"CyP=X LVNB,r奙)K]^*fQa1j b1)pX0 ̤7PpiyI’>ijy\Aijrt0sz<ެj%Dʈ*> S穦(HSx*KܭIJqQMeiE(bYTmIhV[VNgOV>%'}f Xp .mʗ!X2lYS< ң0 _!7 U٩|W8h|p$eK Tĭ{%éRoQʟU[VCT>YQ%_KY"O ER-Ui֛z^)R yR  iYՌmCICOEQ(۲W>((a䂝C A=KPT*e&J͕wSVQT7X֜ COE^|9.Lf1AG$S%ncOmkBSx]NI0 ̍oe=t!h@^A,lgc#i!Ԁ4ȩ}Q2(IicY \ʼi-Fy;.ل؃]ٍM ]O hJg}:y_CrN[tgӀ+Nr*8}xe$E\dޙE'V![v5*mkBTx}+$+nʔiSL")HdJ,DbH$T3;;W֊z]@&-Y>\yنytc u/$р_ ݈vvvͅUJ@4ZaE6HxV:F6Q>KSy.&{<}Ad:KN?2 n37,OMEN#HF`?- j!j {r+%Aqh $S@%%|9`ƅ}6.?jU 7KBC_{-׮8`Se[ lhF-*,?nt WTe\ÚMOsf^|ŝ}Em ;GFn^Kb[dAݜҥy_g:=h5=#*|3z¡F#$̣[^Y EO)ـ~Iȑ8  Ľ&C}24 L >bXXFkhFWI. -h-yU`F m<}hRvTf}|dT@OP\I' 0%U-b2֓yxd^ƣcAēwP)Xͣ KZQX!+}~CX@- >9Fwx+$@>,#Xٵ1vQ5%tᑄJ#5̖3S=R e[OjRgfM߉ZpE9%辴tc⏥R1. p8Ywh;w@^tug.XHT^?2!+tU#_:{*!nygn:@ Zgpwp٧P栢=ԇ|Utl7~䙔@0 +h%\'̊!Lu`tp/߹÷0!:lH- gA ^Z1KO_<*•G}|;n'e}*#(4hB9Th玡NŶ@%fĠpo9,vrdԬ,qcD-7= 7V >v`f1B+?`ؕ?ջ+yKV"o6TpŚUk}"bɍ7!H*3(Tu|jGyŪEe18-BYYdf[L>='4"}\x乢2EOcvxV|MڡBs%ȧԜ?U$g{075պ[=h`Iu7ޡ1t(f\%}R@uPA(@0Mz>n /:{7l6u]~m'3u/OOX-?Jk3pMNVnuS>q$t>NSgِ,yfzkf6{4!ڵ Y̳X?%ţG|j}~H)'FCy6)$.[xgߍJ<MC+QgPX 7~PT֜~5=4WaH]0/qJ!Ѧ?q?+kpB7ޠ">G}W=\&fH0e kƲ]N0Gg45*O xFD ~Pv_u9%|?vǾal*.p,S?5jPt~ۢ4$FMm3\9\fVdٿIuKk+s]h?:iĺ-^pYljkeA ֣;$3~:LH Ip#W,%ebbad{O`eE}9!mB ,ƈyAUkb]Nø ˌD_ˁj5j%u^׸ `O g9cE @=BHMlk@$ ءۖ#iBOOA\zXCR%ˆ6 _loNVL?7\iB#~_l5zq#wRf|{jSKlcԁt*=LfLQJ_Ke[LE(EU0"R4hbR |;i@fT,}X?GBP7A#Hk2dwըU¢ {3eKxŨ!tϼѝ;ZهMK+2S:¾m:ʋT,شt|H>(;:HfT+_oG=3fLál,0K@I rHmD-Kɵ""7@8bRz=Dmc CF_ŀT-DM2_=Wl@F䴦"%b||+h Un+z`Dv~_ClO$>Y Bcyg |rp]o:8khۘM埁/W^ֆE^ls wfY~(cUSM6:-=j0y-AgЀNN2g$>+y| GA]cپ6m n5v{y4y:l<5y7/CBqP!L||R۝I׷Iw|X\Zꑽܳuu}1c%(Hh!!&>{Ny! BC~{ Uz-b i>hTN./hY}_sPp͠ '.D1bԿoK'mCn0H]_ _&kdx3{G!~KdlfPej9dm5Zq[nJ;#:u|CC-y Oo!N獼7;tYW[kcd [@P {q7wΎd'>{*QVؿMAN: Zl]ѓ䯹c[}: pz$1 U(rtH):=)_]2{xlu:0'Y0v~p %Nj #o^'X՜T¯-d'dT{voƧ߇&9ގlOz|lxq!leP>ޓ 4lBޞ}yơ$9Eg/>_Y\j*SCş9Pdo/g_J7wG`fע4>*04yWĉ &oD93mϻL}5Čގv$OEA0h61s_ qhL`Iw^%M2g 0=f_v fM7R;IEJQ04Ys N[4HWR99s_;o@O7 @s21FQyhm`:o_ π7:zAE^,έx!{>!7r#{77;"{&/0WßﳠA[yυmk}ݲC,NZ M9@`CtD"<p& ^K_J}GR}/ +-khO.ЙZ"W 83;&_ EKًH|!GCVyhKj-үP~Z̚lpyN7;aACNh }p*}FZM8oMGeh ŕW&;0ܕ +$Dz sD %0x/{gݷB#cpD˵#e"K/) !Y#̓Dlg4b>EM3T (9&p~-'GɑlY[?E.`ހM Evn4s<{nҟ4z3ƿM(p4x։m |&x%Z@({~N1qy8FPjDo6SXyhr :JgǾfN&b7Ԋ{dK<ڜw#sںN}xU~Mf_ 244yYhtvш̪>Qc8{Y oߛ|u߄6W(-ߺȍ# n֚MPj] Mp# y}XK sSU>q݁(yug5s3q !{;ߓ"4dG _4>7IH4(.#B ؜cz (#}%şnMC- }|[ϸ%6Pe>4RQoZ ]r;^@UofJ_nnaL3RlP?yרfchRr$R΄"rKG,-cJ铞\ੂJq{} y+wܥMYaq$xH{h2؂H!XG-Cz+Ng÷M#Y#dnrjE!ٯ.Th";vv ׏I42'ZJFBѳ$.2n;ӹtw=xt劉f>W:m+zl<Q CsBL@G1RB9zBG/u9߱\!p"Mj} ӆr)nST&t`&YfpKOm5oI~6;6h'!aG^drE% v <R1%/LPskK\wIΌ\ӀxI7Jb(i(H<'ߟ-Ԥ)ycNŚ:V J>̛jATg /d^YOCrG:ic;CʀW4' hJ7_sQL3!Mۯ6Ky{⼲q 7x˼`[(sk349bx7|q T zըH?-m䙄3ΐ{K@lg)ݺ@ RtiMd\zK.(\rZȞqp~M`d6 /wOd`.HyEϼ zd&<ʉdd9}hR^օ=W"3D_=,!l,ŏq?E?BІ^^c] J*סIq+\bjō 0}6?t6Gл̂:?s%V/Df= ~4_ M=? uA? L`R.[ B:RZ^A)D(ϼRSJu!lꟆ&/Λ cM}[cXaDe(_Lz"oHqcTxwt]8a S!BɄL}XJ" Y[8—>;r xDv؅7Q/b .=_U$?&Y ]X>e F€"UE,hi#z@7Hzc/x27m0"f\0Ѓ>#au Mb5s$Tvb18#{c4+Ώѭ _'2Eeoߟe-2$i%  MrNMAN.9$Dayj~\l;]?B~^Ng~5/Bmu%hk^BiJʵ+w @F!M*yg_8,|:ֆmWàc 3FGu~2'uF=!"ct8/ZԸruڐGtXCg5ZbKZbb[^V ٤)E=+!KΔ\C50!xV~&,~"1>ύ^/kdCmBb4 rQ"x D!W'ܻ}QΏy"Bx|31H.Ͷ2!qb̬?M!?q9><-lW]M}m5NgO4Z{m݅o #CÇM] 2h2_AG@nn*I J<&ߟ Jk`:1Ϩ#{D+B2y\i1^_E1lAbBAnE FX0>>H1'H$K[~ l5n}*jV9/@>RL.$?m>EN$D'~.%8yFc`}{C;+@03Ft̋g; $O)O:f |"""yAБlDk#/{φ7$Ő; Žz ,^rp"~}5C|pKAyɼ"7zq%{SJ{.̥܅ؔNICC!nVzСÒ+e1f(G -/3h)I=қUbPxF?M;YͶTj^zWyr>&5zRnqO÷ My}vP/vFZ4Z#GqES:/]`<{f#y3lfT9FG Oy6uB%|@uf~3˙@}XSwx$"Q}S!T AHP!.Eev_\κ7+miy4qv0‰jdž?+o^+-Y>VH?uhR?wX[ЦKZ$'͡WF E c[`P[Џ q\_]R +zZQ>3jQÉ(cF̬BYB-yFvrQYc? PCt8|];_ svXV +P٭o)1[H>fo]HL@c9w ttW#0*-ZDx}n;,^y{Rn] *j^D;b0 7 63&7*}QxoɶR^dte3a(ԍʛ?ߚW♰\#zz>% T,ȦRkYp\V$PUઐuAXcg{ .uU69WDԶ,|=?_xb}N@;|P%})A?zR!@@P?t@Jy1P{mS̔eYZ^w^1*| ֊9L'd !P'hKh70b:lf'bYykxDm1mx*|u'8B@(čbJJc~0y7ŏz #9{khA׿Y&Y7NU6S@cFLRz}n@*&d^O?bF4k@~O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?YMwg8mkBT6x흍) q ĉ8D^>׻gI@XjjgiЃ`0 `0 ?ϟ|:seQ3|ӧO|:2|.};7eGFO6_Qv]T]^ˮg{>pjzkuo{yye?{-x/ D:3D&򈼹e^Hyi#/OGzϪ߯_~ :sMe#M3Y#=2 QЙ[\s=E8}E>GȩT ڲTg-}VfoSVwzV}./>~!?U1<#}=F[ ~QڋBN..+푹^edLo+[\-k dW(}6q$#?z6Bөi?L7!3O_Q}Пuo[=tkȋM!'}/Ƈdr2_Cﲨ: `0 :8o=+8-4}۞cĥXdq{bUq©ήm!ƶg*ΪU\z[GA=^+ru{LV U?)V>ғ)x|Yҁgi\yi^cUo*= !TY?rfgWsʽVn*VX#=Fϫ+[F~yH\L~[O҇h5ݵTow|Sfӟ+);F;:x )/OS yUo2e)Ve3'wgGg=J^`0  ľu kU,Ksؑ5nY,bXw{ w&3QהNQev ]ƷgcH˞i{A3I8hwduwUIWq8I>+@pQşGcZ\ƪUߝ]/:3d;ɫ:gB9R|GW~w2;fzt|+i5nΟgZY|<1NyŬ|E7k?z/k><=Α}N΅>uWydʬdz `0 *\?W8GY:Dgcg< 2+'W6qn؟{ru"wU쏘~c#T?+y{Q,,^qF/Xv8.֩g3}ȸOP ~n%hUG4(_sn|W}Tg&x^c,Fѭ+ <#+}/Uw8BRh_|33!mr\7U9m({ѝpvew[xG]߱?g;,nҽow8]וb?OV=Z_#ve?vN_WrYLo;1g9pV^G~>[_vNOS3 `0Q[ veO\k^8֔v<Zbz\Opbn$~}oz3ј mK vU]^iNWA#x딫jt q :E= z%օq)CcYEqyRG-+u (K\hP'*^ء^q=m=y|Kvūe\rȊ4={W1;=ݷxp;o@>ȘT\Ԏ+C=*ɫ|GJOCW]x1.ﵠ9_Eб Vq)v(ʑ}[GwǺ{-oSdו_˞׃2;iT&w*w:g׭SOsj%Z[~_˯d֮+w]7 `0]kIu+eL]ւoA^;=GR?v쯱;<y o$N1紈=:ߥPVu< <&3KyC/4r)i=*/|Ύ^]QNН1qGw>ù{ ?Kv:A}E:_n+{u=rq͓̳]>>d}+|L01`0 leg:׺񶊝`W,3O?]\9P~[kOWiGc~)-<w.3q}'vuw$Vnv(r52S;Wk_Kϔ8B/hEՠ'9w?K;x:x<|@cϽVyc@ۖSw8Bq]=2lBe6V}eR( VeZT4ade2ޒ+nYBTqSߔ<[&=f[|szP)G}{Zׅ3n7jpWwftEw[ǽ;`l? `0 `0 `{~i`oLy>uoi\qK|}7Svu9G쯿c¾#>,jow{ՆݲL=mW2u_8دjo?kD߱mw>#}E:OۡO;y`$j mkBTx흍8 FSHI!)$FRHnw HYx3ꇤsaaaaxIǏ'U{o_ھgW9 o'GW {>~Jlo߾)*/N\ϱov[iZ_ձaJΝ/:6O- 92b?Tlk%?_21B sY5>:>c=1Ow y^- ڶ,XzusM#גU]>H_yYv!ۉ_mi Rus]Xm_g)YY)m]y,m z1aaaxEߓGקo/Y\k6xjgH|yu.\aæM&wk#ϐ$?]Mo\Ⱦ,/ڥQ@~6s?)}, l gX #vQg Bٙ^uのuhm?}{].~}v_J;xogJY]޳@.)oqC?}>@Xߘ'-(W? źvƔOʙRv[K?[A}?-wmՑ}g\=c}M ggg DŽ-B^k_g?F? v0||؎=ǧHPgs/hؑI t~{n^}ZyD5XWvO)"c0vY Z|~_%/,p\ɹyΰZ/;/xs_9?Pܯ5ݻ\[y|č8gʱL{? 0 0 _k3>z_\S |<)b|7aaaxn.ta?l^Cvkؽ#~e)3<3^kdlc&jK+o"e<.ʞ`^(3zu l+6v<ï k7]/lc[`On}򚄫 G뎱zt^v2)?;Wmr5ocIz?Ozx{&!ez."ѯ 1Gg{+ҏlw<=}GݽFƨ^)zIpG K֜{{e G12ۭqiumf>.}~a? 0 0 [u+7Svq֭y΅ ?ނ}XwŶv?ߩDZۓ-q/?߳=<~#>Fk"qzrQo 9r,nY[;o:)@-`ק-7({߯S@µK9֠ɸ>:n3 _[_*mtcmC>qSL=<6;ǫsaaa{xˌ\ފpx?0׋#5zяc]x^l򼠕(f:~٣^lin59W~\;?vn6erUbS~v^U O7O(|;+SG4|?f*?rW~2oNٟS9~daևmH6mX[J~s.ym4ٶO|Bd/b5ɿyU? 0 0 0 0 0 0 0.P~*1@G\⟿KrKXs2(ߥ纎J8'>X@▼QQbqwx b)_K|v 1M6kee-2Ǜ59?K^E~9ϱQﱮYF8N?~;:=J<-tĒyNAgC \NXKs)'^Kg\~2}6}Գ)n]Or^j~"{p29w6/.z-v:+M{WJYZ굢`% Ҥl9ힶկ#OUz+U?;sd~vND7*.Y+v:ye;8}~|+ÑޅN9}{Bƞ#txխsXɿkSV/uJ=o G<ջL'L:D]6jfgLz/+ؽ[{rCMYq~[{yy czA;w9zszWHVax3 W fmkBTxڍm0aaAXAtNuө~"B~v(I$Ic i#Gl6p8޾s[ouv?Ru߯+fԍ^|}m43ϭu!Z9RUY׽B,z"|~>/|RתY̞EGߔ뙷L?:fV\꺯Pv#R>cNb=^Fz=yNI}.3?3̥*Ǫ7٧ڞƵ2~zWİg#g&2yK;wʞ2vm"Ggʼd~g<[şXlk=^k͞Gy\ׇ3M^&}V3=3ڣ<_(녾v9> G@Sǿ99Gy*"QYu*lz;{-/9v=Q_s>c),k:gQ%ԝ,SFwA2vWcWqlׯ[},g7F}.2˘ڳgEgG +:zFJix}QU[*v%x1 YU+L/BB59W$8k n%ٟވ}A k+IENDB`contextfree-3.0.5+dfsg1.orig/src-win/WinPngCanvas.h0000644000175000017500000000266212076364074020540 0ustar brambram// WinPngCanvas.h // this file is part of Context Free // --------------------- // Copyright (C) 2005-2012 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #include "abstractPngCanvas.h" class pngCanvas : public abstractPngCanvas { public: pngCanvas(const char* outfilename, bool quiet, int width, int height, PixelFormat pixfmt, bool crop, int frameCount, int variation, bool wallpaper, Renderer *r, int mx, int my); ~pngCanvas(); protected: virtual void output(const char * outfilename, int frame = -1); private: static int CanvasCount; }; contextfree-3.0.5+dfsg1.orig/src-win/WinCanvas.cpp0000644000175000017500000000511112076364074020416 0ustar brambram// WinCanvas.cpp // this file is part of Context Free // --------------------- // Copyright (C) 2005-2011 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #include "WinCanvas.h" #include "WinSystem.h" #include void WinCanvas::start(bool clear, const agg::rgba& bk, int actualWidth, int actualHeight) { aggCanvas::start(clear, bk, actualWidth, actualHeight); } void WinCanvas::end() { aggCanvas::end(); // This message tells the Document view to update the window if (!mNoUpdate) mSystem->statusUpdate(); } WinCanvas::WinCanvas(WinSystem* sys, aggCanvas::PixelFormat pixfmt, int width, int height, agg::rgba bkgrnd) : aggCanvas(pixfmt), mPixelFormat(pixfmt), mBM(0), mBackground(bkgrnd), mNoUpdate(true), mSystem(sys) { mWidth = width; mHeight = abs(height); mStride = mWidth * aggCanvas::BytesPerPixel[mPixelFormat]; // pad row stride to DWORD boundary mStride += ((-mStride) & 3); mBM = (char*)(new DWORD[mStride * mHeight / 4]); aggCanvas::attach((void*)mBM, mWidth, mHeight, mStride, height > 0); // clear the bitmap aggCanvas::start(true, bkgrnd, width, mHeight); aggCanvas::end(); mNoUpdate = false; } WinCanvas::~WinCanvas() { delete[] mBM; } WinCanvas* WinCanvas::Make8bitCopy() { WinCanvas* eight = new WinCanvas(mSystem, (aggCanvas::PixelFormat)(mPixelFormat & (~ aggCanvas::Has_16bit_Color)), mWidth, mHeight, mBackground); eight->mNoUpdate = true; eight->start(true, mBackground, cropWidth(), cropHeight()); eight->end(); eight->mNoUpdate = false; eight->copy(mBM, mWidth, mHeight, mStride, mPixelFormat); return eight; }contextfree-3.0.5+dfsg1.orig/src-win/winVersion.cpp0000644000175000017500000000246412076364074020700 0ustar brambram// winVersion.cpp // Context Free // --------------------- // Copyright (C) 2008-2013 John Horigan // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #include "version.h" #include const char* APP_NAME(const char* argv0) { if (argv0 == 0) return "ContextFreeCLI.exe"; const char* dir = strrchr(argv0, '\\'); if (dir) return dir + 1; return argv0; } const char* APP_VERSION() { return "3.0.5"; } int APP_BUILD() { return 34; } char APP_OPTCHAR() { return '/'; } contextfree-3.0.5+dfsg1.orig/src-win/inttypes.h0000644000175000017500000002016512076364074020057 0ustar brambram// ISO C9x compliant inttypes.h for Microsoft Visual Studio // Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 // // Copyright (c) 2006 Alexander Chemeris // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // 3. The name of the author may be used to endorse or promote products // derived from this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO // EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; // OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // /////////////////////////////////////////////////////////////////////////////// #ifndef _MSC_VER // [ #error "Use this header only with Microsoft Visual C++ compilers!" #endif // _MSC_VER ] #ifndef _MSC_INTTYPES_H_ // [ #define _MSC_INTTYPES_H_ #if _MSC_VER > 1000 #pragma once #endif #include "stdint.h" // 7.8 Format conversion of integer types typedef struct { intmax_t quot; intmax_t rem; } imaxdiv_t; // 7.8.1 Macros for format specifiers #if !defined(__cplusplus) || defined(__STDC_FORMAT_MACROS) // [ See footnote 185 at page 198 // The fprintf macros for signed integers are: #define PRId8 "d" #define PRIi8 "i" #define PRIdLEAST8 "d" #define PRIiLEAST8 "i" #define PRIdFAST8 "d" #define PRIiFAST8 "i" #define PRId16 "hd" #define PRIi16 "hi" #define PRIdLEAST16 "hd" #define PRIiLEAST16 "hi" #define PRIdFAST16 "hd" #define PRIiFAST16 "hi" #define PRId32 "I32d" #define PRIi32 "I32i" #define PRIdLEAST32 "I32d" #define PRIiLEAST32 "I32i" #define PRIdFAST32 "I32d" #define PRIiFAST32 "I32i" #define PRId64 "I64d" #define PRIi64 "I64i" #define PRIdLEAST64 "I64d" #define PRIiLEAST64 "I64i" #define PRIdFAST64 "I64d" #define PRIiFAST64 "I64i" #define PRIdMAX "I64d" #define PRIiMAX "I64i" #define PRIdPTR "Id" #define PRIiPTR "Ii" // The fprintf macros for unsigned integers are: #define PRIo8 "o" #define PRIu8 "u" #define PRIx8 "x" #define PRIX8 "X" #define PRIoLEAST8 "o" #define PRIuLEAST8 "u" #define PRIxLEAST8 "x" #define PRIXLEAST8 "X" #define PRIoFAST8 "o" #define PRIuFAST8 "u" #define PRIxFAST8 "x" #define PRIXFAST8 "X" #define PRIo16 "ho" #define PRIu16 "hu" #define PRIx16 "hx" #define PRIX16 "hX" #define PRIoLEAST16 "ho" #define PRIuLEAST16 "hu" #define PRIxLEAST16 "hx" #define PRIXLEAST16 "hX" #define PRIoFAST16 "ho" #define PRIuFAST16 "hu" #define PRIxFAST16 "hx" #define PRIXFAST16 "hX" #define PRIo32 "I32o" #define PRIu32 "I32u" #define PRIx32 "I32x" #define PRIX32 "I32X" #define PRIoLEAST32 "I32o" #define PRIuLEAST32 "I32u" #define PRIxLEAST32 "I32x" #define PRIXLEAST32 "I32X" #define PRIoFAST32 "I32o" #define PRIuFAST32 "I32u" #define PRIxFAST32 "I32x" #define PRIXFAST32 "I32X" #define PRIo64 "I64o" #define PRIu64 "I64u" #define PRIx64 "I64x" #define PRIX64 "I64X" #define PRIoLEAST64 "I64o" #define PRIuLEAST64 "I64u" #define PRIxLEAST64 "I64x" #define PRIXLEAST64 "I64X" #define PRIoFAST64 "I64o" #define PRIuFAST64 "I64u" #define PRIxFAST64 "I64x" #define PRIXFAST64 "I64X" #define PRIoMAX "I64o" #define PRIuMAX "I64u" #define PRIxMAX "I64x" #define PRIXMAX "I64X" #define PRIoPTR "Io" #define PRIuPTR "Iu" #define PRIxPTR "Ix" #define PRIXPTR "IX" // The fscanf macros for signed integers are: #define SCNd8 "d" #define SCNi8 "i" #define SCNdLEAST8 "d" #define SCNiLEAST8 "i" #define SCNdFAST8 "d" #define SCNiFAST8 "i" #define SCNd16 "hd" #define SCNi16 "hi" #define SCNdLEAST16 "hd" #define SCNiLEAST16 "hi" #define SCNdFAST16 "hd" #define SCNiFAST16 "hi" #define SCNd32 "ld" #define SCNi32 "li" #define SCNdLEAST32 "ld" #define SCNiLEAST32 "li" #define SCNdFAST32 "ld" #define SCNiFAST32 "li" #define SCNd64 "I64d" #define SCNi64 "I64i" #define SCNdLEAST64 "I64d" #define SCNiLEAST64 "I64i" #define SCNdFAST64 "I64d" #define SCNiFAST64 "I64i" #define SCNdMAX "I64d" #define SCNiMAX "I64i" #ifdef _WIN64 // [ # define SCNdPTR "I64d" # define SCNiPTR "I64i" #else // _WIN64 ][ # define SCNdPTR "ld" # define SCNiPTR "li" #endif // _WIN64 ] // The fscanf macros for unsigned integers are: #define SCNo8 "o" #define SCNu8 "u" #define SCNx8 "x" #define SCNX8 "X" #define SCNoLEAST8 "o" #define SCNuLEAST8 "u" #define SCNxLEAST8 "x" #define SCNXLEAST8 "X" #define SCNoFAST8 "o" #define SCNuFAST8 "u" #define SCNxFAST8 "x" #define SCNXFAST8 "X" #define SCNo16 "ho" #define SCNu16 "hu" #define SCNx16 "hx" #define SCNX16 "hX" #define SCNoLEAST16 "ho" #define SCNuLEAST16 "hu" #define SCNxLEAST16 "hx" #define SCNXLEAST16 "hX" #define SCNoFAST16 "ho" #define SCNuFAST16 "hu" #define SCNxFAST16 "hx" #define SCNXFAST16 "hX" #define SCNo32 "lo" #define SCNu32 "lu" #define SCNx32 "lx" #define SCNX32 "lX" #define SCNoLEAST32 "lo" #define SCNuLEAST32 "lu" #define SCNxLEAST32 "lx" #define SCNXLEAST32 "lX" #define SCNoFAST32 "lo" #define SCNuFAST32 "lu" #define SCNxFAST32 "lx" #define SCNXFAST32 "lX" #define SCNo64 "I64o" #define SCNu64 "I64u" #define SCNx64 "I64x" #define SCNX64 "I64X" #define SCNoLEAST64 "I64o" #define SCNuLEAST64 "I64u" #define SCNxLEAST64 "I64x" #define SCNXLEAST64 "I64X" #define SCNoFAST64 "I64o" #define SCNuFAST64 "I64u" #define SCNxFAST64 "I64x" #define SCNXFAST64 "I64X" #define SCNoMAX "I64o" #define SCNuMAX "I64u" #define SCNxMAX "I64x" #define SCNXMAX "I64X" #ifdef _WIN64 // [ # define SCNoPTR "I64o" # define SCNuPTR "I64u" # define SCNxPTR "I64x" # define SCNXPTR "I64X" #else // _WIN64 ][ # define SCNoPTR "lo" # define SCNuPTR "lu" # define SCNxPTR "lx" # define SCNXPTR "lX" #endif // _WIN64 ] #endif // __STDC_FORMAT_MACROS ] // 7.8.2 Functions for greatest-width integer types // 7.8.2.1 The imaxabs function #define imaxabs _abs64 // 7.8.2.2 The imaxdiv function // This is modified version of div() function from Microsoft's div.c found // in %MSVC.NET%\crt\src\div.c #ifdef STATIC_IMAXDIV // [ static #else // STATIC_IMAXDIV ][ _inline #endif // STATIC_IMAXDIV ] imaxdiv_t __cdecl imaxdiv(intmax_t numer, intmax_t denom) { imaxdiv_t result; result.quot = numer / denom; result.rem = numer % denom; if (numer < 0 && result.rem > 0) { // did division wrong; must fix up ++result.quot; result.rem -= denom; } return result; } // 7.8.2.3 The strtoimax and strtoumax functions #define strtoimax _strtoi64 #define strtoumax _strtoui64 // 7.8.2.4 The wcstoimax and wcstoumax functions #define wcstoimax _wcstoi64 #define wcstoumax _wcstoui64 #endif // _MSC_INTTYPES_H_ ] contextfree-3.0.5+dfsg1.orig/src-win/derived/0000755000175000017500000000000012245646004017437 5ustar brambramcontextfree-3.0.5+dfsg1.orig/src-win/derived/lex.yy.cpp0000644000175000017500000024235312076364074021412 0ustar brambram#line 2 "lex.yy.cpp" #line 4 "lex.yy.cpp" #define YY_INT_ALIGNED short int /* A lexical scanner generated by flex */ #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 5 #define YY_FLEX_SUBMINOR_VERSION 37 #if YY_FLEX_SUBMINOR_VERSION > 0 #define FLEX_BETA #endif /* The c++ scanner is a mess. The FlexLexer.h header file relies on the * following macro. This is required in order to pass the c++-multiple-scanners * test in the regression suite. We get reports that it breaks inheritance. * We will address this in a future release of flex, or omit the C++ scanner * altogether. */ #define yyFlexLexer CfdgFlexLexer /* First, we deal with platform-specific or compiler-specific issues. */ /* begin standard C headers. */ /* end standard C headers. */ /* flex integer type definitions */ #ifndef FLEXINT_H #define FLEXINT_H /* C99 systems have . Non-C99 systems may or may not. */ #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, * if you want the limit (max/min) macros for int types. */ #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS 1 #endif #include typedef int8_t flex_int8_t; typedef uint8_t flex_uint8_t; typedef int16_t flex_int16_t; typedef uint16_t flex_uint16_t; typedef int32_t flex_int32_t; typedef uint32_t flex_uint32_t; #else typedef signed char flex_int8_t; typedef short int flex_int16_t; typedef int flex_int32_t; typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; /* Limits of integral types. */ #ifndef INT8_MIN #define INT8_MIN (-128) #endif #ifndef INT16_MIN #define INT16_MIN (-32767-1) #endif #ifndef INT32_MIN #define INT32_MIN (-2147483647-1) #endif #ifndef INT8_MAX #define INT8_MAX (127) #endif #ifndef INT16_MAX #define INT16_MAX (32767) #endif #ifndef INT32_MAX #define INT32_MAX (2147483647) #endif #ifndef UINT8_MAX #define UINT8_MAX (255U) #endif #ifndef UINT16_MAX #define UINT16_MAX (65535U) #endif #ifndef UINT32_MAX #define UINT32_MAX (4294967295U) #endif #endif /* ! C99 */ #endif /* ! FLEXINT_H */ /* begin standard C++ headers. */ #include #include #include #include #include /* end standard C++ headers. */ #ifdef __cplusplus /* The "const" storage-class-modifier is valid. */ #define YY_USE_CONST #else /* ! __cplusplus */ /* C99 requires __STDC__ to be defined as 1. */ #if defined (__STDC__) #define YY_USE_CONST #endif /* defined (__STDC__) */ #endif /* ! __cplusplus */ #ifdef YY_USE_CONST #define yyconst const #else #define yyconst #endif /* Returned upon end-of-file. */ #define YY_NULL 0 /* Promotes a possibly negative, possibly signed char to an unsigned * integer for use as an array index. If the signed char is negative, * we want to instead treat it as an 8-bit unsigned char, hence the * double cast. */ #define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ #define BEGIN (yy_start) = 1 + 2 * /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START (((yy_start) - 1) / 2) #define YYSTATE YY_START /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* Special action meaning "start processing a new file". */ #define YY_NEW_FILE yyrestart( yyin ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #ifndef YY_BUF_SIZE #define YY_BUF_SIZE 16384 #endif /* The state buf must be large enough to hold one state per character in the main buffer. */ #define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) #ifndef YY_TYPEDEF_YY_BUFFER_STATE #define YY_TYPEDEF_YY_BUFFER_STATE typedef struct yy_buffer_state *YY_BUFFER_STATE; #endif #ifndef YY_TYPEDEF_YY_SIZE_T #define YY_TYPEDEF_YY_SIZE_T typedef size_t yy_size_t; #endif extern yy_size_t yyleng; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 /* Note: We specifically omit the test for yy_rule_can_match_eol because it requires * access to the local variable yy_act. Since yyless() is a macro, it would break * existing scanners that call yyless() from OUTSIDE yylex. * One obvious solution it to make yy_act a global. I tried that, and saw * a 5% performance hit in a non-yylineno scanner, because yy_act is * normally declared as a register variable-- so it is not worth it. */ #define YY_LESS_LINENO(n) \ do { \ int yyl;\ for ( yyl = n; yyl < yyleng; ++yyl )\ if ( yytext[yyl] == '\n' )\ --yylineno;\ }while(0) /* Return all but the first "n" matched characters back to the input stream. */ #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ *yy_cp = (yy_hold_char); \ YY_RESTORE_YY_MORE_OFFSET \ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) #define unput(c) yyunput( c, (yytext_ptr) ) #ifndef YY_STRUCT_YY_BUFFER_STATE #define YY_STRUCT_YY_BUFFER_STATE struct yy_buffer_state { std::istream* yy_input_file; char *yy_ch_buf; /* input buffer */ char *yy_buf_pos; /* current position in input buffer */ /* Size of input buffer in bytes, not including room for EOB * characters. */ yy_size_t yy_buf_size; /* Number of characters read into yy_ch_buf, not including EOB * characters. */ yy_size_t yy_n_chars; /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to * delete it. */ int yy_is_our_buffer; /* Whether this is an "interactive" input source; if so, and * if we're using stdio for input, then we want to use getc() * instead of fread(), to make sure we stop fetching input after * each newline. */ int yy_is_interactive; /* Whether we're considered to be at the beginning of a line. * If so, '^' rules will be active on the next match, otherwise * not. */ int yy_at_bol; int yy_bs_lineno; /**< The line count. */ int yy_bs_column; /**< The column count. */ /* Whether to try to fill the input buffer when we reach the * end of it. */ int yy_fill_buffer; int yy_buffer_status; #define YY_BUFFER_NEW 0 #define YY_BUFFER_NORMAL 1 /* When an EOF's been seen but there's still some text to process * then we mark the buffer as YY_EOF_PENDING, to indicate that we * shouldn't try reading from the input source any more. We might * still have a bunch of tokens to match, though, because of * possible backing-up. * * When we actually see the EOF, we change the status to "new" * (via yyrestart()), so that the user can continue scanning by * just pointing yyin at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 }; #endif /* !YY_STRUCT_YY_BUFFER_STATE */ /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state". * * Returns the top of the stack, or NULL. */ #define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ : NULL) /* Same as previous macro, but useful when we know that the buffer stack is not * NULL or when we need an lvalue. For internal use only. */ #define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] void *Cfdgalloc (yy_size_t ); void *Cfdgrealloc (void *,yy_size_t ); void Cfdgfree (void * ); #define yy_new_buffer yy_create_buffer #define yy_set_interactive(is_interactive) \ { \ if ( ! YY_CURRENT_BUFFER ){ \ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer( yyin, YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ } #define yy_set_bol(at_bol) \ { \ if ( ! YY_CURRENT_BUFFER ){\ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer( yyin, YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ } #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) /* Begin user sect3 */ #define YY_SKIP_YYWRAP typedef unsigned char YY_CHAR; #define yytext_ptr yytext #include int yyFlexLexer::yywrap() { return 1; } /* Done after the current pattern has been matched and before the * corresponding action - sets up yytext. */ #define YY_DO_BEFORE_ACTION \ (yytext_ptr) = yy_bp; \ yyleng = (size_t) (yy_cp - yy_bp); \ (yy_hold_char) = *yy_cp; \ *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; #define YY_NUM_RULES 89 #define YY_END_OF_BUFFER 90 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info { flex_int32_t yy_verify; flex_int32_t yy_nxt; }; static yyconst flex_int16_t yy_accept[295] = { 0, 0, 0, 90, 88, 86, 87, 74, 88, 1, 88, 88, 88, 88, 88, 84, 65, 15, 68, 80, 80, 80, 80, 80, 88, 80, 39, 37, 80, 80, 31, 33, 80, 80, 57, 29, 46, 80, 80, 42, 43, 44, 88, 80, 80, 86, 0, 3, 75, 0, 78, 21, 81, 2, 1, 84, 81, 84, 0, 66, 72, 71, 69, 0, 0, 80, 80, 80, 80, 80, 80, 80, 77, 80, 80, 80, 80, 80, 80, 80, 80, 80, 17, 80, 80, 80, 80, 80, 80, 80, 63, 64, 80, 80, 80, 80, 80, 80, 80, 80, 80, 59, 61, 60, 62, 55, 53, 49, 0, 76, 23, 80, 80, 80, 24, 81, 0, 0, 81, 83, 81, 0, 0, 82, 0, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 32, 80, 80, 14, 80, 80, 80, 80, 80, 35, 80, 80, 80, 80, 80, 80, 80, 80, 80, 0, 0, 0, 0, 22, 25, 73, 67, 70, 0, 82, 0, 82, 82, 0, 80, 80, 80, 80, 80, 80, 80, 80, 80, 20, 80, 18, 80, 30, 80, 80, 12, 80, 10, 80, 9, 80, 80, 45, 47, 80, 80, 8, 26, 80, 80, 0, 0, 48, 51, 82, 82, 0, 80, 79, 80, 80, 80, 80, 80, 80, 38, 80, 80, 13, 80, 80, 80, 56, 80, 80, 11, 80, 80, 80, 41, 58, 0, 0, 0, 85, 80, 80, 80, 80, 80, 80, 80, 80, 7, 80, 28, 80, 80, 19, 80, 80, 54, 0, 0, 80, 80, 80, 80, 16, 6, 80, 80, 80, 80, 0, 0, 80, 80, 80, 80, 80, 80, 80, 0, 0, 80, 80, 80, 80, 27, 40, 0, 0, 5, 36, 34, 4, 0, 0, 52, 50, 0 } ; static yyconst flex_int32_t yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, 5, 6, 1, 7, 8, 1, 1, 1, 9, 10, 1, 11, 12, 13, 14, 15, 16, 14, 14, 14, 14, 14, 14, 14, 17, 1, 18, 19, 20, 1, 1, 21, 22, 23, 22, 24, 22, 22, 22, 25, 22, 22, 26, 27, 28, 29, 30, 22, 31, 32, 33, 34, 35, 22, 22, 36, 22, 1, 1, 1, 37, 38, 1, 39, 40, 41, 42, 43, 44, 45, 46, 47, 22, 48, 49, 50, 51, 52, 53, 22, 54, 55, 56, 57, 22, 58, 59, 60, 61, 1, 62, 1, 1, 1, 63, 22, 22, 22, 22, 22, 22, 22, 64, 65, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 66, 22, 67, 22, 22, 22, 68, 69, 70, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 71, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 72, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 73, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22 } ; static yyconst flex_int32_t yy_meta[74] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 3, 3, 3, 4, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 } ; static yyconst flex_int16_t yy_base[299] = { 0, 0, 0, 311, 1188, 307, 1188, 1188, 71, 1188, 294, 285, 286, 63, 71, 74, 63, 274, 265, 80, 82, 84, 91, 95, 239, 0, 102, 109, 111, 118, 121, 125, 128, 132, 135, 142, 169, 144, 176, 194, 217, 154, 157, 178, 209, 266, 82, 1188, 1188, 256, 1188, 1188, 223, 1188, 1188, 253, 228, 239, 246, 1188, 1188, 1188, 1188, 238, 93, 247, 0, 258, 266, 268, 275, 277, 1188, 279, 289, 293, 296, 303, 305, 307, 314, 316, 324, 326, 333, 335, 337, 345, 352, 354, 356, 364, 366, 373, 375, 383, 385, 393, 402, 404, 406, 416, 418, 420, 427, 199, 191, 184, 197, 1188, 430, 438, 445, 447, 1188, 1188, 455, 219, 1188, 1188, 460, 467, 471, 481, 97, 487, 489, 511, 513, 515, 523, 530, 532, 539, 541, 543, 550, 553, 562, 564, 573, 576, 583, 585, 587, 596, 598, 600, 608, 615, 617, 626, 628, 635, 638, 642, 651, 171, 175, 175, 158, 653, 655, 662, 665, 674, 475, 680, 478, 683, 1188, 115, 689, 691, 693, 704, 707, 714, 718, 722, 725, 732, 739, 741, 743, 751, 753, 761, 763, 772, 774, 776, 783, 785, 787, 794, 797, 804, 808, 812, 816, 823, 826, 167, 162, 1188, 147, 1188, 1188, 113, 830, 833, 840, 842, 850, 852, 865, 868, 875, 879, 882, 889, 891, 893, 900, 902, 904, 911, 913, 915, 934, 924, 941, 943, 161, 146, 131, 171, 945, 952, 955, 966, 970, 977, 986, 988, 990, 997, 999, 1001, 1008, 1010, 1019, 1021, 1188, 121, 137, 1030, 1033, 1049, 1051, 1053, 1060, 1063, 1070, 1067, 1074, 122, 113, 1078, 1081, 1085, 1096, 1088, 1100, 1107, 121, 115, 1109, 1118, 1125, 1122, 1133, 1135, 76, 63, 1142, 1144, 1151, 1155, 49, 49, 1188, 1188, 1188, 1176, 1179, 1181, 1184 } ; static yyconst flex_int16_t yy_def[299] = { 0, 294, 1, 294, 294, 294, 294, 294, 295, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 296, 296, 296, 296, 296, 294, 297, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 294, 296, 296, 294, 295, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 298, 298, 296, 297, 296, 296, 296, 296, 296, 294, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 294, 294, 294, 294, 294, 296, 296, 296, 296, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 298, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 294, 294, 294, 294, 296, 296, 296, 296, 296, 294, 294, 294, 294, 294, 298, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 294, 294, 294, 294, 294, 294, 298, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 294, 294, 294, 298, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 294, 294, 294, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 294, 294, 296, 296, 296, 296, 296, 296, 296, 294, 294, 296, 296, 296, 296, 296, 296, 294, 294, 296, 296, 296, 296, 294, 294, 294, 294, 0, 294, 294, 294, 294 } ; static yyconst flex_int16_t yy_nxt[1262] = { 0, 4, 5, 6, 7, 8, 9, 4, 10, 4, 11, 12, 13, 14, 15, 15, 15, 4, 16, 17, 18, 19, 20, 21, 20, 20, 22, 23, 20, 20, 20, 20, 20, 20, 20, 20, 20, 24, 25, 26, 27, 28, 20, 29, 30, 20, 31, 32, 20, 33, 20, 20, 20, 34, 35, 36, 37, 20, 38, 39, 40, 41, 42, 20, 20, 20, 20, 20, 20, 20, 20, 20, 43, 44, 47, 51, 47, 52, 52, 52, 53, 55, 59, 60, 54, 47, 56, 47, 57, 57, 57, 63, 64, 63, 64, 63, 64, 66, 58, 66, 293, 66, 63, 64, 292, 64, 63, 64, 66, 64, 68, 67, 66, 63, 64, 291, 70, 58, 69, 66, 63, 64, 63, 64, 71, 64, 66, 64, 66, 63, 64, 290, 63, 64, 124, 66, 63, 64, 66, 63, 64, 171, 66, 63, 64, 66, 63, 64, 74, 66, 76, 73, 66, 63, 64, 63, 64, 209, 237, 66, 77, 66, 285, 75, 284, 63, 64, 78, 79, 277, 80, 66, 82, 276, 87, 85, 268, 267, 83, 84, 63, 64, 81, 64, 86, 256, 66, 63, 64, 63, 64, 98, 255, 66, 88, 66, 105, 106, 99, 89, 254, 90, 91, 107, 236, 63, 64, 235, 92, 101, 102, 66, 108, 234, 206, 93, 94, 95, 205, 109, 63, 64, 204, 100, 203, 96, 66, 97, 63, 64, 115, 119, 103, 104, 66, 118, 160, 52, 52, 52, 119, 159, 120, 120, 120, 158, 55, 116, 157, 110, 64, 56, 121, 57, 57, 57, 122, 122, 63, 64, 123, 123, 123, 58, 66, 117, 116, 114, 45, 63, 64, 121, 111, 112, 113, 66, 72, 63, 64, 63, 64, 125, 58, 66, 62, 66, 63, 64, 63, 64, 63, 64, 66, 61, 66, 126, 66, 50, 49, 127, 63, 64, 48, 128, 63, 64, 66, 63, 64, 45, 66, 294, 129, 66, 63, 64, 63, 64, 63, 64, 66, 294, 66, 294, 66, 63, 64, 63, 64, 294, 131, 66, 130, 66, 294, 63, 64, 63, 64, 294, 132, 66, 294, 66, 63, 64, 63, 64, 63, 64, 66, 133, 66, 294, 66, 134, 63, 64, 136, 138, 135, 137, 66, 63, 64, 63, 64, 63, 64, 66, 294, 66, 294, 66, 140, 63, 64, 63, 64, 139, 294, 66, 294, 66, 63, 64, 63, 64, 294, 142, 66, 141, 66, 294, 63, 64, 63, 64, 294, 143, 66, 144, 66, 146, 63, 64, 294, 294, 145, 294, 66, 294, 148, 63, 64, 63, 64, 63, 64, 66, 294, 66, 147, 66, 151, 294, 150, 63, 64, 63, 64, 63, 64, 66, 294, 66, 149, 66, 63, 64, 152, 63, 64, 155, 66, 294, 294, 66, 156, 63, 64, 153, 154, 294, 294, 66, 63, 64, 63, 64, 294, 294, 66, 294, 66, 166, 166, 118, 294, 167, 167, 167, 294, 294, 120, 120, 120, 168, 168, 294, 294, 169, 169, 169, 121, 123, 123, 123, 170, 167, 167, 167, 169, 169, 169, 123, 123, 123, 63, 64, 63, 64, 294, 121, 66, 294, 66, 294, 161, 294, 294, 162, 294, 294, 163, 164, 165, 294, 172, 294, 173, 174, 63, 64, 63, 64, 63, 64, 66, 294, 66, 294, 66, 294, 63, 64, 294, 176, 294, 177, 66, 63, 64, 63, 64, 294, 175, 66, 294, 66, 63, 64, 63, 64, 63, 64, 66, 294, 66, 294, 66, 63, 64, 294, 63, 64, 294, 66, 294, 178, 66, 294, 294, 63, 64, 63, 64, 180, 179, 66, 294, 66, 181, 294, 63, 64, 183, 63, 64, 184, 66, 294, 182, 66, 63, 64, 63, 64, 63, 64, 66, 294, 66, 294, 66, 294, 185, 63, 64, 63, 64, 63, 64, 66, 294, 66, 186, 66, 294, 63, 64, 294, 187, 294, 189, 66, 63, 64, 63, 64, 294, 294, 66, 190, 66, 191, 188, 63, 64, 63, 64, 192, 294, 66, 294, 66, 63, 64, 294, 63, 64, 294, 66, 63, 64, 66, 294, 193, 195, 66, 294, 194, 63, 64, 63, 64, 63, 64, 66, 294, 66, 294, 66, 63, 64, 196, 63, 64, 199, 66, 197, 200, 66, 294, 198, 63, 64, 207, 294, 294, 208, 66, 294, 201, 167, 167, 167, 169, 169, 169, 63, 64, 63, 64, 63, 64, 66, 202, 66, 294, 66, 294, 294, 210, 294, 63, 64, 212, 63, 64, 211, 66, 294, 294, 66, 63, 64, 294, 213, 63, 64, 66, 294, 63, 64, 66, 63, 64, 214, 66, 215, 294, 66, 63, 64, 216, 294, 217, 294, 66, 63, 64, 63, 64, 63, 64, 66, 218, 66, 294, 66, 294, 63, 64, 63, 64, 294, 219, 66, 294, 66, 220, 63, 64, 63, 64, 294, 294, 66, 294, 66, 294, 221, 63, 64, 63, 64, 63, 64, 66, 294, 66, 222, 66, 63, 64, 63, 64, 63, 64, 66, 294, 66, 294, 66, 63, 64, 223, 63, 64, 294, 66, 294, 294, 66, 63, 64, 294, 224, 63, 64, 66, 225, 63, 64, 66, 294, 63, 64, 66, 228, 294, 226, 66, 63, 64, 294, 63, 64, 227, 66, 63, 64, 66, 63, 64, 294, 66, 294, 230, 66, 63, 64, 63, 64, 294, 211, 66, 294, 66, 229, 63, 64, 63, 64, 294, 294, 66, 294, 66, 238, 231, 233, 239, 241, 240, 63, 64, 232, 63, 64, 211, 66, 294, 294, 66, 63, 64, 294, 242, 63, 64, 66, 63, 64, 294, 66, 211, 294, 66, 63, 64, 63, 64, 63, 64, 66, 294, 66, 294, 66, 63, 64, 63, 64, 63, 64, 66, 294, 66, 294, 66, 63, 64, 63, 64, 63, 64, 66, 294, 66, 294, 66, 243, 294, 63, 64, 294, 244, 294, 245, 66, 247, 294, 294, 63, 64, 248, 294, 246, 249, 66, 63, 64, 63, 64, 63, 64, 66, 294, 66, 294, 66, 63, 64, 252, 63, 64, 294, 66, 250, 294, 66, 294, 257, 294, 258, 63, 64, 294, 251, 63, 64, 66, 211, 253, 294, 66, 63, 64, 294, 294, 211, 294, 66, 294, 211, 63, 64, 63, 64, 63, 64, 66, 294, 66, 294, 66, 63, 64, 63, 64, 63, 64, 66, 294, 66, 294, 66, 63, 64, 63, 64, 294, 294, 66, 294, 66, 294, 259, 63, 64, 63, 64, 294, 294, 66, 260, 66, 294, 262, 63, 64, 294, 63, 64, 294, 66, 261, 294, 66, 294, 294, 294, 264, 294, 269, 263, 265, 211, 63, 64, 63, 64, 63, 64, 66, 294, 66, 294, 66, 63, 64, 266, 63, 64, 294, 66, 63, 64, 66, 63, 64, 294, 66, 63, 64, 66, 294, 63, 64, 66, 63, 64, 271, 66, 63, 64, 66, 63, 64, 294, 66, 294, 294, 66, 270, 63, 64, 273, 272, 63, 64, 66, 211, 294, 274, 66, 63, 64, 63, 64, 294, 294, 66, 294, 66, 294, 275, 63, 64, 294, 278, 63, 64, 66, 63, 64, 294, 66, 279, 281, 66, 282, 63, 64, 63, 64, 280, 294, 66, 286, 66, 63, 64, 63, 64, 283, 294, 66, 294, 66, 63, 64, 294, 289, 63, 64, 66, 294, 294, 294, 66, 287, 294, 294, 288, 46, 46, 46, 46, 65, 65, 65, 66, 66, 63, 63, 3, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294 } ; static yyconst flex_int16_t yy_chk[1262] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 8, 13, 8, 13, 13, 13, 14, 15, 16, 16, 14, 46, 15, 46, 15, 15, 15, 19, 19, 20, 20, 21, 21, 19, 15, 20, 291, 21, 22, 22, 290, 64, 23, 23, 22, 124, 21, 19, 23, 26, 26, 285, 22, 15, 21, 26, 27, 27, 28, 28, 23, 209, 27, 171, 28, 29, 29, 284, 30, 30, 64, 29, 31, 31, 30, 32, 32, 124, 31, 33, 33, 32, 34, 34, 27, 33, 28, 26, 34, 35, 35, 37, 37, 171, 209, 35, 28, 37, 277, 27, 276, 41, 41, 29, 30, 268, 30, 41, 32, 267, 34, 33, 256, 255, 32, 32, 36, 36, 31, 237, 33, 236, 36, 38, 38, 43, 43, 37, 235, 38, 35, 43, 42, 42, 37, 35, 234, 35, 35, 42, 206, 39, 39, 204, 36, 39, 39, 39, 42, 203, 160, 36, 36, 36, 159, 42, 44, 44, 158, 38, 157, 36, 44, 36, 40, 40, 52, 117, 40, 40, 40, 56, 108, 52, 52, 52, 56, 107, 56, 56, 56, 106, 57, 52, 105, 43, 63, 57, 56, 57, 57, 57, 58, 58, 65, 65, 58, 58, 58, 57, 65, 55, 52, 49, 45, 67, 67, 56, 44, 44, 44, 67, 24, 68, 68, 69, 69, 67, 57, 68, 18, 69, 70, 70, 71, 71, 73, 73, 70, 17, 71, 68, 73, 12, 11, 69, 74, 74, 10, 70, 75, 75, 74, 76, 76, 5, 75, 3, 71, 76, 77, 77, 78, 78, 79, 79, 77, 0, 78, 0, 79, 80, 80, 81, 81, 0, 74, 80, 73, 81, 0, 82, 82, 83, 83, 0, 75, 82, 0, 83, 84, 84, 85, 85, 86, 86, 84, 76, 85, 0, 86, 77, 87, 87, 79, 81, 78, 80, 87, 88, 88, 89, 89, 90, 90, 88, 0, 89, 0, 90, 84, 91, 91, 92, 92, 83, 0, 91, 0, 92, 93, 93, 94, 94, 0, 86, 93, 85, 94, 0, 95, 95, 96, 96, 0, 87, 95, 87, 96, 89, 97, 97, 0, 0, 88, 0, 97, 0, 93, 98, 98, 99, 99, 100, 100, 98, 0, 99, 92, 100, 96, 0, 95, 101, 101, 102, 102, 103, 103, 101, 0, 102, 94, 103, 104, 104, 97, 110, 110, 99, 104, 0, 0, 110, 100, 111, 111, 98, 98, 0, 0, 111, 112, 112, 113, 113, 0, 0, 112, 0, 113, 116, 116, 120, 0, 116, 116, 116, 0, 0, 120, 120, 120, 121, 121, 0, 0, 121, 121, 121, 120, 122, 122, 122, 123, 166, 166, 166, 168, 168, 168, 123, 123, 123, 125, 125, 126, 126, 0, 120, 125, 0, 126, 0, 111, 0, 0, 112, 0, 0, 113, 113, 113, 0, 125, 0, 125, 126, 127, 127, 128, 128, 129, 129, 127, 0, 128, 0, 129, 0, 130, 130, 0, 128, 0, 129, 130, 131, 131, 132, 132, 0, 127, 131, 0, 132, 133, 133, 134, 134, 135, 135, 133, 0, 134, 0, 135, 136, 136, 0, 137, 137, 0, 136, 0, 130, 137, 0, 0, 138, 138, 139, 139, 132, 131, 138, 0, 139, 133, 0, 140, 140, 135, 141, 141, 136, 140, 0, 134, 141, 142, 142, 143, 143, 144, 144, 142, 0, 143, 0, 144, 0, 137, 145, 145, 146, 146, 147, 147, 145, 0, 146, 139, 147, 0, 148, 148, 0, 140, 0, 143, 148, 149, 149, 150, 150, 0, 0, 149, 144, 150, 145, 142, 151, 151, 152, 152, 146, 0, 151, 0, 152, 153, 153, 0, 154, 154, 0, 153, 155, 155, 154, 0, 147, 149, 155, 0, 148, 156, 156, 161, 161, 162, 162, 156, 0, 161, 0, 162, 163, 163, 150, 164, 164, 153, 163, 151, 154, 164, 0, 152, 165, 165, 167, 0, 0, 169, 165, 0, 155, 167, 167, 167, 169, 169, 169, 172, 172, 173, 173, 174, 174, 172, 156, 173, 0, 174, 0, 0, 172, 0, 175, 175, 174, 176, 176, 173, 175, 0, 0, 176, 177, 177, 0, 175, 178, 178, 177, 0, 179, 179, 178, 180, 180, 176, 179, 176, 0, 180, 181, 181, 177, 0, 177, 0, 181, 182, 182, 183, 183, 184, 184, 182, 178, 183, 0, 184, 0, 185, 185, 186, 186, 0, 179, 185, 0, 186, 180, 187, 187, 188, 188, 0, 0, 187, 0, 188, 0, 182, 189, 189, 190, 190, 191, 191, 189, 0, 190, 184, 191, 192, 192, 193, 193, 194, 194, 192, 0, 193, 0, 194, 195, 195, 186, 196, 196, 0, 195, 0, 0, 196, 197, 197, 0, 187, 198, 198, 197, 189, 199, 199, 198, 0, 200, 200, 199, 194, 0, 191, 200, 201, 201, 0, 202, 202, 193, 201, 210, 210, 202, 211, 211, 0, 210, 0, 198, 211, 212, 212, 213, 213, 0, 210, 212, 0, 213, 197, 214, 214, 215, 215, 0, 0, 214, 0, 215, 212, 200, 202, 213, 214, 213, 216, 216, 201, 217, 217, 215, 216, 0, 0, 217, 218, 218, 0, 216, 219, 219, 218, 220, 220, 0, 219, 217, 0, 220, 221, 221, 222, 222, 223, 223, 221, 0, 222, 0, 223, 224, 224, 225, 225, 226, 226, 224, 0, 225, 0, 226, 227, 227, 228, 228, 229, 229, 227, 0, 228, 0, 229, 219, 0, 231, 231, 0, 220, 0, 222, 231, 224, 0, 0, 230, 230, 226, 0, 223, 227, 230, 232, 232, 233, 233, 238, 238, 232, 0, 233, 0, 238, 239, 239, 231, 240, 240, 0, 239, 229, 0, 240, 0, 238, 0, 239, 241, 241, 0, 230, 242, 242, 241, 240, 232, 0, 242, 243, 243, 0, 0, 241, 0, 243, 0, 242, 244, 244, 245, 245, 246, 246, 244, 0, 245, 0, 246, 247, 247, 248, 248, 249, 249, 247, 0, 248, 0, 249, 250, 250, 251, 251, 0, 0, 250, 0, 251, 0, 243, 252, 252, 253, 253, 0, 0, 252, 244, 253, 0, 247, 257, 257, 0, 258, 258, 0, 257, 245, 0, 258, 0, 0, 0, 250, 0, 257, 249, 252, 258, 259, 259, 260, 260, 261, 261, 259, 0, 260, 0, 261, 262, 262, 253, 263, 263, 0, 262, 265, 265, 263, 264, 264, 0, 265, 266, 266, 264, 0, 269, 269, 266, 270, 270, 260, 269, 271, 271, 270, 273, 273, 0, 271, 0, 0, 273, 259, 272, 272, 264, 263, 274, 274, 272, 269, 0, 265, 274, 275, 275, 278, 278, 0, 0, 275, 0, 278, 0, 266, 279, 279, 0, 270, 281, 281, 279, 280, 280, 0, 281, 271, 273, 280, 274, 282, 282, 283, 283, 272, 0, 282, 278, 283, 286, 286, 287, 287, 275, 0, 286, 0, 287, 288, 288, 0, 281, 289, 289, 288, 0, 0, 0, 289, 279, 0, 0, 280, 295, 295, 295, 295, 296, 296, 296, 297, 297, 298, 298, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294 } ; /* Table of booleans, true if rule could match eol. */ static yyconst flex_int32_t yy_rule_can_match_eol[90] = { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, }; /* The intent behind this definition is that it'll catch * any uses of REJECT which flex missed. */ #define REJECT reject_used_but_not_detected #define yymore() yymore_used_but_not_detected #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET #line 1 "../../src-common/cfdg.l" /* cfdg.l // this file is part of Context Free // --------------------- // Copyright (C) 2005-2008 Mark Lentczner - markl@glyphic.com // Copyright (C) 2005-2009 John Horigan - john@glyphic.com // Copyright (C) 2005 Chris Coyne - ccoyne77@gmail.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // Mark Lentczner can be contacted at markl@glyphic.com or at // Mark Lentczner, 1209 Villa St., Mountain View, CA 94041-1123, USA // */ #line 32 "../../src-common/cfdg.l" #define YY_NO_UNISTD_H #include "builder.h" #include "scanner.h" #include "astexpression.h" #include "cfdg.tab.hpp" /* import the parser's token type into a local typedef */ typedef yy::CfdgParser::token token; typedef yy::CfdgParser::token_type token_type; /* calling this externally */ /* don't want yywrap to exist.*/ /* The following paragraph suffices to track locations accurately. Each time * yylex is invoked, the begin position is moved onto the end position. */ #line 66 "../../src-common/cfdg.l" #define YY_USER_ACTION yylloc->columns(utf8length(yytext, yyleng)); #line 854 "lex.yy.cpp" #define INITIAL 0 #ifndef YY_NO_UNISTD_H /* Special case for "unistd.h", since it is non-ANSI. We include it way * down here because we want the user's section 1 to have been scanned first. * The user has a chance to override it with an option. */ #include #endif #ifndef YY_EXTRA_TYPE #define YY_EXTRA_TYPE void * #endif #ifndef yytext_ptr static void yy_flex_strncpy (char *,yyconst char *,int ); #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * ); #endif #ifndef YY_NO_INPUT #endif /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE #define YY_READ_BUF_SIZE 8192 #endif /* Copy whatever the last rule matched to the standard output. */ #ifndef ECHO #define ECHO LexerOutput( yytext, yyleng ) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #ifndef YY_INPUT #define YY_INPUT(buf,result,max_size) \ \ if ( (result = LexerInput( (char *) buf, max_size )) < 0 ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); #endif /* No semi-colon after return; correct usage is to write "yyterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */ #ifndef yyterminate #define yyterminate() return YY_NULL #endif /* Number of entries by which start-condition stack grows. */ #ifndef YY_START_STACK_INCR #define YY_START_STACK_INCR 25 #endif /* Report a fatal error. */ #ifndef YY_FATAL_ERROR #define YY_FATAL_ERROR(msg) LexerError( msg ) #endif /* end tables serialization structures and prototypes */ /* Default declaration of generated scanner - a define so the user can * easily add parameters. */ #ifndef YY_DECL #define YY_DECL_IS_OURS 1 #define YY_DECL int yyFlexLexer::yylex() #endif /* !YY_DECL */ /* Code executed at the beginning of each rule, after yytext and yyleng * have been set up. */ #ifndef YY_USER_ACTION #define YY_USER_ACTION #endif /* Code executed at the end of each rule. */ #ifndef YY_BREAK #define YY_BREAK break; #endif #define YY_RULE_SETUP \ YY_USER_ACTION /** The main scanner function which does all the work. */ YY_DECL { register yy_state_type yy_current_state; register char *yy_cp, *yy_bp; register int yy_act; #line 69 "../../src-common/cfdg.l" /* code to place at the beginning of yylex() */ // reset location setupLoc(yylloc); if (atStartup) { int t = startToken; atStartup = false; return t; } /* comment line */ #line 970 "lex.yy.cpp" if ( !(yy_init) ) { (yy_init) = 1; #ifdef YY_USER_INIT YY_USER_INIT; #endif if ( ! (yy_start) ) (yy_start) = 1; /* first start state */ if ( ! yyin ) yyin = & std::cin; if ( ! yyout ) yyout = & std::cout; if ( ! YY_CURRENT_BUFFER ) { yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer( yyin, YY_BUF_SIZE ); } yy_load_buffer_state( ); } while ( 1 ) /* loops until end-of-file is reached */ { yy_cp = (yy_c_buf_p); /* Support of yytext. */ *yy_cp = (yy_hold_char); /* yy_bp points to the position in yy_ch_buf of the start of * the current run. */ yy_bp = yy_cp; yy_current_state = (yy_start); yy_match: do { register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 295 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; ++yy_cp; } while ( yy_current_state != 294 ); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); yy_find_action: yy_act = yy_accept[yy_current_state]; YY_DO_BEFORE_ACTION; if ( yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act] ) { int yyl; for ( yyl = 0; yyl < yyleng; ++yyl ) if ( yytext[yyl] == '\n' ) yylineno++; ; } do_action: /* This label is used only to access EOF actions. */ switch ( yy_act ) { /* beginning of action switch */ case 0: /* must back up */ /* undo the effects of YY_DO_BEFORE_ACTION */ *yy_cp = (yy_hold_char); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); goto yy_find_action; case 1: YY_RULE_SETUP #line 84 "../../src-common/cfdg.l" { int c; while ((c = yyinput()) != EOF) { if (c == '\n') break; } yylloc->lines(1); yylloc->step(); } YY_BREAK /* C-style comment */ case 2: YY_RULE_SETUP #line 96 "../../src-common/cfdg.l" { int c; bool lastCharWasAStar = false; // stop when we get to */ or end-of-file while ((c = yyinput()) != EOF) { if (c == '\n') yylloc->lines(1); else yylloc->columns(); if (c == '/' && lastCharWasAStar) break; lastCharWasAStar = c == '*'; } if (c == EOF) { LexerError("end-of-file in block comment"); return token::BADEOF; } yylloc->step(); // move on to next token } YY_BREAK /* Quoted string */ case 3: /* rule 3 can match eol */ YY_RULE_SETUP #line 122 "../../src-common/cfdg.l" { /* \042 is " in ASCII */ if (yytext[yyleng - 1] != '\042') { LexerError("end-of-line in quoted string"); return token::BADEOF; } else { yylval->string = new std::string(yytext + 1, yyleng - 2); return token::USER_QSTRING; } } YY_BREAK case 4: YY_RULE_SETUP #line 132 "../../src-common/cfdg.l" {return token::STARTSHAPE;} YY_BREAK case 5: YY_RULE_SETUP #line 133 "../../src-common/cfdg.l" {return token::BACKGROUND;} YY_BREAK case 6: YY_RULE_SETUP #line 134 "../../src-common/cfdg.l" {return token::INCLUDE;} YY_BREAK case 7: YY_RULE_SETUP #line 135 "../../src-common/cfdg.l" {return token::IMPORT;} YY_BREAK case 8: YY_RULE_SETUP #line 136 "../../src-common/cfdg.l" {return token::TILE;} YY_BREAK case 9: YY_RULE_SETUP #line 137 "../../src-common/cfdg.l" {return token::RULE;} YY_BREAK case 10: YY_RULE_SETUP #line 138 "../../src-common/cfdg.l" {return token::PATH;} YY_BREAK case 11: YY_RULE_SETUP #line 139 "../../src-common/cfdg.l" {return token::SHAPE;} YY_BREAK case 12: YY_RULE_SETUP #line 140 "../../src-common/cfdg.l" {return token::LOOP;} YY_BREAK case 13: YY_RULE_SETUP #line 141 "../../src-common/cfdg.l" {return token::CLONE;} YY_BREAK case 14: YY_RULE_SETUP #line 142 "../../src-common/cfdg.l" {return token::LET;} YY_BREAK case 15: YY_RULE_SETUP #line 143 "../../src-common/cfdg.l" {return token::BECOMES;} YY_BREAK case 16: YY_RULE_SETUP #line 144 "../../src-common/cfdg.l" {return token::FINALLY;} YY_BREAK case 17: YY_RULE_SETUP #line 145 "../../src-common/cfdg.l" {return token::IF;} YY_BREAK case 18: YY_RULE_SETUP #line 146 "../../src-common/cfdg.l" {return token::ELSE;} YY_BREAK case 19: YY_RULE_SETUP #line 147 "../../src-common/cfdg.l" {return token::SWITCH;} YY_BREAK case 20: YY_RULE_SETUP #line 148 "../../src-common/cfdg.l" {return token::CASE;} YY_BREAK case 21: YY_RULE_SETUP #line 149 "../../src-common/cfdg.l" {return token::RANGEOP;} YY_BREAK case 22: YY_RULE_SETUP #line 150 "../../src-common/cfdg.l" {return token::RANGEOP;} YY_BREAK case 23: YY_RULE_SETUP #line 151 "../../src-common/cfdg.l" {return token::PLUSMINUSOP;} YY_BREAK case 24: YY_RULE_SETUP #line 152 "../../src-common/cfdg.l" {return token::PLUSMINUSOP;} YY_BREAK case 25: YY_RULE_SETUP #line 153 "../../src-common/cfdg.l" {return token::CF_INFINITY;} YY_BREAK case 26: YY_RULE_SETUP #line 155 "../../src-common/cfdg.l" {yylval->modToken = AST::ASTmodTerm::time; return token::MODTYPE;} YY_BREAK case 27: YY_RULE_SETUP #line 156 "../../src-common/cfdg.l" {yylval->modToken = AST::ASTmodTerm::timescale; return token::MODTYPE;} YY_BREAK case 28: YY_RULE_SETUP #line 157 "../../src-common/cfdg.l" {yylval->modToken = AST::ASTmodTerm::rot; return token::MODTYPE;} YY_BREAK case 29: YY_RULE_SETUP #line 158 "../../src-common/cfdg.l" {yylval->modToken = AST::ASTmodTerm::rot; return token::MODTYPE;} YY_BREAK case 30: YY_RULE_SETUP #line 159 "../../src-common/cfdg.l" {yylval->modToken = AST::ASTmodTerm::flip; return token::MODTYPE;} YY_BREAK case 31: YY_RULE_SETUP #line 160 "../../src-common/cfdg.l" {yylval->modToken = AST::ASTmodTerm::flip; return token::MODTYPE;} YY_BREAK case 32: YY_RULE_SETUP #line 161 "../../src-common/cfdg.l" {yylval->modToken = AST::ASTmodTerm::hue; return token::MODTYPE;} YY_BREAK case 33: YY_RULE_SETUP #line 162 "../../src-common/cfdg.l" {yylval->modToken = AST::ASTmodTerm::hue; return token::MODTYPE;} YY_BREAK case 34: YY_RULE_SETUP #line 163 "../../src-common/cfdg.l" {yylval->modToken = AST::ASTmodTerm::sat; return token::MODTYPE;} YY_BREAK case 35: YY_RULE_SETUP #line 164 "../../src-common/cfdg.l" {yylval->modToken = AST::ASTmodTerm::sat; return token::MODTYPE;} YY_BREAK case 36: YY_RULE_SETUP #line 165 "../../src-common/cfdg.l" {yylval->modToken = AST::ASTmodTerm::bright; return token::MODTYPE;} YY_BREAK case 37: YY_RULE_SETUP #line 166 "../../src-common/cfdg.l" {yylval->modToken = AST::ASTmodTerm::bright; return token::MODTYPE;} YY_BREAK case 38: YY_RULE_SETUP #line 167 "../../src-common/cfdg.l" {yylval->modToken = AST::ASTmodTerm::alpha; return token::MODTYPE;} YY_BREAK case 39: YY_RULE_SETUP #line 168 "../../src-common/cfdg.l" {yylval->modToken = AST::ASTmodTerm::alpha; return token::MODTYPE;} YY_BREAK case 40: YY_RULE_SETUP #line 169 "../../src-common/cfdg.l" {yylval->modToken = AST::ASTmodTerm::transform; return token::MODTYPE;} YY_BREAK case 41: YY_RULE_SETUP #line 170 "../../src-common/cfdg.l" {yylval->modToken = AST::ASTmodTerm::transform; return token::MODTYPE;} YY_BREAK case 42: YY_RULE_SETUP #line 171 "../../src-common/cfdg.l" {yylval->modToken = AST::ASTmodTerm::x; return token::MODTYPE;} YY_BREAK case 43: YY_RULE_SETUP #line 172 "../../src-common/cfdg.l" {yylval->modToken = AST::ASTmodTerm::y; return token::MODTYPE;} YY_BREAK case 44: YY_RULE_SETUP #line 173 "../../src-common/cfdg.l" {yylval->modToken = AST::ASTmodTerm::z; return token::MODTYPE;} YY_BREAK case 45: YY_RULE_SETUP #line 174 "../../src-common/cfdg.l" {yylval->modToken = AST::ASTmodTerm::size; return token::MODTYPE;} YY_BREAK case 46: YY_RULE_SETUP #line 175 "../../src-common/cfdg.l" {yylval->modToken = AST::ASTmodTerm::size; return token::MODTYPE;} YY_BREAK case 47: YY_RULE_SETUP #line 176 "../../src-common/cfdg.l" {yylval->modToken = AST::ASTmodTerm::skew; return token::MODTYPE;} YY_BREAK case 48: YY_RULE_SETUP #line 177 "../../src-common/cfdg.l" {yylval->modToken = AST::ASTmodTerm::targHue; return token::MODTYPE;} YY_BREAK case 49: YY_RULE_SETUP #line 178 "../../src-common/cfdg.l" {yylval->modToken = AST::ASTmodTerm::targHue; return token::MODTYPE;} YY_BREAK case 50: YY_RULE_SETUP #line 179 "../../src-common/cfdg.l" {yylval->modToken = AST::ASTmodTerm::targSat; return token::MODTYPE;} YY_BREAK case 51: YY_RULE_SETUP #line 180 "../../src-common/cfdg.l" {yylval->modToken = AST::ASTmodTerm::targSat; return token::MODTYPE;} YY_BREAK case 52: YY_RULE_SETUP #line 181 "../../src-common/cfdg.l" {yylval->modToken = AST::ASTmodTerm::targBright; return token::MODTYPE;} YY_BREAK case 53: YY_RULE_SETUP #line 182 "../../src-common/cfdg.l" {yylval->modToken = AST::ASTmodTerm::targBright; return token::MODTYPE;} YY_BREAK case 54: YY_RULE_SETUP #line 183 "../../src-common/cfdg.l" {yylval->modToken = AST::ASTmodTerm::targAlpha; return token::MODTYPE;} YY_BREAK case 55: YY_RULE_SETUP #line 184 "../../src-common/cfdg.l" {yylval->modToken = AST::ASTmodTerm::targAlpha; return token::MODTYPE;} YY_BREAK case 56: YY_RULE_SETUP #line 186 "../../src-common/cfdg.l" { if (startToken == token::CFDG2) { yylval->modToken = AST::ASTmodTerm::param; return token::PARAM; } else { yylval->string = new std::string(yytext); return token::USER_STRING; } } YY_BREAK case 57: YY_RULE_SETUP #line 195 "../../src-common/cfdg.l" { if (startToken == token::CFDG2) { yylval->modToken = AST::ASTmodTerm::param; return token::PARAM; } else { yylval->string = new std::string(yytext); return token::USER_STRING; } } YY_BREAK case 58: YY_RULE_SETUP #line 204 "../../src-common/cfdg.l" { if (startToken == token::CFDG2) { yylval->modToken = AST::ASTmodTerm::stroke; return token::MODTYPE; } else { yylval->string = new std::string(yytext); return token::USER_STRING; } } YY_BREAK case 59: YY_RULE_SETUP #line 213 "../../src-common/cfdg.l" { if (startToken == token::CFDG2) { yylval->modToken = AST::ASTmodTerm::x1; return token::MODTYPE; } else { yylval->string = new std::string(yytext); return token::USER_STRING; } } YY_BREAK case 60: YY_RULE_SETUP #line 222 "../../src-common/cfdg.l" { if (startToken == token::CFDG2) { yylval->modToken = AST::ASTmodTerm::y1; return token::MODTYPE; } else { yylval->string = new std::string(yytext); return token::USER_STRING; } } YY_BREAK case 61: YY_RULE_SETUP #line 231 "../../src-common/cfdg.l" { if (startToken == token::CFDG2) { yylval->modToken = AST::ASTmodTerm::x2; return token::MODTYPE; } else { yylval->string = new std::string(yytext); return token::USER_STRING; } } YY_BREAK case 62: YY_RULE_SETUP #line 240 "../../src-common/cfdg.l" { if (startToken == token::CFDG2) { yylval->modToken = AST::ASTmodTerm::y2; return token::MODTYPE; } else { yylval->string = new std::string(yytext); return token::USER_STRING; } } YY_BREAK case 63: YY_RULE_SETUP #line 249 "../../src-common/cfdg.l" { if (startToken == token::CFDG2) { yylval->modToken = AST::ASTmodTerm::xrad; return token::MODTYPE; } else { yylval->string = new std::string(yytext); return token::USER_STRING; } } YY_BREAK case 64: YY_RULE_SETUP #line 258 "../../src-common/cfdg.l" { if (startToken == token::CFDG2) { yylval->modToken = AST::ASTmodTerm::yrad; return token::MODTYPE; } else { yylval->string = new std::string(yytext); return token::USER_STRING; } } YY_BREAK case 65: YY_RULE_SETUP #line 268 "../../src-common/cfdg.l" { return token::LT; } YY_BREAK case 66: YY_RULE_SETUP #line 269 "../../src-common/cfdg.l" { return token::LE; } YY_BREAK case 67: YY_RULE_SETUP #line 270 "../../src-common/cfdg.l" { return token::LE; } YY_BREAK case 68: YY_RULE_SETUP #line 271 "../../src-common/cfdg.l" { return token::GT; } YY_BREAK case 69: YY_RULE_SETUP #line 272 "../../src-common/cfdg.l" { return token::GE; } YY_BREAK case 70: YY_RULE_SETUP #line 273 "../../src-common/cfdg.l" { return token::GE; } YY_BREAK case 71: YY_RULE_SETUP #line 274 "../../src-common/cfdg.l" { return token::EQ; } YY_BREAK case 72: YY_RULE_SETUP #line 275 "../../src-common/cfdg.l" { return token::NEQ; } YY_BREAK case 73: YY_RULE_SETUP #line 276 "../../src-common/cfdg.l" { return token::NEQ; } YY_BREAK case 74: YY_RULE_SETUP #line 277 "../../src-common/cfdg.l" { return token::NOT; } YY_BREAK case 75: YY_RULE_SETUP #line 278 "../../src-common/cfdg.l" { return token::AND; } YY_BREAK case 76: YY_RULE_SETUP #line 279 "../../src-common/cfdg.l" { return token::OR; } YY_BREAK case 77: YY_RULE_SETUP #line 280 "../../src-common/cfdg.l" { return token::XOR; } YY_BREAK case 78: YY_RULE_SETUP #line 281 "../../src-common/cfdg.l" { return '_'; } YY_BREAK case 79: YY_RULE_SETUP #line 283 "../../src-common/cfdg.l" {yylval->string = new std::string(yytext); return token::USER_PATHOP;} YY_BREAK case 80: YY_RULE_SETUP #line 284 "../../src-common/cfdg.l" { // This greedy string regex gobbles up Unicode operators. Find the first one // and chop the string there. yylval->string = new std::string(yytext); size_t pos = std::string::npos; token_type tok = token::USER_STRING; for (tokenMap::iterator it = utf8chars.begin(), eit = utf8chars.end(); it != eit; ++it) { size_t spos = yylval->string->find(it->second); if (spos != std::string::npos && (spos < pos || pos == std::string::npos)) { pos = spos; tok = it->first; } } if (pos == 0) { // Unicode operator found at 1st char, Unread all but the operator and // return the token for the operator. delete yylval->string; yylval->string = 0; size_t len = strlen(utf8chars[tok]); (yylloc->end) = (yylloc->begin); yylloc->columns(1); yyless(len); return tok; } if (pos != std::string::npos) { // Unicode operator found after 1st char. Unread everything from operator to // end of string and truncate string before operator. yylval->string->resize(pos); (yylloc->end) = (yylloc->begin); yylloc->columns(utf8length(yytext, pos)); yyless(pos); return token::USER_STRING; } int c = yyinput(); if (c != EOF) unput(c); return c == '[' ? token::USER_ARRAYNAME : token::USER_STRING; } YY_BREAK case 81: YY_RULE_SETUP #line 325 "../../src-common/cfdg.l" {yylval->string = new std::string(yytext); return token::USER_RATIONAL;} YY_BREAK case 82: YY_RULE_SETUP #line 326 "../../src-common/cfdg.l" {yylval->string = new std::string(yytext); return token::USER_RATIONAL;} YY_BREAK case 83: YY_RULE_SETUP #line 327 "../../src-common/cfdg.l" { yylval->string = new std::string(yytext, yyleng - 2); yyless(yyleng - 2); (yylloc->end) += -2; return token::USER_RATIONAL; } YY_BREAK case 84: YY_RULE_SETUP #line 333 "../../src-common/cfdg.l" {yylval->string = new std::string(yytext); return token::USER_RATIONAL;} YY_BREAK case 85: YY_RULE_SETUP #line 334 "../../src-common/cfdg.l" {yylval->string = new std::string(yytext); return token::USER_FILENAME;} YY_BREAK /* gobble up white-spaces */ case 86: YY_RULE_SETUP #line 337 "../../src-common/cfdg.l" { yylloc->step(); } YY_BREAK /* gobble up end-of-lines */ case 87: /* rule 87 can match eol */ YY_RULE_SETUP #line 342 "../../src-common/cfdg.l" { yylloc->lines(1); yylloc->step(); } YY_BREAK /* pass all other characters up to bison */ case 88: YY_RULE_SETUP #line 347 "../../src-common/cfdg.l" { return static_cast(*yytext); } YY_BREAK case YY_STATE_EOF(INITIAL): #line 351 "../../src-common/cfdg.l" { if (!YY_CURRENT_BUFFER) yyterminate(); if (!mLocationStack.empty()) { *yylloc = mLocationStack.top(); mLocationStack.pop(); } yylloc->step(); return token::GOODEOF; } YY_BREAK case 89: YY_RULE_SETUP #line 362 "../../src-common/cfdg.l" ECHO; YY_BREAK #line 1687 "lex.yy.cpp" case YY_END_OF_BUFFER: { /* Amount of text matched not including the EOB char. */ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; /* Undo the effects of YY_DO_BEFORE_ACTION. */ *yy_cp = (yy_hold_char); YY_RESTORE_YY_MORE_OFFSET if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) { /* We're scanning a new file or input source. It's * possible that this happened because the user * just pointed yyin at a new source and called * yylex(). If so, then we have to assure * consistency between YY_CURRENT_BUFFER and our * globals. Here is the right place to do so, because * this is the first action (other than possibly a * back-up) that will match for the new input source. */ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; } /* Note that here we test for yy_c_buf_p "<=" to the position * of the first EOB in the buffer, since yy_c_buf_p will * already have been incremented past the NUL character * (since all states make transitions on EOB to the * end-of-buffer state). Contrast this with the test * in input(). */ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) { /* This was really a NUL. */ yy_state_type yy_next_state; (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); /* Okay, we're now positioned to make the NUL * transition. We couldn't have * yy_get_previous_state() go ahead and do it * for us because it doesn't know how to deal * with the possibility of jamming (and we don't * want to build jamming into it because then it * will run more slowly). */ yy_next_state = yy_try_NUL_trans( yy_current_state ); yy_bp = (yytext_ptr) + YY_MORE_ADJ; if ( yy_next_state ) { /* Consume the NUL. */ yy_cp = ++(yy_c_buf_p); yy_current_state = yy_next_state; goto yy_match; } else { yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); goto yy_find_action; } } else switch ( yy_get_next_buffer( ) ) { case EOB_ACT_END_OF_FILE: { (yy_did_buffer_switch_on_eof) = 0; if ( yywrap( ) ) { /* Note: because we've taken care in * yy_get_next_buffer() to have set up * yytext, we can now set up * yy_c_buf_p so that if some total * hoser (like flex itself) wants to * call the scanner after we return the * YY_NULL, it'll still work - another * YY_NULL will get returned. */ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; yy_act = YY_STATE_EOF(YY_START); goto do_action; } else { if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; } break; } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_match; case EOB_ACT_LAST_MATCH: (yy_c_buf_p) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_find_action; } break; } default: YY_FATAL_ERROR( "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ } /* end of yylex */ /* The contents of this function are C++ specific, so the () macro is not used. */ yyFlexLexer::yyFlexLexer( std::istream* arg_yyin, std::ostream* arg_yyout ) { yyin = arg_yyin; yyout = arg_yyout; yy_c_buf_p = 0; yy_init = 0; yy_start = 0; yy_flex_debug = 0; yylineno = 1; // this will only get updated if %option yylineno yy_did_buffer_switch_on_eof = 0; yy_looking_for_trail_begin = 0; yy_more_flag = 0; yy_more_len = 0; yy_more_offset = yy_prev_more_offset = 0; yy_start_stack_ptr = yy_start_stack_depth = 0; yy_start_stack = NULL; yy_buffer_stack = 0; yy_buffer_stack_top = 0; yy_buffer_stack_max = 0; yy_state_buf = 0; } /* The contents of this function are C++ specific, so the () macro is not used. */ yyFlexLexer::~yyFlexLexer() { delete [] yy_state_buf; Cfdgfree(yy_start_stack ); yy_delete_buffer( YY_CURRENT_BUFFER ); Cfdgfree(yy_buffer_stack ); } /* The contents of this function are C++ specific, so the () macro is not used. */ void yyFlexLexer::switch_streams( std::istream* new_in, std::ostream* new_out ) { if ( new_in ) { yy_delete_buffer( YY_CURRENT_BUFFER ); yy_switch_to_buffer( yy_create_buffer( new_in, YY_BUF_SIZE ) ); } if ( new_out ) yyout = new_out; } #ifdef YY_INTERACTIVE int yyFlexLexer::LexerInput( char* buf, int /* max_size */ ) #else int yyFlexLexer::LexerInput( char* buf, int max_size ) #endif { if ( yyin->eof() || yyin->fail() ) return 0; #ifdef YY_INTERACTIVE yyin->get( buf[0] ); if ( yyin->eof() ) return 0; if ( yyin->bad() ) return -1; return 1; #else (void) yyin->read( buf, max_size ); if ( yyin->bad() ) return -1; else return yyin->gcount(); #endif } void yyFlexLexer::LexerOutput( const char* buf, int size ) { (void) yyout->write( buf, size ); } /* yy_get_next_buffer - try to read in a new buffer * * Returns a code representing an action: * EOB_ACT_LAST_MATCH - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ int yyFlexLexer::yy_get_next_buffer() { register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; register char *source = (yytext_ptr); register int number_to_move, i; int ret_val; if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) { /* Don't try to fill the buffer, so this is an EOF. */ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) { /* We matched a single character, the EOB, so * treat this as a final EOF. */ return EOB_ACT_END_OF_FILE; } else { /* We matched some text prior to the EOB, first * process it. */ return EOB_ACT_LAST_MATCH; } } /* Try to read more data. */ /* First move last chars to start of buffer. */ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; else { yy_size_t num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ /* just a shorter name for the current buffer */ YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE; int yy_c_buf_p_offset = (int) ((yy_c_buf_p) - b->yy_ch_buf); if ( b->yy_is_our_buffer ) { yy_size_t new_size = b->yy_buf_size * 2; if ( new_size <= 0 ) b->yy_buf_size += b->yy_buf_size / 8; else b->yy_buf_size *= 2; b->yy_ch_buf = (char *) /* Include room in for 2 EOB chars. */ Cfdgrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); } else /* Can't grow it, we don't own it. */ b->yy_ch_buf = 0; if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "fatal error - scanner input buffer overflow" ); (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; } if ( num_to_read > YY_READ_BUF_SIZE ) num_to_read = YY_READ_BUF_SIZE; /* Read in more data. */ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), (yy_n_chars), num_to_read ); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } if ( (yy_n_chars) == 0 ) { if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; yyrestart( yyin ); } else { ret_val = EOB_ACT_LAST_MATCH; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_EOF_PENDING; } } else ret_val = EOB_ACT_CONTINUE_SCAN; if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { /* Extend the array by 50%, plus the number we really need. */ yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) Cfdgrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); } (yy_n_chars) += number_to_move; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; return ret_val; } /* yy_get_previous_state - get the state just before the EOB char was reached */ yy_state_type yyFlexLexer::yy_get_previous_state() { register yy_state_type yy_current_state; register char *yy_cp; yy_current_state = (yy_start); for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) { register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 295 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; } return yy_current_state; } /* yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = yy_try_NUL_trans( current_state ); */ yy_state_type yyFlexLexer::yy_try_NUL_trans( yy_state_type yy_current_state ) { register int yy_is_jam; register char *yy_cp = (yy_c_buf_p); register YY_CHAR yy_c = 1; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 295 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; yy_is_jam = (yy_current_state == 294); return yy_is_jam ? 0 : yy_current_state; } void yyFlexLexer::yyunput( int c, register char* yy_bp) { register char *yy_cp; yy_cp = (yy_c_buf_p); /* undo effects of setting up yytext */ *yy_cp = (yy_hold_char); if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) { /* need to shift things up to make room */ /* +2 for EOB chars. */ register yy_size_t number_to_move = (yy_n_chars) + 2; register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; register char *source = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) *--dest = *--source; yy_cp += (int) (dest - source); yy_bp += (int) (dest - source); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) YY_FATAL_ERROR( "flex scanner push-back overflow" ); } *--yy_cp = (char) c; if ( c == '\n' ){ --yylineno; } (yytext_ptr) = yy_bp; (yy_hold_char) = *yy_cp; (yy_c_buf_p) = yy_cp; } int yyFlexLexer::yyinput() { int c; *(yy_c_buf_p) = (yy_hold_char); if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) { /* yy_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) /* This was really a NUL. */ *(yy_c_buf_p) = '\0'; else { /* need more input */ yy_size_t offset = (yy_c_buf_p) - (yytext_ptr); ++(yy_c_buf_p); switch ( yy_get_next_buffer( ) ) { case EOB_ACT_LAST_MATCH: /* This happens because yy_g_n_b() * sees that we've accumulated a * token and flags that we need to * try matching the token before * proceeding. But for input(), * there's no matching to consider. * So convert the EOB_ACT_LAST_MATCH * to EOB_ACT_END_OF_FILE. */ /* Reset buffer status. */ yyrestart( yyin ); /*FALLTHROUGH*/ case EOB_ACT_END_OF_FILE: { if ( yywrap( ) ) return EOF; if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; #ifdef __cplusplus return yyinput(); #else return input(); #endif } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + offset; break; } } } c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ *(yy_c_buf_p) = '\0'; /* preserve yytext */ (yy_hold_char) = *++(yy_c_buf_p); if ( c == '\n' ) yylineno++; ; return c; } /** Immediately switch to a different input stream. * @param input_file A readable stream. * * @note This function does not reset the start condition to @c INITIAL . */ void yyFlexLexer::yyrestart( std::istream* input_file ) { if ( ! YY_CURRENT_BUFFER ){ yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer( yyin, YY_BUF_SIZE ); } yy_init_buffer( YY_CURRENT_BUFFER, input_file ); yy_load_buffer_state( ); } /** Switch to a different input buffer. * @param new_buffer The new input buffer. * */ void yyFlexLexer::yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) { /* TODO. We should be able to replace this entire function body * with * yypop_buffer_state(); * yypush_buffer_state(new_buffer); */ yyensure_buffer_stack (); if ( YY_CURRENT_BUFFER == new_buffer ) return; if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } YY_CURRENT_BUFFER_LVALUE = new_buffer; yy_load_buffer_state( ); /* We don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag * is looked at is after yywrap() is called, so it's safe * to go ahead and always set it. */ (yy_did_buffer_switch_on_eof) = 1; } void yyFlexLexer::yy_load_buffer_state() { (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; (yy_hold_char) = *(yy_c_buf_p); } /** Allocate and initialize an input buffer state. * @param file A readable stream. * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. * * @return the allocated buffer state. */ YY_BUFFER_STATE yyFlexLexer::yy_create_buffer( std::istream* file, int size ) { YY_BUFFER_STATE b; b = (YY_BUFFER_STATE) Cfdgalloc(sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_buf_size = size; /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ b->yy_ch_buf = (char *) Cfdgalloc(b->yy_buf_size + 2 ); if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_is_our_buffer = 1; yy_init_buffer( b, file ); return b; } /** Destroy the buffer. * @param b a buffer created with yy_create_buffer() * */ void yyFlexLexer::yy_delete_buffer( YY_BUFFER_STATE b ) { if ( ! b ) return; if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; if ( b->yy_is_our_buffer ) Cfdgfree((void *) b->yy_ch_buf ); Cfdgfree((void *) b ); } /* Initializes or reinitializes a buffer. * This function is sometimes called more than once on the same buffer, * such as during a yyrestart() or at EOF. */ void yyFlexLexer::yy_init_buffer( YY_BUFFER_STATE b, std::istream* file ) { int oerrno = errno; yy_flush_buffer( b ); b->yy_input_file = file; b->yy_fill_buffer = 1; /* If b is the current buffer, then yy_init_buffer was _probably_ * called from yyrestart() or through yy_get_next_buffer. * In that case, we don't want to reset the lineno or column. */ if (b != YY_CURRENT_BUFFER){ b->yy_bs_lineno = 1; b->yy_bs_column = 0; } b->yy_is_interactive = 0; errno = oerrno; } /** Discard all buffered characters. On the next scan, YY_INPUT will be called. * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. * */ void yyFlexLexer::yy_flush_buffer( YY_BUFFER_STATE b ) { if ( ! b ) return; b->yy_n_chars = 0; /* We always need two end-of-buffer characters. The first causes * a transition to the end-of-buffer state. The second causes * a jam in that state. */ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; b->yy_buf_pos = &b->yy_ch_buf[0]; b->yy_at_bol = 1; b->yy_buffer_status = YY_BUFFER_NEW; if ( b == YY_CURRENT_BUFFER ) yy_load_buffer_state( ); } /** Pushes the new state onto the stack. The new state becomes * the current state. This function will allocate the stack * if necessary. * @param new_buffer The new state. * */ void yyFlexLexer::yypush_buffer_state (YY_BUFFER_STATE new_buffer) { if (new_buffer == NULL) return; yyensure_buffer_stack(); /* This block is copied from yy_switch_to_buffer. */ if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } /* Only push if top exists. Otherwise, replace top. */ if (YY_CURRENT_BUFFER) (yy_buffer_stack_top)++; YY_CURRENT_BUFFER_LVALUE = new_buffer; /* copied from yy_switch_to_buffer. */ yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } /** Removes and deletes the top of the stack, if present. * The next element becomes the new top. * */ void yyFlexLexer::yypop_buffer_state (void) { if (!YY_CURRENT_BUFFER) return; yy_delete_buffer(YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; if ((yy_buffer_stack_top) > 0) --(yy_buffer_stack_top); if (YY_CURRENT_BUFFER) { yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } } /* Allocates the stack if it does not exist. * Guarantees space for at least one push. */ void yyFlexLexer::yyensure_buffer_stack(void) { yy_size_t num_to_alloc; if (!(yy_buffer_stack)) { /* First allocation is just for 2 elements, since we don't know if this * scanner will even need a stack. We use 2 instead of 1 to avoid an * immediate realloc on the next call. */ num_to_alloc = 1; (yy_buffer_stack) = (struct yy_buffer_state**)Cfdgalloc (num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; (yy_buffer_stack_top) = 0; return; } if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ /* Increase the buffer to prepare for a possible push. */ int grow_size = 8 /* arbitrary grow size */; num_to_alloc = (yy_buffer_stack_max) + grow_size; (yy_buffer_stack) = (struct yy_buffer_state**)Cfdgrealloc ((yy_buffer_stack), num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); /* zero only the new slots.*/ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; } } void yyFlexLexer::yy_push_state( int new_state ) { if ( (yy_start_stack_ptr) >= (yy_start_stack_depth) ) { yy_size_t new_size; (yy_start_stack_depth) += YY_START_STACK_INCR; new_size = (yy_start_stack_depth) * sizeof( int ); if ( ! (yy_start_stack) ) (yy_start_stack) = (int *) Cfdgalloc(new_size ); else (yy_start_stack) = (int *) Cfdgrealloc((void *) (yy_start_stack),new_size ); if ( ! (yy_start_stack) ) YY_FATAL_ERROR( "out of memory expanding start-condition stack" ); } (yy_start_stack)[(yy_start_stack_ptr)++] = YY_START; BEGIN(new_state); } void yyFlexLexer::yy_pop_state() { if ( --(yy_start_stack_ptr) < 0 ) YY_FATAL_ERROR( "start-condition stack underflow" ); BEGIN((yy_start_stack)[(yy_start_stack_ptr)]); } int yyFlexLexer::yy_top_state() { return (yy_start_stack)[(yy_start_stack_ptr) - 1]; } #ifndef YY_EXIT_FAILURE #define YY_EXIT_FAILURE 2 #endif void yyFlexLexer::LexerError( yyconst char msg[] ) { std::cerr << msg << std::endl; exit( YY_EXIT_FAILURE ); } /* Redefine yyless() so it works in section 3 code. */ #undef yyless #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ yytext[yyleng] = (yy_hold_char); \ (yy_c_buf_p) = yytext + yyless_macro_arg; \ (yy_hold_char) = *(yy_c_buf_p); \ *(yy_c_buf_p) = '\0'; \ yyleng = yyless_macro_arg; \ } \ while ( 0 ) /* Accessor methods (get/set functions) to struct members. */ /* * Internal utility routines. */ #ifndef yytext_ptr static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) { register int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * s ) { register int n; for ( n = 0; s[n]; ++n ) ; return n; } #endif void *Cfdgalloc (yy_size_t size ) { return (void *) malloc( size ); } void *Cfdgrealloc (void * ptr, yy_size_t size ) { /* The cast to (char *) in the following accommodates both * implementations that use char* generic pointers, and those * that use void* generic pointers. It works with the latter * because both ANSI C and C++ allow castless assignment from * any pointer type to void*, and deal with argument conversions * as though doing an assignment. */ return (void *) realloc( (char *) ptr, size ); } void Cfdgfree (void * ptr ) { free( (char *) ptr ); /* see Cfdgrealloc() for (char *) cast */ } #define YYTABLES_NAME "yytables" #line 362 "../../src-common/cfdg.l" namespace yy { Scanner::Scanner(std::istream* in, std::ostream* out) : yyFlexLexer(in, out), nextLocAction(normalAction), startToken(token::CFDG2), maybeVersion(0), atStartup(true) { utf8chars[token::RANGEOP] = "\xe2\x80\xa6"; utf8chars[token::PLUSMINUSOP] = "\xc2\xb1"; utf8chars[token::LE] = "\xe2\x89\xa4"; utf8chars[token::GE] = "\xe2\x89\xa5"; utf8chars[token::NEQ] = "\xe2\x89\xa0"; utf8chars[token::CF_INFINITY] = "\xe2\x88\x9e"; } Scanner::~Scanner() { } void Scanner::set_debug(bool b) { yy_flex_debug = b; } void Scanner::LexerError(const char* msg) { driver->error(lineno(), msg); } void Scanner::setupLoc(CfdgParser::location_type* yylloc) { switch (nextLocAction) { case normalAction: case popLoc: yylloc->step(); break; case pushLoc: mLocationStack.push(*yylloc); *yylloc = CfdgParser::location_type(); break; } nextLocAction = normalAction; yylloc->begin.filename = yylloc->end.filename = driver->m_currentPath; } // Compute the number of Unicode characters in a block of UTF-8 encoded bytes unsigned int Scanner::utf8length(const char* txt, size_t len) { unsigned int length = 0; for (size_t i = 0; i < len; ++i, ++length) { char c = txt[i]; if (c == '\0') LexerError("Invalid UTF-8 encoding: ASCII null character"); if ((c & 0x80) == 0) continue; size_t j = 0; for (; c & 0x80; ++j) c <<= 1; if (j == 1) { LexerError("Invalid UTF-8 encoding: unexpected continuation byte"); continue; } if (j > 4) // 4 bytes max per RFC 3629 LexerError("Invalid UTF-8 encoding: code point out of range"); if (j && i + j > len) { LexerError("Invalid UTF-8 encoding: sequence extends past end of buffer"); return length; } // Compute the Unicode code point unsigned long code = c >> j; size_t k = 1; for (; k < j; ++k) { if ((txt[i + k] & 0xc0) != 0x80) { LexerError("Invalid UTF-8 encoding: expecting a continuation byte"); break; } code = (code << 6) | (txt[i + k] & 0x3f); } if (k < j) { // malformed code is actually k bytes long, not j bytes long i += k - 1; continue; } // Check for illegal code points if (code >= 0xd800 && code <= 0xdfff) LexerError("Invalid UTF-8 encoding: UTF-16 surrogate halves"); if (code == 0xfffe || code == 0xffff) LexerError("Invalid UTF-8 encoding: illegal code point"); if (code == 0) LexerError("Invalid UTF-8 encoding: encoded null character"); if (code > 0x10ffff) LexerError("Invalid UTF-8 encoding: codepoint above U+10FFFF"); // Check for encodings that are more bytes than they need to be switch (j) { case 2: if (code > 0x7f) break; case 3: if (code > 0x7ff) break; case 4: if (code > 0xffff) break; LexerError("Invalid UTF-8 encoding: overlong sequence"); default: break; } if (j) i += j - 1; } return length; } } /* This implementation of CfdgFlexLexer::yylex() is required to fill the * vtable of the class CfdgFlexLexer. We define the scanner's main yylex * function via YY_DECL to reside in the Scanner class instead. */ #ifdef yylex #undef yylex #endif int yyFlexLexer::yylex() { std::cerr << "in yyFlexLexer::yylex() !" << std::endl; return 0; } contextfree-3.0.5+dfsg1.orig/src-win/derived/cfdg.tab.hpp0000644000175000017500000002256712076364074021642 0ustar brambram/* A Bison parser, made by GNU Bison 2.7. */ /* Skeleton interface for Bison LALR(1) parsers in C++ Copyright (C) 2002-2012 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /** ** \file cfdg.tab.hpp ** Define the yy::parser class. */ /* C++ LALR(1) parser skeleton written by Akim Demaille. */ #ifndef YY_YY_CFDG_TAB_HPP_INCLUDED # define YY_YY_CFDG_TAB_HPP_INCLUDED #include #include #include "stack.hh" #include "location.hh" /* Enabling traces. */ #ifndef YYDEBUG # define YYDEBUG 0 #endif namespace yy { /* Line 266 of lalr1.cc */ #line 59 "cfdg.tab.hpp" /// A Bison parser. class CfdgParser { public: /// Symbol semantic values. #ifndef YYSTYPE union semantic_type { /* Line 266 of lalr1.cc */ #line 64 "../../src-common/cfdg.ypp" int modToken; std::string* string; AST::ASTexpression* expression; AST::ASTmodTerm* term; AST::ASTmodification* mod; AST::ASTreplacement* component; AST::ASTshape* shapeObj; AST::ASTloop* loopObj; AST::ASTif* ifObj; AST::ASTswitch* switchObj; AST::ASTruleSpecifier* ruleSpec; AST::ASTrule* ruleObj; AST::ASTrepContainer* bodyObj; /* Line 266 of lalr1.cc */ #line 88 "cfdg.tab.hpp" }; #else typedef YYSTYPE semantic_type; #endif /// Symbol locations. typedef location location_type; /// Tokens. struct token { /* Tokens. */ enum yytokentype { STARTSHAPE = 258, CFDG2 = 259, CFDG3 = 260, SHAPE = 261, RULE = 262, PATH = 263, DEFINE = 264, BECOMES = 265, LOOP = 266, FINALLY = 267, IF = 268, ELSE = 269, SWITCH = 270, CASE = 271, CLONE = 272, LET = 273, MODTYPE = 274, PARAM = 275, BACKGROUND = 276, BADEOF = 277, GOODEOF = 278, RANGEOP = 279, PLUSMINUSOP = 280, USER_STRING = 281, USER_INTEGER = 282, USER_RATIONAL = 283, USER_FILENAME = 284, USER_QSTRING = 285, USER_ARRAYNAME = 286, INCLUDE = 287, IMPORT = 288, TILE = 289, PARAMETERS = 290, USER_PATHOP = 291, STROKEWIDTH = 292, LE = 293, LT = 294, GE = 295, GT = 296, EQ = 297, NEQ = 298, NOT = 299, AND = 300, OR = 301, XOR = 302, CF_INFINITY = 303, POS = 304, NEG = 305 }; }; /// Token type. typedef token::yytokentype token_type; /// Build a parser object. CfdgParser (class Builder& driver_yyarg); virtual ~CfdgParser (); /// Parse. /// \returns 0 iff parsing succeeded. virtual int parse (); #if YYDEBUG /// The current debugging stream. std::ostream& debug_stream () const; /// Set the current debugging stream. void set_debug_stream (std::ostream &); /// Type for debugging levels. typedef int debug_level_type; /// The current debugging level. debug_level_type debug_level () const; /// Set the current debugging level. void set_debug_level (debug_level_type l); #endif private: /// Report a syntax error. /// \param loc where the syntax error is found. /// \param msg a description of the syntax error. virtual void error (const location_type& loc, const std::string& msg); /// Generate an error message. /// \param state the state where the error occurred. /// \param tok the lookahead token. virtual std::string yysyntax_error_ (int yystate, int tok); #if YYDEBUG /// \brief Report a symbol value on the debug stream. /// \param yytype The token type. /// \param yyvaluep Its semantic value. /// \param yylocationp Its location. virtual void yy_symbol_value_print_ (int yytype, const semantic_type* yyvaluep, const location_type* yylocationp); /// \brief Report a symbol on the debug stream. /// \param yytype The token type. /// \param yyvaluep Its semantic value. /// \param yylocationp Its location. virtual void yy_symbol_print_ (int yytype, const semantic_type* yyvaluep, const location_type* yylocationp); #endif /// State numbers. typedef int state_type; /// State stack type. typedef stack state_stack_type; /// Semantic value stack type. typedef stack semantic_stack_type; /// location stack type. typedef stack location_stack_type; /// The state stack. state_stack_type yystate_stack_; /// The semantic value stack. semantic_stack_type yysemantic_stack_; /// The location stack. location_stack_type yylocation_stack_; /// Whether the given \c yypact_ value indicates a defaulted state. /// \param yyvalue the value to check static bool yy_pact_value_is_default_ (int yyvalue); /// Whether the given \c yytable_ value indicates a syntax error. /// \param yyvalue the value to check static bool yy_table_value_is_error_ (int yyvalue); /// Internal symbol numbers. typedef unsigned char token_number_type; /* Tables. */ /// For a state, the index in \a yytable_ of its portion. static const short int yypact_[]; static const short int yypact_ninf_; /// For a state, default reduction number. /// Unless\a yytable_ specifies something else to do. /// Zero means the default is an error. static const unsigned char yydefact_[]; static const short int yypgoto_[]; static const short int yydefgoto_[]; /// What to do in a state. /// \a yytable_[yypact_[s]]: what to do in state \a s. /// - if positive, shift that token. /// - if negative, reduce the rule which number is the opposite. /// - if zero, do what YYDEFACT says. static const short int yytable_[]; static const signed char yytable_ninf_; static const short int yycheck_[]; /// For a state, its accessing symbol. static const unsigned char yystos_[]; /// For a rule, its LHS. static const unsigned char yyr1_[]; /// For a rule, its RHS length. static const unsigned char yyr2_[]; #if YYDEBUG /// For a symbol, its name in clear. static const char* const yytname_[]; /// A type to store symbol numbers and -1. typedef short int rhs_number_type; /// A `-1'-separated list of the rules' RHS. static const rhs_number_type yyrhs_[]; /// For each rule, the index of the first RHS symbol in \a yyrhs_. static const unsigned short int yyprhs_[]; /// For each rule, its source line number. static const unsigned short int yyrline_[]; /// For each scanner token number, its symbol number. static const unsigned short int yytoken_number_[]; /// Report on the debug stream that the rule \a r is going to be reduced. virtual void yy_reduce_print_ (int r); /// Print the state stack on the debug stream. virtual void yystack_print_ (); /* Debugging. */ int yydebug_; std::ostream* yycdebug_; #endif /// Convert a scanner token number \a t to a symbol number. token_number_type yytranslate_ (int t); /// \brief Reclaim the memory associated to a symbol. /// \param yymsg Why this token is reclaimed. /// If null, do not display the symbol, just free it. /// \param yytype The symbol type. /// \param yyvaluep Its semantic value. /// \param yylocationp Its location. inline void yydestruct_ (const char* yymsg, int yytype, semantic_type* yyvaluep, location_type* yylocationp); /// Pop \a n symbols the three stacks. inline void yypop_ (unsigned int n = 1); /* Constants. */ static const int yyeof_; /* LAST_ -- Last index in TABLE_. */ static const int yylast_; static const int yynnts_; static const int yyempty_; static const int yyfinal_; static const int yyterror_; static const int yyerrcode_; static const int yyntokens_; static const unsigned int yyuser_token_number_max_; static const token_number_type yyundef_token_; /* User arguments. */ class Builder& driver; }; } // yy /* Line 266 of lalr1.cc */ #line 322 "cfdg.tab.hpp" #endif /* !YY_YY_CFDG_TAB_HPP_INCLUDED */ contextfree-3.0.5+dfsg1.orig/src-win/derived/Makefile0000644000175000017500000000063512076364074021111 0ustar brambram# Build the common derived files DERIVED = lex.yy.cpp cfdg.tab.cpp cfdg.tab.hpp FlexLexer.h all: $(DERIVED) lex.yy.cpp FlexLexer.h: ../../src-common/cfdg.l cfdg.tab.hpp flex -o lex.yy.cpp ../../src-common/cfdg.l cp `which flex | xargs dirname | xargs dirname`/include/FlexLexer.h . cfdg.tab.cpp cfdg.tab.hpp: ../../src-common/cfdg.ypp bison -o cfdg.tab.cpp ../../src-common/cfdg.ypp clean: rm $(DERIVED) contextfree-3.0.5+dfsg1.orig/src-win/derived/location.hh0000644000175000017500000001137112076364074021601 0ustar brambram/* A Bison parser, made by GNU Bison 2.7. */ /* Locations for Bison parsers in C++ Copyright (C) 2002-2007, 2009-2012 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /** ** \file location.hh ** Define the yy::location class. */ #ifndef YY_YY_LOCATION_HH_INCLUDED # define YY_YY_LOCATION_HH_INCLUDED # include "position.hh" namespace yy { /* Line 166 of location.cc */ #line 47 "location.hh" /// Abstract a location. class location { public: /// Construct a location from \a b to \a e. location (const position& b, const position& e) : begin (b) , end (e) { } /// Construct a 0-width location in \a p. explicit location (const position& p = position ()) : begin (p) , end (p) { } /// Construct a 0-width location in \a f, \a l, \a c. explicit location (std::string* f, unsigned int l = 1u, unsigned int c = 1u) : begin (f, l, c) , end (f, l, c) { } /// Initialization. void initialize (std::string* f = YY_NULL, unsigned int l = 1u, unsigned int c = 1u) { begin.initialize (f, l, c); end = begin; } /** \name Line and Column related manipulators ** \{ */ public: /// Reset initial location to final location. void step () { begin = end; } /// Extend the current location to the COUNT next columns. void columns (unsigned int count = 1) { end += count; } /// Extend the current location to the COUNT next lines. void lines (unsigned int count = 1) { end.lines (count); } /** \} */ public: /// Beginning of the located region. position begin; /// End of the located region. position end; }; /// Join two location objects to create a location. inline const location operator+ (const location& begin, const location& end) { location res = begin; res.end = end.end; return res; } /// Add two location objects. inline const location operator+ (const location& begin, unsigned int width) { location res = begin; res.columns (width); return res; } /// Add and assign a location. inline location& operator+= (location& res, unsigned int width) { res.columns (width); return res; } /// Compare two location objects. inline bool operator== (const location& loc1, const location& loc2) { return loc1.begin == loc2.begin && loc1.end == loc2.end; } /// Compare two location objects. inline bool operator!= (const location& loc1, const location& loc2) { return !(loc1 == loc2); } /** \brief Intercept output stream redirection. ** \param ostr the destination output stream ** \param loc a reference to the location to redirect ** ** Avoid duplicate information. */ template inline std::basic_ostream& operator<< (std::basic_ostream& ostr, const location& loc) { position last = loc.end - 1; ostr << loc.begin; if (last.filename && (!loc.begin.filename || *loc.begin.filename != *last.filename)) ostr << '-' << last; else if (loc.begin.line != last.line) ostr << '-' << last.line << '.' << last.column; else if (loc.begin.column != last.column) ostr << '-' << last.column; return ostr; } } // yy /* Line 296 of location.cc */ #line 180 "location.hh" #endif /* !YY_YY_LOCATION_HH_INCLUDED */ contextfree-3.0.5+dfsg1.orig/src-win/derived/stack.hh0000644000175000017500000000610712076364074021077 0ustar brambram/* A Bison parser, made by GNU Bison 2.7. */ /* Stack handling for Bison parsers in C++ Copyright (C) 2002-2012 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /** ** \file stack.hh ** Define the yy::stack class. */ #ifndef YY_YY_STACK_HH_INCLUDED # define YY_YY_STACK_HH_INCLUDED # include namespace yy { /* Line 34 of stack.hh */ #line 47 "stack.hh" template > class stack { public: // Hide our reversed order. typedef typename S::reverse_iterator iterator; typedef typename S::const_reverse_iterator const_iterator; stack () : seq_ () { } stack (unsigned int n) : seq_ (n) { } inline T& operator [] (unsigned int i) { return seq_[i]; } inline const T& operator [] (unsigned int i) const { return seq_[i]; } inline void push (const T& t) { seq_.push_front (t); } inline void pop (unsigned int n = 1) { for (; n; --n) seq_.pop_front (); } inline unsigned int height () const { return seq_.size (); } inline const_iterator begin () const { return seq_.rbegin (); } inline const_iterator end () const { return seq_.rend (); } private: S seq_; }; /// Present a slice of the top of a stack. template > class slice { public: slice (const S& stack, unsigned int range) : stack_ (stack) , range_ (range) { } inline const T& operator [] (unsigned int i) const { return stack_[range_ - i]; } private: const S& stack_; unsigned int range_; }; } // yy /* Line 116 of stack.hh */ #line 132 "stack.hh" #endif /* !YY_YY_STACK_HH_INCLUDED */ contextfree-3.0.5+dfsg1.orig/src-win/derived/FlexLexer.h0000644000175000017500000001411112076364074021512 0ustar brambram// -*-C++-*- // FlexLexer.h -- define interfaces for lexical analyzer classes generated // by flex // Copyright (c) 1993 The Regents of the University of California. // All rights reserved. // // This code is derived from software contributed to Berkeley by // Kent Williams and Tom Epperly. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // Neither the name of the University nor the names of its contributors // may be used to endorse or promote products derived from this software // without specific prior written permission. // THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR // IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE. // This file defines FlexLexer, an abstract class which specifies the // external interface provided to flex C++ lexer objects, and yyFlexLexer, // which defines a particular lexer class. // // If you want to create multiple lexer classes, you use the -P flag // to rename each yyFlexLexer to some other xxFlexLexer. You then // include in your other sources once per lexer class: // // #undef yyFlexLexer // #define yyFlexLexer xxFlexLexer // #include // // #undef yyFlexLexer // #define yyFlexLexer zzFlexLexer // #include // ... #ifndef __FLEX_LEXER_H // Never included before - need to define base class. #define __FLEX_LEXER_H #include # ifndef FLEX_STD # define FLEX_STD std:: # endif extern "C++" { struct yy_buffer_state; typedef int yy_state_type; class FlexLexer { public: virtual ~FlexLexer() { } const char* YYText() const { return yytext; } int YYLeng() const { return yyleng; } virtual void yy_switch_to_buffer( struct yy_buffer_state* new_buffer ) = 0; virtual struct yy_buffer_state* yy_create_buffer( FLEX_STD istream* s, int size ) = 0; virtual void yy_delete_buffer( struct yy_buffer_state* b ) = 0; virtual void yyrestart( FLEX_STD istream* s ) = 0; virtual int yylex() = 0; // Call yylex with new input/output sources. int yylex( FLEX_STD istream* new_in, FLEX_STD ostream* new_out = 0 ) { switch_streams( new_in, new_out ); return yylex(); } // Switch to new input/output streams. A nil stream pointer // indicates "keep the current one". virtual void switch_streams( FLEX_STD istream* new_in = 0, FLEX_STD ostream* new_out = 0 ) = 0; int lineno() const { return yylineno; } int debug() const { return yy_flex_debug; } void set_debug( int flag ) { yy_flex_debug = flag; } protected: char* yytext; int yyleng; int yylineno; // only maintained if you use %option yylineno int yy_flex_debug; // only has effect with -d or "%option debug" }; } #endif // FLEXLEXER_H #if defined(yyFlexLexer) || ! defined(yyFlexLexerOnce) // Either this is the first time through (yyFlexLexerOnce not defined), // or this is a repeated include to define a different flavor of // yyFlexLexer, as discussed in the flex manual. #define yyFlexLexerOnce extern "C++" { class yyFlexLexer : public FlexLexer { public: // arg_yyin and arg_yyout default to the cin and cout, but we // only make that assignment when initializing in yylex(). yyFlexLexer( FLEX_STD istream* arg_yyin = 0, FLEX_STD ostream* arg_yyout = 0 ); virtual ~yyFlexLexer(); void yy_switch_to_buffer( struct yy_buffer_state* new_buffer ); struct yy_buffer_state* yy_create_buffer( FLEX_STD istream* s, int size ); void yy_delete_buffer( struct yy_buffer_state* b ); void yyrestart( FLEX_STD istream* s ); void yypush_buffer_state( struct yy_buffer_state* new_buffer ); void yypop_buffer_state(); virtual int yylex(); virtual void switch_streams( FLEX_STD istream* new_in, FLEX_STD ostream* new_out = 0 ); virtual int yywrap(); protected: virtual int LexerInput( char* buf, int max_size ); virtual void LexerOutput( const char* buf, int size ); virtual void LexerError( const char* msg ); void yyunput( int c, char* buf_ptr ); int yyinput(); void yy_load_buffer_state(); void yy_init_buffer( struct yy_buffer_state* b, FLEX_STD istream* s ); void yy_flush_buffer( struct yy_buffer_state* b ); int yy_start_stack_ptr; int yy_start_stack_depth; int* yy_start_stack; void yy_push_state( int new_state ); void yy_pop_state(); int yy_top_state(); yy_state_type yy_get_previous_state(); yy_state_type yy_try_NUL_trans( yy_state_type current_state ); int yy_get_next_buffer(); FLEX_STD istream* yyin; // input source for default LexerInput FLEX_STD ostream* yyout; // output sink for default LexerOutput // yy_hold_char holds the character lost when yytext is formed. char yy_hold_char; // Number of characters read into yy_ch_buf. int yy_n_chars; // Points to current character in buffer. char* yy_c_buf_p; int yy_init; // whether we need to initialize int yy_start; // start state number // Flag which is used to allow yywrap()'s to do buffer switches // instead of setting up a fresh yyin. A bit of a hack ... int yy_did_buffer_switch_on_eof; size_t yy_buffer_stack_top; /**< index of top of stack. */ size_t yy_buffer_stack_max; /**< capacity of stack. */ struct yy_buffer_state ** yy_buffer_stack; /**< Stack as an array. */ void yyensure_buffer_stack(void); // The following are not always needed, but may be depending // on use of certain flex features (like REJECT or yymore()). yy_state_type yy_last_accepting_state; char* yy_last_accepting_cpos; yy_state_type* yy_state_buf; yy_state_type* yy_state_ptr; char* yy_full_match; int* yy_full_state; int yy_full_lp; int yy_lp; int yy_looking_for_trail_begin; int yy_more_flag; int yy_more_len; int yy_more_offset; int yy_prev_more_offset; }; } #endif // yyFlexLexer || ! yyFlexLexerOnce contextfree-3.0.5+dfsg1.orig/src-win/derived/position.hh0000644000175000017500000001103212076364074021627 0ustar brambram/* A Bison parser, made by GNU Bison 2.7. */ /* Positions for Bison parsers in C++ Copyright (C) 2002-2007, 2009-2012 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /** ** \file position.hh ** Define the yy::position class. */ #ifndef YY_YY_POSITION_HH_INCLUDED # define YY_YY_POSITION_HH_INCLUDED # include // std::max # include # include # ifndef YY_NULL # if defined __cplusplus && 201103L <= __cplusplus # define YY_NULL nullptr # else # define YY_NULL 0 # endif # endif namespace yy { /* Line 36 of location.cc */ #line 57 "position.hh" /// Abstract a position. class position { public: /// Construct a position. explicit position (std::string* f = YY_NULL, unsigned int l = 1u, unsigned int c = 1u) : filename (f) , line (l) , column (c) { } /// Initialization. void initialize (std::string* fn = YY_NULL, unsigned int l = 1u, unsigned int c = 1u) { filename = fn; line = l; column = c; } /** \name Line and Column related manipulators ** \{ */ /// (line related) Advance to the COUNT next lines. void lines (int count = 1) { column = 1u; line += count; } /// (column related) Advance to the COUNT next columns. void columns (int count = 1) { column = std::max (1u, column + count); } /** \} */ /// File name to which this position refers. std::string* filename; /// Current line number. unsigned int line; /// Current column number. unsigned int column; }; /// Add and assign a position. inline position& operator+= (position& res, const int width) { res.columns (width); return res; } /// Add two position objects. inline const position operator+ (const position& begin, const int width) { position res = begin; return res += width; } /// Add and assign a position. inline position& operator-= (position& res, const int width) { return res += -width; } /// Add two position objects. inline const position operator- (const position& begin, const int width) { return begin + -width; } /// Compare two position objects. inline bool operator== (const position& pos1, const position& pos2) { return (pos1.line == pos2.line && pos1.column == pos2.column && (pos1.filename == pos2.filename || (pos1.filename && pos2.filename && *pos1.filename == *pos2.filename))); } /// Compare two position objects. inline bool operator!= (const position& pos1, const position& pos2) { return !(pos1 == pos2); } /** \brief Intercept output stream redirection. ** \param ostr the destination output stream ** \param pos a reference to the position to redirect */ template inline std::basic_ostream& operator<< (std::basic_ostream& ostr, const position& pos) { if (pos.filename) ostr << *pos.filename << ':'; return ostr << pos.line << '.' << pos.column; } } // yy /* Line 148 of location.cc */ #line 172 "position.hh" #endif /* !YY_YY_POSITION_HH_INCLUDED */ contextfree-3.0.5+dfsg1.orig/src-win/derived/cfdg.tab.cpp0000644000175000017500000045310712076364074021633 0ustar brambram/* A Bison parser, made by GNU Bison 2.7. */ /* Skeleton implementation for Bison LALR(1) parsers in C++ Copyright (C) 2002-2012 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* First part of user declarations. */ /* Line 279 of lalr1.cc */ #line 41 "../../src-common/cfdg.ypp" #include "builder.h" #include #include namespace AST { class ASTexpression; class ASTmodTerm; class ASTmodification; class ASTpath; class ASTreplacement; class ASTbodyContainer; class ASTshape; class ASTloop; class ASTif; class ASTswitch; class ASTpathBody; class ASTpathLoop; class ASTruleSpecifier; class ASTrule; } /* Line 279 of lalr1.cc */ #line 60 "cfdg.tab.cpp" #include "cfdg.tab.hpp" /* User implementation prologue. */ /* Line 285 of lalr1.cc */ #line 80 "../../src-common/cfdg.ypp" #include "astreplacement.h" #include "astexpression.h" using namespace AST; /* Line 285 of lalr1.cc */ #line 176 "../../src-common/cfdg.ypp" #include "scanner.h" #include "math.h" #include "builder.h" #include #undef yylex #define yylex driver.lexer->lex /* Line 285 of lalr1.cc */ #line 85 "cfdg.tab.cpp" # ifndef YY_NULL # if defined __cplusplus && 201103L <= __cplusplus # define YY_NULL nullptr # else # define YY_NULL 0 # endif # endif #ifndef YY_ # if defined YYENABLE_NLS && YYENABLE_NLS # if ENABLE_NLS # include /* FIXME: INFRINGES ON USER NAME SPACE */ # define YY_(msgid) dgettext ("bison-runtime", msgid) # endif # endif # ifndef YY_ # define YY_(msgid) msgid # endif #endif #define YYRHSLOC(Rhs, K) ((Rhs)[K]) /* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. If N is 0, then set CURRENT to the empty location which ends the previous symbol: RHS[0] (always defined). */ # ifndef YYLLOC_DEFAULT # define YYLLOC_DEFAULT(Current, Rhs, N) \ do \ if (N) \ { \ (Current).begin = YYRHSLOC (Rhs, 1).begin; \ (Current).end = YYRHSLOC (Rhs, N).end; \ } \ else \ { \ (Current).begin = (Current).end = YYRHSLOC (Rhs, 0).end; \ } \ while (/*CONSTCOND*/ false) # endif /* Suppress unused-variable warnings by "using" E. */ #define YYUSE(e) ((void) (e)) /* Enable debugging if requested. */ #if YYDEBUG /* A pseudo ostream that takes yydebug_ into account. */ # define YYCDEBUG if (yydebug_) (*yycdebug_) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ do { \ if (yydebug_) \ { \ *yycdebug_ << Title << ' '; \ yy_symbol_print_ ((Type), (Value), (Location)); \ *yycdebug_ << std::endl; \ } \ } while (false) # define YY_REDUCE_PRINT(Rule) \ do { \ if (yydebug_) \ yy_reduce_print_ (Rule); \ } while (false) # define YY_STACK_PRINT() \ do { \ if (yydebug_) \ yystack_print_ (); \ } while (false) #else /* !YYDEBUG */ # define YYCDEBUG if (false) std::cerr # define YY_SYMBOL_PRINT(Title, Type, Value, Location) YYUSE(Type) # define YY_REDUCE_PRINT(Rule) static_cast(0) # define YY_STACK_PRINT() static_cast(0) #endif /* !YYDEBUG */ #define yyerrok (yyerrstatus_ = 0) #define yyclearin (yychar = yyempty_) #define YYACCEPT goto yyacceptlab #define YYABORT goto yyabortlab #define YYERROR goto yyerrorlab #define YYRECOVERING() (!!yyerrstatus_) namespace yy { /* Line 353 of lalr1.cc */ #line 180 "cfdg.tab.cpp" /// Build a parser object. CfdgParser::CfdgParser (class Builder& driver_yyarg) : #if YYDEBUG yydebug_ (false), yycdebug_ (&std::cerr), #endif driver (driver_yyarg) { } CfdgParser::~CfdgParser () { } #if YYDEBUG /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ inline void CfdgParser::yy_symbol_value_print_ (int yytype, const semantic_type* yyvaluep, const location_type* yylocationp) { YYUSE (yylocationp); YYUSE (yyvaluep); std::ostream& yyo = debug_stream (); std::ostream& yyoutput = yyo; YYUSE (yyoutput); switch (yytype) { default: break; } } void CfdgParser::yy_symbol_print_ (int yytype, const semantic_type* yyvaluep, const location_type* yylocationp) { *yycdebug_ << (yytype < yyntokens_ ? "token" : "nterm") << ' ' << yytname_[yytype] << " (" << *yylocationp << ": "; yy_symbol_value_print_ (yytype, yyvaluep, yylocationp); *yycdebug_ << ')'; } #endif void CfdgParser::yydestruct_ (const char* yymsg, int yytype, semantic_type* yyvaluep, location_type* yylocationp) { YYUSE (yylocationp); YYUSE (yymsg); YYUSE (yyvaluep); if (yymsg) YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); switch (yytype) { case 26: /* USER_STRING */ /* Line 455 of lalr1.cc */ #line 160 "../../src-common/cfdg.ypp" { delete ((*yyvaluep).string); }; /* Line 455 of lalr1.cc */ #line 249 "cfdg.tab.cpp" break; case 29: /* USER_FILENAME */ /* Line 455 of lalr1.cc */ #line 160 "../../src-common/cfdg.ypp" { delete ((*yyvaluep).string); }; /* Line 455 of lalr1.cc */ #line 256 "cfdg.tab.cpp" break; case 30: /* USER_QSTRING */ /* Line 455 of lalr1.cc */ #line 160 "../../src-common/cfdg.ypp" { delete ((*yyvaluep).string); }; /* Line 455 of lalr1.cc */ #line 263 "cfdg.tab.cpp" break; case 31: /* USER_ARRAYNAME */ /* Line 455 of lalr1.cc */ #line 160 "../../src-common/cfdg.ypp" { delete ((*yyvaluep).string); }; /* Line 455 of lalr1.cc */ #line 270 "cfdg.tab.cpp" break; case 36: /* USER_PATHOP */ /* Line 455 of lalr1.cc */ #line 160 "../../src-common/cfdg.ypp" { delete ((*yyvaluep).string); }; /* Line 455 of lalr1.cc */ #line 277 "cfdg.tab.cpp" break; case 72: /* statement */ /* Line 455 of lalr1.cc */ #line 166 "../../src-common/cfdg.ypp" { delete ((*yyvaluep).component); }; /* Line 455 of lalr1.cc */ #line 284 "cfdg.tab.cpp" break; case 73: /* statement_v2 */ /* Line 455 of lalr1.cc */ #line 166 "../../src-common/cfdg.ypp" { delete ((*yyvaluep).component); }; /* Line 455 of lalr1.cc */ #line 291 "cfdg.tab.cpp" break; case 79: /* fileString */ /* Line 455 of lalr1.cc */ #line 160 "../../src-common/cfdg.ypp" { delete ((*yyvaluep).string); }; /* Line 455 of lalr1.cc */ #line 298 "cfdg.tab.cpp" break; case 80: /* fileNameSpace */ /* Line 455 of lalr1.cc */ #line 160 "../../src-common/cfdg.ypp" { delete ((*yyvaluep).string); }; /* Line 455 of lalr1.cc */ #line 305 "cfdg.tab.cpp" break; case 81: /* initialization */ /* Line 455 of lalr1.cc */ #line 166 "../../src-common/cfdg.ypp" { delete ((*yyvaluep).component); }; /* Line 455 of lalr1.cc */ #line 312 "cfdg.tab.cpp" break; case 82: /* initialization_v2 */ /* Line 455 of lalr1.cc */ #line 166 "../../src-common/cfdg.ypp" { delete ((*yyvaluep).component); }; /* Line 455 of lalr1.cc */ #line 319 "cfdg.tab.cpp" break; case 83: /* background */ /* Line 455 of lalr1.cc */ #line 166 "../../src-common/cfdg.ypp" { delete ((*yyvaluep).component); }; /* Line 455 of lalr1.cc */ #line 326 "cfdg.tab.cpp" break; case 84: /* tile */ /* Line 455 of lalr1.cc */ #line 166 "../../src-common/cfdg.ypp" { delete ((*yyvaluep).component); }; /* Line 455 of lalr1.cc */ #line 333 "cfdg.tab.cpp" break; case 85: /* size */ /* Line 455 of lalr1.cc */ #line 166 "../../src-common/cfdg.ypp" { delete ((*yyvaluep).component); }; /* Line 455 of lalr1.cc */ #line 340 "cfdg.tab.cpp" break; case 87: /* global_definition_header */ /* Line 455 of lalr1.cc */ #line 160 "../../src-common/cfdg.ypp" { delete ((*yyvaluep).string); }; /* Line 455 of lalr1.cc */ #line 347 "cfdg.tab.cpp" break; case 88: /* definition_header */ /* Line 455 of lalr1.cc */ #line 160 "../../src-common/cfdg.ypp" { delete ((*yyvaluep).string); }; /* Line 455 of lalr1.cc */ #line 354 "cfdg.tab.cpp" break; case 90: /* shape */ /* Line 455 of lalr1.cc */ #line 173 "../../src-common/cfdg.ypp" { delete ((*yyvaluep).shapeObj); }; /* Line 455 of lalr1.cc */ #line 361 "cfdg.tab.cpp" break; case 91: /* shape_singleton_header */ /* Line 455 of lalr1.cc */ #line 167 "../../src-common/cfdg.ypp" { if (driver.mCompilePhase == 2) driver.pop_repContainer(NULL); delete ((*yyvaluep).ruleObj); }; /* Line 455 of lalr1.cc */ #line 368 "cfdg.tab.cpp" break; case 92: /* shape_singleton */ /* Line 455 of lalr1.cc */ #line 166 "../../src-common/cfdg.ypp" { delete ((*yyvaluep).component); }; /* Line 455 of lalr1.cc */ #line 375 "cfdg.tab.cpp" break; case 93: /* rule_header_v2 */ /* Line 455 of lalr1.cc */ #line 170 "../../src-common/cfdg.ypp" { driver.pop_repContainer(NULL); delete ((*yyvaluep).ruleObj); }; /* Line 455 of lalr1.cc */ #line 382 "cfdg.tab.cpp" break; case 95: /* rule_header */ /* Line 455 of lalr1.cc */ #line 169 "../../src-common/cfdg.ypp" { if (driver.mCompilePhase == 2) driver.pop_repContainer(NULL); delete ((*yyvaluep).ruleObj); }; /* Line 455 of lalr1.cc */ #line 389 "cfdg.tab.cpp" break; case 96: /* path_header */ /* Line 455 of lalr1.cc */ #line 169 "../../src-common/cfdg.ypp" { if (driver.mCompilePhase == 2) driver.pop_repContainer(NULL); delete ((*yyvaluep).ruleObj); }; /* Line 455 of lalr1.cc */ #line 396 "cfdg.tab.cpp" break; case 97: /* rule */ /* Line 455 of lalr1.cc */ #line 166 "../../src-common/cfdg.ypp" { delete ((*yyvaluep).component); }; /* Line 455 of lalr1.cc */ #line 403 "cfdg.tab.cpp" break; case 98: /* path */ /* Line 455 of lalr1.cc */ #line 166 "../../src-common/cfdg.ypp" { delete ((*yyvaluep).component); }; /* Line 455 of lalr1.cc */ #line 410 "cfdg.tab.cpp" break; case 99: /* path_header_v2 */ /* Line 455 of lalr1.cc */ #line 170 "../../src-common/cfdg.ypp" { driver.pop_repContainer(NULL); delete ((*yyvaluep).ruleObj); }; /* Line 455 of lalr1.cc */ #line 417 "cfdg.tab.cpp" break; case 105: /* parameter_spec */ /* Line 455 of lalr1.cc */ #line 161 "../../src-common/cfdg.ypp" { delete ((*yyvaluep).expression); }; /* Line 455 of lalr1.cc */ #line 424 "cfdg.tab.cpp" break; case 108: /* pathOp_simple_v2 */ /* Line 455 of lalr1.cc */ #line 168 "../../src-common/cfdg.ypp" { delete ((*yyvaluep).component); }; /* Line 455 of lalr1.cc */ #line 431 "cfdg.tab.cpp" break; case 109: /* element_simple */ /* Line 455 of lalr1.cc */ #line 166 "../../src-common/cfdg.ypp" { delete ((*yyvaluep).component); }; /* Line 455 of lalr1.cc */ #line 438 "cfdg.tab.cpp" break; case 114: /* element */ /* Line 455 of lalr1.cc */ #line 166 "../../src-common/cfdg.ypp" { delete ((*yyvaluep).component); }; /* Line 455 of lalr1.cc */ #line 445 "cfdg.tab.cpp" break; case 117: /* pathOp_v2 */ /* Line 455 of lalr1.cc */ #line 168 "../../src-common/cfdg.ypp" { delete ((*yyvaluep).component); }; /* Line 455 of lalr1.cc */ #line 452 "cfdg.tab.cpp" break; case 119: /* element_loop */ /* Line 455 of lalr1.cc */ #line 165 "../../src-common/cfdg.ypp" { if (driver.mCompilePhase == 2) driver.pop_repContainer(NULL); delete ((*yyvaluep).loopObj); }; /* Line 455 of lalr1.cc */ #line 459 "cfdg.tab.cpp" break; case 122: /* replacement_simple_v2 */ /* Line 455 of lalr1.cc */ #line 168 "../../src-common/cfdg.ypp" { delete ((*yyvaluep).component); }; /* Line 455 of lalr1.cc */ #line 466 "cfdg.tab.cpp" break; case 123: /* replacement_v2 */ /* Line 455 of lalr1.cc */ #line 168 "../../src-common/cfdg.ypp" { delete ((*yyvaluep).component); }; /* Line 455 of lalr1.cc */ #line 473 "cfdg.tab.cpp" break; case 124: /* loopHeader_v2 */ /* Line 455 of lalr1.cc */ #line 164 "../../src-common/cfdg.ypp" { driver.pop_repContainer(NULL); delete ((*yyvaluep).loopObj); }; /* Line 455 of lalr1.cc */ #line 480 "cfdg.tab.cpp" break; case 126: /* loopHeader */ /* Line 455 of lalr1.cc */ #line 165 "../../src-common/cfdg.ypp" { if (driver.mCompilePhase == 2) driver.pop_repContainer(NULL); delete ((*yyvaluep).loopObj); }; /* Line 455 of lalr1.cc */ #line 487 "cfdg.tab.cpp" break; case 127: /* ifHeader */ /* Line 455 of lalr1.cc */ #line 171 "../../src-common/cfdg.ypp" { if (driver.mCompilePhase == 2) driver.pop_repContainer(NULL); delete ((*yyvaluep).ifObj); }; /* Line 455 of lalr1.cc */ #line 494 "cfdg.tab.cpp" break; case 128: /* ifElseHeader */ /* Line 455 of lalr1.cc */ #line 171 "../../src-common/cfdg.ypp" { if (driver.mCompilePhase == 2) driver.pop_repContainer(NULL); delete ((*yyvaluep).ifObj); }; /* Line 455 of lalr1.cc */ #line 501 "cfdg.tab.cpp" break; case 129: /* transHeader */ /* Line 455 of lalr1.cc */ #line 167 "../../src-common/cfdg.ypp" { if (driver.mCompilePhase == 2) driver.pop_repContainer(NULL); delete ((*yyvaluep).component); }; /* Line 455 of lalr1.cc */ #line 508 "cfdg.tab.cpp" break; case 130: /* switchHeader */ /* Line 455 of lalr1.cc */ #line 172 "../../src-common/cfdg.ypp" { delete ((*yyvaluep).switchObj); }; /* Line 455 of lalr1.cc */ #line 515 "cfdg.tab.cpp" break; case 131: /* caseHeader */ /* Line 455 of lalr1.cc */ #line 174 "../../src-common/cfdg.ypp" { if (driver.mCompilePhase == 2) driver.pop_repContainer(NULL); }; /* Line 455 of lalr1.cc */ #line 522 "cfdg.tab.cpp" break; case 132: /* modification_v2 */ /* Line 455 of lalr1.cc */ #line 163 "../../src-common/cfdg.ypp" { delete ((*yyvaluep).mod); }; /* Line 455 of lalr1.cc */ #line 529 "cfdg.tab.cpp" break; case 133: /* modification */ /* Line 455 of lalr1.cc */ #line 163 "../../src-common/cfdg.ypp" { delete ((*yyvaluep).mod); }; /* Line 455 of lalr1.cc */ #line 536 "cfdg.tab.cpp" break; case 134: /* buncha_adjustments */ /* Line 455 of lalr1.cc */ #line 163 "../../src-common/cfdg.ypp" { delete ((*yyvaluep).mod); }; /* Line 455 of lalr1.cc */ #line 543 "cfdg.tab.cpp" break; case 135: /* adjustment */ /* Line 455 of lalr1.cc */ #line 162 "../../src-common/cfdg.ypp" { delete ((*yyvaluep).term); }; /* Line 455 of lalr1.cc */ #line 550 "cfdg.tab.cpp" break; case 136: /* letHeader */ /* Line 455 of lalr1.cc */ #line 175 "../../src-common/cfdg.ypp" { driver.pop_repContainer(NULL); delete ((*yyvaluep).bodyObj); }; /* Line 455 of lalr1.cc */ #line 557 "cfdg.tab.cpp" break; case 137: /* letBody */ /* Line 455 of lalr1.cc */ #line 161 "../../src-common/cfdg.ypp" { delete ((*yyvaluep).expression); }; /* Line 455 of lalr1.cc */ #line 564 "cfdg.tab.cpp" break; case 140: /* explist */ /* Line 455 of lalr1.cc */ #line 161 "../../src-common/cfdg.ypp" { delete ((*yyvaluep).expression); }; /* Line 455 of lalr1.cc */ #line 571 "cfdg.tab.cpp" break; case 141: /* arglist */ /* Line 455 of lalr1.cc */ #line 161 "../../src-common/cfdg.ypp" { delete ((*yyvaluep).expression); }; /* Line 455 of lalr1.cc */ #line 578 "cfdg.tab.cpp" break; case 142: /* exp */ /* Line 455 of lalr1.cc */ #line 161 "../../src-common/cfdg.ypp" { delete ((*yyvaluep).expression); }; /* Line 455 of lalr1.cc */ #line 585 "cfdg.tab.cpp" break; case 143: /* exp2 */ /* Line 455 of lalr1.cc */ #line 161 "../../src-common/cfdg.ypp" { delete ((*yyvaluep).expression); }; /* Line 455 of lalr1.cc */ #line 592 "cfdg.tab.cpp" break; case 144: /* exp3 */ /* Line 455 of lalr1.cc */ #line 161 "../../src-common/cfdg.ypp" { delete ((*yyvaluep).expression); }; /* Line 455 of lalr1.cc */ #line 599 "cfdg.tab.cpp" break; case 145: /* expfunc */ /* Line 455 of lalr1.cc */ #line 161 "../../src-common/cfdg.ypp" { delete ((*yyvaluep).expression); }; /* Line 455 of lalr1.cc */ #line 606 "cfdg.tab.cpp" break; case 146: /* exp2func */ /* Line 455 of lalr1.cc */ #line 161 "../../src-common/cfdg.ypp" { delete ((*yyvaluep).expression); }; /* Line 455 of lalr1.cc */ #line 613 "cfdg.tab.cpp" break; case 147: /* shapeName */ /* Line 455 of lalr1.cc */ #line 160 "../../src-common/cfdg.ypp" { delete ((*yyvaluep).string); }; /* Line 455 of lalr1.cc */ #line 620 "cfdg.tab.cpp" break; default: break; } } void CfdgParser::yypop_ (unsigned int n) { yystate_stack_.pop (n); yysemantic_stack_.pop (n); yylocation_stack_.pop (n); } #if YYDEBUG std::ostream& CfdgParser::debug_stream () const { return *yycdebug_; } void CfdgParser::set_debug_stream (std::ostream& o) { yycdebug_ = &o; } CfdgParser::debug_level_type CfdgParser::debug_level () const { return yydebug_; } void CfdgParser::set_debug_level (debug_level_type l) { yydebug_ = l; } #endif inline bool CfdgParser::yy_pact_value_is_default_ (int yyvalue) { return yyvalue == yypact_ninf_; } inline bool CfdgParser::yy_table_value_is_error_ (int yyvalue) { return yyvalue == yytable_ninf_; } int CfdgParser::parse () { /// Lookahead and lookahead in internal form. int yychar = yyempty_; int yytoken = 0; // State. int yyn; int yylen = 0; int yystate = 0; // Error handling. int yynerrs_ = 0; int yyerrstatus_ = 0; /// Semantic value of the lookahead. static semantic_type yyval_default; semantic_type yylval = yyval_default; /// Location of the lookahead. location_type yylloc; /// The locations where the error started and ended. location_type yyerror_range[3]; /// $$. semantic_type yyval; /// @$. location_type yyloc; int yyresult; // FIXME: This shoud be completely indented. It is not yet to // avoid gratuitous conflicts when merging into the master branch. try { YYCDEBUG << "Starting parse" << std::endl; /* Initialize the stacks. The initial state will be pushed in yynewstate, since the latter expects the semantical and the location values to have been already stored, initialize these stacks with a primary value. */ yystate_stack_ = state_stack_type (0); yysemantic_stack_ = semantic_stack_type (0); yylocation_stack_ = location_stack_type (0); yysemantic_stack_.push (yylval); yylocation_stack_.push (yylloc); /* New state. */ yynewstate: yystate_stack_.push (yystate); YYCDEBUG << "Entering state " << yystate << std::endl; /* Accept? */ if (yystate == yyfinal_) goto yyacceptlab; goto yybackup; /* Backup. */ yybackup: /* Try to take a decision without lookahead. */ yyn = yypact_[yystate]; if (yy_pact_value_is_default_ (yyn)) goto yydefault; /* Read a lookahead token. */ if (yychar == yyempty_) { YYCDEBUG << "Reading a token: "; yychar = yylex (&yylval, &yylloc, driver); } /* Convert token to internal form. */ if (yychar <= yyeof_) { yychar = yytoken = yyeof_; YYCDEBUG << "Now at end of input." << std::endl; } else { yytoken = yytranslate_ (yychar); YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); } /* If the proper action on seeing token YYTOKEN is to reduce or to detect an error, take that action. */ yyn += yytoken; if (yyn < 0 || yylast_ < yyn || yycheck_[yyn] != yytoken) goto yydefault; /* Reduce or error. */ yyn = yytable_[yyn]; if (yyn <= 0) { if (yy_table_value_is_error_ (yyn)) goto yyerrlab; yyn = -yyn; goto yyreduce; } /* Shift the lookahead token. */ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); /* Discard the token being shifted. */ yychar = yyempty_; yysemantic_stack_.push (yylval); yylocation_stack_.push (yylloc); /* Count tokens shifted since error; after three, turn off error status. */ if (yyerrstatus_) --yyerrstatus_; yystate = yyn; goto yynewstate; /*-----------------------------------------------------------. | yydefault -- do the default action for the current state. | `-----------------------------------------------------------*/ yydefault: yyn = yydefact_[yystate]; if (yyn == 0) goto yyerrlab; goto yyreduce; /*-----------------------------. | yyreduce -- Do a reduction. | `-----------------------------*/ yyreduce: yylen = yyr2_[yyn]; /* If YYLEN is nonzero, implement the default value of the action: `$$ = $1'. Otherwise, use the top of the stack. Otherwise, the following line sets YYVAL to garbage. This behavior is undocumented and Bison users should not rely upon it. */ if (yylen) yyval = yysemantic_stack_[yylen - 1]; else yyval = yysemantic_stack_[0]; // Compute the default @$. { slice slice (yylocation_stack_, yylen); YYLLOC_DEFAULT (yyloc, slice, yylen); } // Perform the reduction. YY_REDUCE_PRINT (yyn); switch (yyn) { case 4: /* Line 670 of lalr1.cc */ #line 192 "../../src-common/cfdg.ypp" { if ((yysemantic_stack_[(2) - (2)].component)) { driver.push_rep((yysemantic_stack_[(2) - (2)].component), true); } } break; case 6: /* Line 670 of lalr1.cc */ #line 201 "../../src-common/cfdg.ypp" { if ((yysemantic_stack_[(2) - (2)].component)) { driver.push_rep((yysemantic_stack_[(2) - (2)].component), true); } } break; case 9: /* Line 670 of lalr1.cc */ #line 211 "../../src-common/cfdg.ypp" { (yyval.component) = 0; } break; case 10: /* Line 670 of lalr1.cc */ #line 212 "../../src-common/cfdg.ypp" { (yyval.component) = 0; } break; case 13: /* Line 670 of lalr1.cc */ #line 215 "../../src-common/cfdg.ypp" { (yyval.component) = (yysemantic_stack_[(1) - (1)].shapeObj); } break; case 15: /* Line 670 of lalr1.cc */ #line 217 "../../src-common/cfdg.ypp" { (yyval.component) = 0; } break; case 16: /* Line 670 of lalr1.cc */ #line 218 "../../src-common/cfdg.ypp" { error((yylocation_stack_[(1) - (1)]), "Illegal mixture of old and new elements"); (yyval.component) = 0; } break; case 19: /* Line 670 of lalr1.cc */ #line 227 "../../src-common/cfdg.ypp" { (yyval.component) = 0; } break; case 20: /* Line 670 of lalr1.cc */ #line 228 "../../src-common/cfdg.ypp" { (yyval.component) = 0; } break; case 25: /* Line 670 of lalr1.cc */ #line 233 "../../src-common/cfdg.ypp" { if (driver.lexer->maybeVersion == token::CFDG2) { error((yylocation_stack_[(1) - (1)]), "Illegal mixture of old and new elements"); } else { driver.lexer->maybeVersion = token::CFDG3; } (yyval.component) = 0; YYABORT; } break; case 26: /* Line 670 of lalr1.cc */ #line 245 "../../src-common/cfdg.ypp" { delete (yysemantic_stack_[(2) - (1)].string); } break; case 27: /* Line 670 of lalr1.cc */ #line 246 "../../src-common/cfdg.ypp" {} break; case 28: /* Line 670 of lalr1.cc */ #line 247 "../../src-common/cfdg.ypp" {} break; case 29: /* Line 670 of lalr1.cc */ #line 248 "../../src-common/cfdg.ypp" { delete (yysemantic_stack_[(2) - (1)].string); } break; case 30: /* Line 670 of lalr1.cc */ #line 249 "../../src-common/cfdg.ypp" { delete (yysemantic_stack_[(3) - (1)].string); delete (yysemantic_stack_[(3) - (2)].string); } break; case 33: /* Line 670 of lalr1.cc */ #line 252 "../../src-common/cfdg.ypp" { delete (yysemantic_stack_[(3) - (2)].string); } break; case 34: /* Line 670 of lalr1.cc */ #line 253 "../../src-common/cfdg.ypp" { delete (yysemantic_stack_[(3) - (2)].string); } break; case 35: /* Line 670 of lalr1.cc */ #line 254 "../../src-common/cfdg.ypp" { delete (yysemantic_stack_[(3) - (2)].string); } break; case 36: /* Line 670 of lalr1.cc */ #line 255 "../../src-common/cfdg.ypp" { delete (yysemantic_stack_[(3) - (2)].string); } break; case 37: /* Line 670 of lalr1.cc */ #line 259 "../../src-common/cfdg.ypp" { delete (yysemantic_stack_[(2) - (2)].mod); } break; case 38: /* Line 670 of lalr1.cc */ #line 260 "../../src-common/cfdg.ypp" { delete (yysemantic_stack_[(2) - (2)].mod); } break; case 39: /* Line 670 of lalr1.cc */ #line 261 "../../src-common/cfdg.ypp" { delete (yysemantic_stack_[(2) - (2)].mod); } break; case 40: /* Line 670 of lalr1.cc */ #line 262 "../../src-common/cfdg.ypp" { delete (yysemantic_stack_[(2) - (2)].string); } break; case 41: /* Line 670 of lalr1.cc */ #line 263 "../../src-common/cfdg.ypp" { delete (yysemantic_stack_[(1) - (1)].ruleObj); } break; case 42: /* Line 670 of lalr1.cc */ #line 267 "../../src-common/cfdg.ypp" { str_ptr file((yysemantic_stack_[(2) - (2)].string)); (yysemantic_stack_[(2) - (2)].string) = 0; driver.lexer->maybeVersion = token::CFDG2; driver.SetShape(NULL); driver.IncludeFile(*file); } break; case 43: /* Line 670 of lalr1.cc */ #line 276 "../../src-common/cfdg.ypp" { str_ptr file((yysemantic_stack_[(3) - (3)].string)); (yysemantic_stack_[(3) - (3)].string) = 0; str_ptr nm((yysemantic_stack_[(3) - (2)].string)); (yysemantic_stack_[(3) - (2)].string) = 0; driver.SetShape(NULL); driver.IncludeFile(*file); if (nm.get()) driver.PushNameSpace(nm, (yylocation_stack_[(3) - (2)])); } break; case 44: /* Line 670 of lalr1.cc */ #line 287 "../../src-common/cfdg.ypp" { if (driver.EndInclude()) YYACCEPT; } break; case 47: /* Line 670 of lalr1.cc */ #line 297 "../../src-common/cfdg.ypp" { (yyval.string) = (yysemantic_stack_[(2) - (2)].string); } break; case 48: /* Line 670 of lalr1.cc */ #line 298 "../../src-common/cfdg.ypp" { (yyval.string) = NULL; } break; case 49: /* Line 670 of lalr1.cc */ #line 302 "../../src-common/cfdg.ypp" { str_ptr name((yysemantic_stack_[(4) - (2)].string)); (yysemantic_stack_[(4) - (2)].string) = 0; exp_ptr p((yysemantic_stack_[(4) - (3)].expression)); (yysemantic_stack_[(4) - (3)].expression) = 0; mod_ptr mod((yysemantic_stack_[(4) - (4)].mod)); (yysemantic_stack_[(4) - (4)].mod) = 0; driver.SetShape(NULL); if (driver.mCompilePhase == 2) { ruleSpec_ptr r(driver.MakeRuleSpec(*name, p, (yylocation_stack_[(4) - (2)]))); rep_ptr start(new ASTreplacement(*r, *name, mod, (yyloc))); driver.Initialize(start); } (yyval.component) = 0; } break; case 50: /* Line 670 of lalr1.cc */ #line 315 "../../src-common/cfdg.ypp" { str_ptr name((yysemantic_stack_[(3) - (2)].string)); (yysemantic_stack_[(3) - (2)].string) = 0; mod_ptr mod((yysemantic_stack_[(3) - (3)].mod)); (yysemantic_stack_[(3) - (3)].mod) = 0; driver.SetShape(NULL); if (driver.mCompilePhase == 2) { ruleSpec_ptr r(driver.MakeRuleSpec(*name, exp_ptr(), (yylocation_stack_[(3) - (2)]))); rep_ptr start(new ASTreplacement(*r, *name, mod, (yyloc))); driver.Initialize(start); } (yyval.component) = 0; } break; case 51: /* Line 670 of lalr1.cc */ #line 327 "../../src-common/cfdg.ypp" { str_ptr name((yysemantic_stack_[(3) - (2)].string)); (yysemantic_stack_[(3) - (2)].string) = 0; exp_ptr p((yysemantic_stack_[(3) - (3)].expression)); (yysemantic_stack_[(3) - (3)].expression) = 0; driver.SetShape(NULL); if (driver.mCompilePhase == 2) { ruleSpec_ptr r(driver.MakeRuleSpec(*name, p, (yylocation_stack_[(3) - (2)]))); rep_ptr start(new ASTreplacement(*r, *name, mod_ptr(), (yyloc))); driver.Initialize(start); } (yyval.component) = 0; } break; case 52: /* Line 670 of lalr1.cc */ #line 341 "../../src-common/cfdg.ypp" { str_ptr name((yysemantic_stack_[(2) - (2)].string)); (yysemantic_stack_[(2) - (2)].string) = 0; driver.SetShape(NULL); ruleSpec_ptr r(driver.MakeRuleSpec(*name, exp_ptr(), (yylocation_stack_[(2) - (2)]))); rep_ptr start(new ASTreplacement(*r, *name, mod_ptr(), (yyloc))); driver.Initialize(start); (yyval.component) = 0; } break; case 53: /* Line 670 of lalr1.cc */ #line 352 "../../src-common/cfdg.ypp" { exp_ptr mod((yysemantic_stack_[(2) - (2)].mod)); (yysemantic_stack_[(2) - (2)].mod) = 0; static const std::string backVar("CF::Background"); driver.lexer->maybeVersion = token::CFDG2; driver.NextParameter(backVar, mod, (yylocation_stack_[(2) - (1)]), (yylocation_stack_[(2) - (2)])); (yyval.component) = 0; } break; case 54: /* Line 670 of lalr1.cc */ #line 362 "../../src-common/cfdg.ypp" { exp_ptr mod((yysemantic_stack_[(2) - (2)].mod)); (yysemantic_stack_[(2) - (2)].mod) = 0; static const std::string tileVar("CF::Tile"); driver.lexer->maybeVersion = token::CFDG2; driver.NextParameter(tileVar, mod, (yylocation_stack_[(2) - (1)]), (yylocation_stack_[(2) - (2)])); (yyval.component) = 0; } break; case 55: /* Line 670 of lalr1.cc */ #line 372 "../../src-common/cfdg.ypp" { exp_ptr mod((yysemantic_stack_[(2) - (2)].mod)); (yysemantic_stack_[(2) - (2)].mod) = 0; driver.lexer->maybeVersion = token::CFDG2; if ((yysemantic_stack_[(2) - (1)].modToken) != ASTmodTerm::size && (yysemantic_stack_[(2) - (1)].modToken) != ASTmodTerm::time) { error((yylocation_stack_[(2) - (1)]), "Syntax error"); } else { static const std::string sizeVar("CF::Size"); static const std::string timeVar("CF::Time"); driver.NextParameter((yysemantic_stack_[(2) - (1)].modToken) == ASTmodTerm::size ? sizeVar : timeVar, mod, (yylocation_stack_[(2) - (1)]), (yylocation_stack_[(2) - (2)])); } (yyval.component) = 0; } break; case 56: /* Line 670 of lalr1.cc */ #line 387 "../../src-common/cfdg.ypp" { str_ptr var((yysemantic_stack_[(2) - (1)].string)); (yysemantic_stack_[(2) - (1)].string) = 0; exp_ptr exp((yysemantic_stack_[(2) - (2)].expression)); (yysemantic_stack_[(2) - (2)].expression) = 0; if (var.get()) driver.NextParameter(*var, exp, (yylocation_stack_[(2) - (1)]), (yylocation_stack_[(2) - (2)])); } break; case 57: /* Line 670 of lalr1.cc */ #line 396 "../../src-common/cfdg.ypp" { static const std::string numtype("shape"); driver.push_paramDecls(*(yysemantic_stack_[(4) - (2)].string), (yyloc), numtype); (yyval.string) = (yysemantic_stack_[(4) - (2)].string); } break; case 58: /* Line 670 of lalr1.cc */ #line 402 "../../src-common/cfdg.ypp" { static const std::string numtype("number"); driver.push_paramDecls(*(yysemantic_stack_[(3) - (1)].string), (yyloc), numtype); (yyval.string) = (yysemantic_stack_[(3) - (1)].string); } break; case 59: /* Line 670 of lalr1.cc */ #line 408 "../../src-common/cfdg.ypp" { str_ptr type((yysemantic_stack_[(4) - (1)].string)); (yysemantic_stack_[(4) - (1)].string) = 0; driver.push_paramDecls(*(yysemantic_stack_[(4) - (2)].string), (yyloc), *type); (yyval.string) = (yysemantic_stack_[(4) - (2)].string); } break; case 60: /* Line 670 of lalr1.cc */ #line 414 "../../src-common/cfdg.ypp" { (yyval.string) = (yysemantic_stack_[(2) - (1)].string); } break; case 61: /* Line 670 of lalr1.cc */ #line 418 "../../src-common/cfdg.ypp" { error((yylocation_stack_[(4) - (2)]), "Reserved keyword: adjustment"); (yyval.string) = 0; } break; case 62: /* Line 670 of lalr1.cc */ #line 423 "../../src-common/cfdg.ypp" { error((yylocation_stack_[(3) - (1)]), "Reserved keyword: adjustment"); (yyval.string) = 0; } break; case 63: /* Line 670 of lalr1.cc */ #line 428 "../../src-common/cfdg.ypp" { str_ptr type((yysemantic_stack_[(4) - (1)].string)); (yysemantic_stack_[(4) - (1)].string) = 0; error((yylocation_stack_[(4) - (2)]), "Reserved keyword: adjustment"); (yyval.string) = 0; } break; case 64: /* Line 670 of lalr1.cc */ #line 434 "../../src-common/cfdg.ypp" { error((yylocation_stack_[(2) - (1)]), "Reserved keyword: adjustment"); (yyval.string) = 0; } break; case 65: /* Line 670 of lalr1.cc */ #line 441 "../../src-common/cfdg.ypp" { (yyval.string) = (yysemantic_stack_[(2) - (1)].string); } break; case 66: /* Line 670 of lalr1.cc */ #line 444 "../../src-common/cfdg.ypp" { error((yylocation_stack_[(2) - (1)]), "Reserved keyword: adjustment"); (yyval.string) = 0; } break; case 67: /* Line 670 of lalr1.cc */ #line 451 "../../src-common/cfdg.ypp" { str_ptr var((yysemantic_stack_[(2) - (1)].string)); (yysemantic_stack_[(2) - (1)].string) = 0; exp_ptr exp((yysemantic_stack_[(2) - (2)].expression)); (yysemantic_stack_[(2) - (2)].expression) = 0; if (var.get() && driver.mCompilePhase == 2) driver.NextParameter(*var, exp, (yylocation_stack_[(2) - (1)]), (yylocation_stack_[(2) - (2)])); } break; case 68: /* Line 670 of lalr1.cc */ #line 460 "../../src-common/cfdg.ypp" { str_ptr name((yysemantic_stack_[(3) - (2)].string)); (yysemantic_stack_[(3) - (2)].string) = 0; bool hasParams = !driver.mParamDecls.mParameters.empty(); exp_ptr dummy(hasParams ? new ASTexpression((yylocation_stack_[(3) - (2)])) : NULL); ASTruleSpecifier r(driver.StringToShape(*name, (yylocation_stack_[(3) - (2)]), false), *name, dummy, (yyloc), &(driver.mParamDecls.mParameters), &(driver.mParamDecls.mParameters)); ASTshape* s = new ASTshape(r, false, (yylocation_stack_[(3) - (1)]) + (yylocation_stack_[(3) - (2)])); s->mRules.mParameters.swap(driver.mParamDecls.mParameters); driver.SetShape(s); s->mShapeSpec.typeSignature = hasParams ? &(s->mRules.mParameters) : NULL; (yyval.shapeObj) = s; } break; case 69: /* Line 670 of lalr1.cc */ #line 476 "../../src-common/cfdg.ypp" { driver.push_rep((yysemantic_stack_[(2) - (1)].shapeObj), true); if (driver.mCompilePhase == 2) { driver.mInPathContainer = false; rule_ptr rule(new ASTrule(-1, (yylocation_stack_[(2) - (1)]))); driver.AddRule(rule.get()); driver.push_repContainer(rule->mRuleBody); (yyval.ruleObj) = rule.release(); } else { (yyval.ruleObj) = 0; } } break; case 70: /* Line 670 of lalr1.cc */ #line 490 "../../src-common/cfdg.ypp" { (yyval.component) = (yysemantic_stack_[(3) - (1)].ruleObj); if (driver.mCompilePhase == 2) driver.pop_repContainer((yysemantic_stack_[(3) - (1)].ruleObj)); driver.mInPathContainer = false; } break; case 71: /* Line 670 of lalr1.cc */ #line 499 "../../src-common/cfdg.ypp" { str_ptr name((yysemantic_stack_[(2) - (2)].string)); (yysemantic_stack_[(2) - (2)].string) = 0; driver.SetShape(NULL); rule_ptr rule(new ASTrule(driver.StringToShape(*name, (yylocation_stack_[(2) - (2)]), false), (yyloc))); driver.AddRule(rule.get()); driver.push_repContainer(rule->mRuleBody); (yyval.ruleObj) = rule.release(); } break; case 72: /* Line 670 of lalr1.cc */ #line 508 "../../src-common/cfdg.ypp" { str_ptr name((yysemantic_stack_[(3) - (2)].string)); (yysemantic_stack_[(3) - (2)].string) = 0; str_ptr weight((yysemantic_stack_[(3) - (3)].string)); (yysemantic_stack_[(3) - (3)].string) = 0; driver.SetShape(NULL); rule_ptr rule(new ASTrule(driver.StringToShape(*name, (yylocation_stack_[(3) - (2)]), false), CFatof(weight->c_str()), weight->find_first_of('%') != std::string::npos, (yyloc))); driver.AddRule(rule.get()); driver.push_repContainer(rule->mRuleBody); (yyval.ruleObj) = rule.release(); } break; case 73: /* Line 670 of lalr1.cc */ #line 523 "../../src-common/cfdg.ypp" { driver.lexer->maybeVersion = token::CFDG2; (yyval.component) = (yysemantic_stack_[(4) - (1)].ruleObj); driver.pop_repContainer((yysemantic_stack_[(4) - (1)].ruleObj)); } break; case 74: /* Line 670 of lalr1.cc */ #line 531 "../../src-common/cfdg.ypp" { driver.mInPathContainer = false; if (driver.mCompilePhase == 2) { rule_ptr rule(new ASTrule(-1, (yylocation_stack_[(1) - (1)]))); driver.AddRule(rule.get()); driver.push_repContainer(rule->mRuleBody); (yyval.ruleObj) = rule.release(); } else { (yyval.ruleObj) = 0; } } break; case 75: /* Line 670 of lalr1.cc */ #line 543 "../../src-common/cfdg.ypp" { driver.mInPathContainer = false; str_ptr weight((yysemantic_stack_[(2) - (2)].string)); (yysemantic_stack_[(2) - (2)].string) = 0; if (driver.mCompilePhase == 2) { rule_ptr rule(new ASTrule(-1, CFatof(weight->c_str()), weight->find_first_of('%') != std::string::npos, (yyloc))); driver.AddRule(rule.get()); driver.push_repContainer(rule->mRuleBody); (yyval.ruleObj) = rule.release(); } else { (yyval.ruleObj) = 0; } } break; case 76: /* Line 670 of lalr1.cc */ #line 560 "../../src-common/cfdg.ypp" { str_ptr name((yysemantic_stack_[(3) - (2)].string)); (yysemantic_stack_[(3) - (2)].string) = 0; bool hasParams = !driver.mParamDecls.mParameters.empty(); exp_ptr dummy(hasParams ? new ASTexpression((yylocation_stack_[(3) - (2)])) : NULL); ASTruleSpecifier r(driver.StringToShape(*name, (yylocation_stack_[(3) - (2)]), false), *name, dummy, (yyloc), &(driver.mParamDecls.mParameters), &(driver.mParamDecls.mParameters)); ASTshape* s = new ASTshape(r, false, (yylocation_stack_[(3) - (1)]) + (yylocation_stack_[(3) - (2)])); s->mRules.mParameters.swap(driver.mParamDecls.mParameters); driver.SetShape(s, true); s->mShapeSpec.typeSignature = hasParams ? &(s->mRules.mParameters) : NULL; driver.mInPathContainer = true; if (driver.mCompilePhase == 2) { rule_ptr newPath(new ASTrule(-1, (yyloc))); newPath->isPath = true; driver.AddRule(newPath.get()); driver.push_repContainer(newPath->mRuleBody); (yyval.ruleObj) = newPath.release(); } else { (yyval.ruleObj) = 0; } } break; case 77: /* Line 670 of lalr1.cc */ #line 585 "../../src-common/cfdg.ypp" { (yyval.component) = (yysemantic_stack_[(4) - (1)].ruleObj); if (driver.mCompilePhase == 2) driver.pop_repContainer((yysemantic_stack_[(4) - (1)].ruleObj)); driver.mInPathContainer = false; } break; case 78: /* Line 670 of lalr1.cc */ #line 594 "../../src-common/cfdg.ypp" { (yyval.component) = (yysemantic_stack_[(4) - (1)].ruleObj); if (driver.mCompilePhase == 2) driver.pop_repContainer((yysemantic_stack_[(4) - (1)].ruleObj)); driver.mInPathContainer = false; driver.SetShape(NULL); } break; case 79: /* Line 670 of lalr1.cc */ #line 604 "../../src-common/cfdg.ypp" { str_ptr name((yysemantic_stack_[(2) - (2)].string)); (yysemantic_stack_[(2) - (2)].string) = 0; driver.SetShape(NULL); rule_ptr newPath(new ASTrule(driver.StringToShape(*name, (yylocation_stack_[(2) - (2)]), false), (yyloc))); newPath->isPath = true; driver.AddRule(newPath.get()); driver.push_repContainer(newPath->mRuleBody); driver.mInPathContainer = true; (yyval.ruleObj) = newPath.release(); } break; case 80: /* Line 670 of lalr1.cc */ #line 617 "../../src-common/cfdg.ypp" { (yyval.component) = (yysemantic_stack_[(4) - (1)].ruleObj); driver.pop_repContainer((yysemantic_stack_[(4) - (1)].ruleObj)); } break; case 81: /* Line 670 of lalr1.cc */ #line 624 "../../src-common/cfdg.ypp" { str_ptr type((yysemantic_stack_[(2) - (1)].string)); (yysemantic_stack_[(2) - (1)].string) = 0; str_ptr var((yysemantic_stack_[(2) - (2)].string)); (yysemantic_stack_[(2) - (2)].string) = 0; driver.NextParameterDecl(*type, *var, (yylocation_stack_[(2) - (1)]), (yylocation_stack_[(2) - (2)])); } break; case 82: /* Line 670 of lalr1.cc */ #line 630 "../../src-common/cfdg.ypp" { static std::string shapeStr("shape"); str_ptr var((yysemantic_stack_[(2) - (2)].string)); (yysemantic_stack_[(2) - (2)].string) = 0; driver.NextParameterDecl(shapeStr, *var, (yylocation_stack_[(2) - (1)]), (yylocation_stack_[(2) - (2)])); } break; case 83: /* Line 670 of lalr1.cc */ #line 636 "../../src-common/cfdg.ypp" { delete (yysemantic_stack_[(2) - (1)].string); error((yylocation_stack_[(2) - (2)]), "Reserved keyword: adjustment"); } break; case 84: /* Line 670 of lalr1.cc */ #line 641 "../../src-common/cfdg.ypp" { error((yylocation_stack_[(2) - (2)]), "Reserved keyword: adjustment"); } break; case 85: /* Line 670 of lalr1.cc */ #line 645 "../../src-common/cfdg.ypp" { static const std::string numtype("number"); str_ptr var((yysemantic_stack_[(1) - (1)].string)); (yysemantic_stack_[(1) - (1)].string) = 0; driver.NextParameterDecl(numtype, *var, (yylocation_stack_[(1) - (1)]), (yylocation_stack_[(1) - (1)])); } break; case 86: /* Line 670 of lalr1.cc */ #line 651 "../../src-common/cfdg.ypp" { error((yylocation_stack_[(1) - (1)]), "Reserved keyword: adjustment"); } break; case 93: /* Line 670 of lalr1.cc */ #line 672 "../../src-common/cfdg.ypp" { (yyval.expression) = (yysemantic_stack_[(3) - (2)].expression);} break; case 94: /* Line 670 of lalr1.cc */ #line 673 "../../src-common/cfdg.ypp" { (yyval.expression) = new ASTexpression((yyloc)); } break; case 95: /* Line 670 of lalr1.cc */ #line 674 "../../src-common/cfdg.ypp" { (yyval.expression) = 0; } break; case 96: /* Line 670 of lalr1.cc */ #line 675 "../../src-common/cfdg.ypp" { (yyval.expression) = 0; } break; case 97: /* Line 670 of lalr1.cc */ #line 679 "../../src-common/cfdg.ypp" { if (driver.mCompilePhase == 1) assert ((yysemantic_stack_[(2) - (2)].component) == 0); driver.push_rep((yysemantic_stack_[(2) - (2)].component)); } break; case 99: /* Line 670 of lalr1.cc */ #line 688 "../../src-common/cfdg.ypp" { driver.push_rep((yysemantic_stack_[(2) - (2)].component)); } break; case 101: /* Line 670 of lalr1.cc */ #line 695 "../../src-common/cfdg.ypp" { str_ptr pop((yysemantic_stack_[(4) - (1)].string)); (yysemantic_stack_[(4) - (1)].string) = 0; mod_ptr mod((yysemantic_stack_[(4) - (3)].mod)); (yysemantic_stack_[(4) - (3)].mod) = 0; driver.lexer->maybeVersion = token::CFDG2; (yyval.component) = new ASTpathOp(*pop, mod, (yyloc)); } break; case 102: /* Line 670 of lalr1.cc */ #line 702 "../../src-common/cfdg.ypp" { str_ptr cmd((yysemantic_stack_[(2) - (1)].string)); (yysemantic_stack_[(2) - (1)].string) = 0; mod_ptr mod((yysemantic_stack_[(2) - (2)].mod)); (yysemantic_stack_[(2) - (2)].mod) = 0; driver.lexer->maybeVersion = token::CFDG2; rep_ptr item(new ASTpathCommand(*cmd, mod, (yyloc))); (yyval.component) = item.release(); } break; case 103: /* Line 670 of lalr1.cc */ #line 712 "../../src-common/cfdg.ypp" { str_ptr pop((yysemantic_stack_[(4) - (1)].string)); (yysemantic_stack_[(4) - (1)].string) = 0; exp_ptr mod((yysemantic_stack_[(4) - (3)].expression)); (yysemantic_stack_[(4) - (3)].expression) = 0; if (driver.mCompilePhase == 2) (yyval.component) = new ASTpathOp(*pop, mod, (yyloc)); else (yyval.component) = 0; } break; case 104: /* Line 670 of lalr1.cc */ #line 721 "../../src-common/cfdg.ypp" { str_ptr pop((yysemantic_stack_[(3) - (1)].string)); (yysemantic_stack_[(3) - (1)].string) = 0; exp_ptr mod; if (driver.mCompilePhase == 2) (yyval.component) = new ASTpathOp(*pop, mod, (yyloc)); else (yyval.component) = 0; } break; case 105: /* Line 670 of lalr1.cc */ #line 730 "../../src-common/cfdg.ypp" { str_ptr cmd((yysemantic_stack_[(3) - (1)].string)); (yysemantic_stack_[(3) - (1)].string) = 0; exp_ptr p((yysemantic_stack_[(3) - (2)].expression)); (yysemantic_stack_[(3) - (2)].expression) = 0; mod_ptr mod((yysemantic_stack_[(3) - (3)].mod)); (yysemantic_stack_[(3) - (3)].mod) = 0; if (driver.mCompilePhase == 2) { rep_ptr item = driver.MakeElement(*cmd, mod, p, (yyloc), false); (yyval.component) = item.release(); } else { (yyval.component) = 0; } } break; case 106: /* Line 670 of lalr1.cc */ #line 742 "../../src-common/cfdg.ypp" { exp_ptr args((yysemantic_stack_[(5) - (3)].expression)); (yysemantic_stack_[(5) - (3)].expression) = 0; mod_ptr mod((yysemantic_stack_[(5) - (5)].mod)); (yysemantic_stack_[(5) - (5)].mod) = 0; if (driver.mCompilePhase == 2) { str_ptr func(new std::string("if")); args.reset(driver.MakeFunction(func, args, (yylocation_stack_[(5) - (1)]), (yylocation_stack_[(5) - (3)]), false)); static const std::string ifstr("if"); rep_ptr item = driver.MakeElement(ifstr, mod, args, (yyloc), false); (yyval.component) = item.release(); } else { (yyval.component) = 0; } } break; case 107: /* Line 670 of lalr1.cc */ #line 756 "../../src-common/cfdg.ypp" { std::auto_ptr vars((yysemantic_stack_[(3) - (1)].bodyObj)); exp_ptr exp((yysemantic_stack_[(3) - (2)].expression)); (yysemantic_stack_[(3) - (2)].expression) = 0; mod_ptr mod((yysemantic_stack_[(3) - (3)].mod)); (yysemantic_stack_[(3) - (3)].mod) = 0; exp.reset(driver.MakeLet((yylocation_stack_[(3) - (1)]), exp)); // must do unconditionally if (driver.mCompilePhase == 2) { static const std::string letstr("let"); rep_ptr item = driver.MakeElement(letstr, mod, exp, (yyloc), false); (yyval.component) = item.release(); } else { (yyval.component) = 0; } } break; case 108: /* Line 670 of lalr1.cc */ #line 770 "../../src-common/cfdg.ypp" { str_ptr cmd((yysemantic_stack_[(4) - (2)].string)); (yysemantic_stack_[(4) - (2)].string) = 0; exp_ptr p((yysemantic_stack_[(4) - (3)].expression)); (yysemantic_stack_[(4) - (3)].expression) = 0; mod_ptr mod((yysemantic_stack_[(4) - (4)].mod)); (yysemantic_stack_[(4) - (4)].mod) = 0; if (driver.mCompilePhase == 2) { rep_ptr item = driver.MakeElement(*cmd, mod, p, (yyloc), true); (yyval.component) = item.release(); } else { (yyval.component) = 0; } } break; case 109: /* Line 670 of lalr1.cc */ #line 784 "../../src-common/cfdg.ypp" { } break; case 110: /* Line 670 of lalr1.cc */ #line 786 "../../src-common/cfdg.ypp" { if (driver.mCompilePhase == 1) assert((yysemantic_stack_[(1) - (1)].component) == 0); driver.push_rep((yysemantic_stack_[(1) - (1)].component)); } break; case 111: /* Line 670 of lalr1.cc */ #line 794 "../../src-common/cfdg.ypp" { } break; case 112: /* Line 670 of lalr1.cc */ #line 796 "../../src-common/cfdg.ypp" { driver.push_rep((yysemantic_stack_[(1) - (1)].component)); } break; case 113: /* Line 670 of lalr1.cc */ #line 802 "../../src-common/cfdg.ypp" { if (driver.mCompilePhase == 2) driver.pop_repContainer(driver.switchStack.top()); } break; case 116: /* Line 670 of lalr1.cc */ #line 814 "../../src-common/cfdg.ypp" { (yyval.component) = (yysemantic_stack_[(1) - (1)].component); } break; case 117: /* Line 670 of lalr1.cc */ #line 818 "../../src-common/cfdg.ypp" { (yyval.component) = 0; } break; case 118: /* Line 670 of lalr1.cc */ #line 822 "../../src-common/cfdg.ypp" { (yyval.component) = (yysemantic_stack_[(1) - (1)].loopObj); if (driver.mCompilePhase == 2) { driver.pop_repContainer((yysemantic_stack_[(1) - (1)].loopObj)); if ((yysemantic_stack_[(1) - (1)].loopObj)->mRepType == 0) { delete (yysemantic_stack_[(1) - (1)].loopObj); (yyval.component) = 0; } } } break; case 119: /* Line 670 of lalr1.cc */ #line 833 "../../src-common/cfdg.ypp" { if (driver.mCompilePhase == 2) { driver.pop_repContainer((yysemantic_stack_[(2) - (1)].loopObj)); driver.push_repContainer((yysemantic_stack_[(2) - (1)].loopObj)->mFinallyBody); } } break; case 120: /* Line 670 of lalr1.cc */ #line 838 "../../src-common/cfdg.ypp" { if (driver.mCompilePhase == 2) { driver.pop_repContainer((yysemantic_stack_[(4) - (1)].loopObj)); (yyval.component) = (yysemantic_stack_[(4) - (1)].loopObj); if ((yysemantic_stack_[(4) - (1)].loopObj)->mRepType == 0) { delete (yysemantic_stack_[(4) - (1)].loopObj); (yyval.component) = 0; } } else { (yyval.component) = 0; } } break; case 121: /* Line 670 of lalr1.cc */ #line 851 "../../src-common/cfdg.ypp" { (yyval.component) = (yysemantic_stack_[(2) - (1)].ifObj); if (driver.mCompilePhase == 2) { driver.pop_repContainer((yysemantic_stack_[(2) - (1)].ifObj)); if ((yysemantic_stack_[(2) - (1)].ifObj)->mRepType == 0) { delete (yysemantic_stack_[(2) - (1)].ifObj); (yyval.component) = 0; } } } break; case 122: /* Line 670 of lalr1.cc */ #line 862 "../../src-common/cfdg.ypp" { (yyval.component) = (yysemantic_stack_[(2) - (1)].ifObj); if (driver.mCompilePhase == 2) { driver.pop_repContainer((yysemantic_stack_[(2) - (1)].ifObj)); if ((yysemantic_stack_[(2) - (1)].ifObj)->mRepType == 0) { delete (yysemantic_stack_[(2) - (1)].ifObj); (yyval.component) = 0; } } } break; case 123: /* Line 670 of lalr1.cc */ #line 873 "../../src-common/cfdg.ypp" { (yyval.component) = (yysemantic_stack_[(2) - (1)].component); if (driver.mCompilePhase == 2) { driver.pop_repContainer((yysemantic_stack_[(2) - (1)].component)); if ((yysemantic_stack_[(2) - (1)].component)->mRepType == 0) { delete (yysemantic_stack_[(2) - (1)].component); (yyval.component) = 0; } } } break; case 124: /* Line 670 of lalr1.cc */ #line 885 "../../src-common/cfdg.ypp" { (yyval.component) = (yysemantic_stack_[(4) - (1)].switchObj); if (driver.mCompilePhase == 2) { (yysemantic_stack_[(4) - (1)].switchObj)->unify(); driver.switchStack.pop(); } } break; case 125: /* Line 670 of lalr1.cc */ #line 893 "../../src-common/cfdg.ypp" { error((yylocation_stack_[(1) - (1)]), "Illegal mixture of old and new elements"); (yyval.component) = 0; } break; case 126: /* Line 670 of lalr1.cc */ #line 900 "../../src-common/cfdg.ypp" { delete (yysemantic_stack_[(2) - (1)].string); } break; case 127: /* Line 670 of lalr1.cc */ #line 901 "../../src-common/cfdg.ypp" { delete (yysemantic_stack_[(2) - (1)].string); } break; case 128: /* Line 670 of lalr1.cc */ #line 902 "../../src-common/cfdg.ypp" { delete (yysemantic_stack_[(2) - (1)].string); } break; case 129: /* Line 670 of lalr1.cc */ #line 906 "../../src-common/cfdg.ypp" { (yyval.component) = (yysemantic_stack_[(1) - (1)].component); } break; case 130: /* Line 670 of lalr1.cc */ #line 908 "../../src-common/cfdg.ypp" { (yyval.component) = (yysemantic_stack_[(2) - (1)].loopObj); driver.pop_repContainer((yysemantic_stack_[(2) - (1)].loopObj)); if ((yysemantic_stack_[(2) - (1)].loopObj)->mRepType == 0) { delete (yysemantic_stack_[(2) - (1)].loopObj); (yyval.component) = 0; } } break; case 131: /* Line 670 of lalr1.cc */ #line 916 "../../src-common/cfdg.ypp" { if (driver.lexer->maybeVersion == token::CFDG2) { error((yylocation_stack_[(1) - (1)]), "Illegal mixture of old and new elements"); } else { driver.lexer->maybeVersion = token::CFDG3; } (yyval.component) = 0; YYABORT; } break; case 132: /* Line 670 of lalr1.cc */ #line 928 "../../src-common/cfdg.ypp" { delete (yysemantic_stack_[(2) - (1)].string); } break; case 133: /* Line 670 of lalr1.cc */ #line 929 "../../src-common/cfdg.ypp" { delete (yysemantic_stack_[(2) - (1)].string); } break; case 136: /* Line 670 of lalr1.cc */ #line 932 "../../src-common/cfdg.ypp" { delete (yysemantic_stack_[(2) - (1)].string); } break; case 141: /* Line 670 of lalr1.cc */ #line 940 "../../src-common/cfdg.ypp" { // parse loop mod and loop body with loop index in scope mod_ptr loopmod((yysemantic_stack_[(3) - (2)].mod)); (yysemantic_stack_[(3) - (2)].mod) = 0; if (driver.mCompilePhase == 2) (yysemantic_stack_[(3) - (1)].loopObj)->mChildChange.grab(loopmod.get()); (yyval.loopObj) = (yysemantic_stack_[(3) - (1)].loopObj); // loopmod gets deleted } break; case 142: /* Line 670 of lalr1.cc */ #line 951 "../../src-common/cfdg.ypp" { driver.push_rep((yysemantic_stack_[(2) - (2)].component)); } break; case 144: /* Line 670 of lalr1.cc */ #line 958 "../../src-common/cfdg.ypp" { } break; case 145: /* Line 670 of lalr1.cc */ #line 960 "../../src-common/cfdg.ypp" { driver.push_rep((yysemantic_stack_[(1) - (1)].component)); } break; case 146: /* Line 670 of lalr1.cc */ #line 966 "../../src-common/cfdg.ypp" { str_ptr name((yysemantic_stack_[(2) - (1)].string)); (yysemantic_stack_[(2) - (1)].string) = 0; mod_ptr mod((yysemantic_stack_[(2) - (2)].mod)); (yysemantic_stack_[(2) - (2)].mod) = 0; ruleSpec_ptr r(driver.MakeRuleSpec(*name, exp_ptr(), (yylocation_stack_[(2) - (1)]))); (yyval.component) = new ASTreplacement(*r, r->entropyVal, mod, (yyloc)); } break; case 147: /* Line 670 of lalr1.cc */ #line 975 "../../src-common/cfdg.ypp" { (yyval.component) = (yysemantic_stack_[(1) - (1)].component); } break; case 148: /* Line 670 of lalr1.cc */ #line 977 "../../src-common/cfdg.ypp" { (yyval.component) = (yysemantic_stack_[(2) - (1)].loopObj); driver.pop_repContainer((yysemantic_stack_[(2) - (1)].loopObj)); if ((yysemantic_stack_[(2) - (1)].loopObj)->mRepType == 0) { delete (yysemantic_stack_[(2) - (1)].loopObj); (yyval.component) = 0; } } break; case 149: /* Line 670 of lalr1.cc */ #line 988 "../../src-common/cfdg.ypp" { ++driver.mLocalStackDepth; } break; case 150: /* Line 670 of lalr1.cc */ #line 988 "../../src-common/cfdg.ypp" { str_ptr cstr((yysemantic_stack_[(4) - (1)].string)); (yysemantic_stack_[(4) - (1)].string) = 0; exp_ptr count(new ASTreal(*cstr, (yylocation_stack_[(4) - (1)]))); mod_ptr mod((yysemantic_stack_[(4) - (4)].mod)); (yysemantic_stack_[(4) - (4)].mod) = 0; static const std::string dummyvar("~~inaccessiblevar~~"); --driver.mLocalStackDepth; driver.lexer->maybeVersion = token::CFDG2; loop_ptr loop(new ASTloop(driver.StringToShape(dummyvar, (yylocation_stack_[(4) - (2)]), false), dummyvar, (yylocation_stack_[(4) - (2)]), count, (yyloc), mod)); driver.push_repContainer(loop->mLoopBody); (yyval.loopObj) = loop.release(); } break; case 151: /* Line 670 of lalr1.cc */ #line 1003 "../../src-common/cfdg.ypp" { str_ptr var((yysemantic_stack_[(4) - (2)].string)); (yysemantic_stack_[(4) - (2)].string) = 0; exp_ptr index((yysemantic_stack_[(4) - (4)].expression)); (yysemantic_stack_[(4) - (4)].expression) = 0; if (driver.mCompilePhase == 2) { int nameIndex = driver.StringToShape(*var, (yylocation_stack_[(4) - (2)]), false); loop_ptr loop(new ASTloop(nameIndex, *var, (yylocation_stack_[(4) - (2)]), index, (yylocation_stack_[(4) - (4)]), mod_ptr())); driver.push_repContainer(loop->mLoopBody); (yyval.loopObj) = loop.release(); } else { (yyval.loopObj) = 0; } } break; case 152: /* Line 670 of lalr1.cc */ #line 1016 "../../src-common/cfdg.ypp" { exp_ptr index((yysemantic_stack_[(4) - (4)].expression)); (yysemantic_stack_[(4) - (4)].expression) = 0; if (driver.mCompilePhase == 2) { static const std::string dummyvar("~~inaccessiblevar~~"); loop_ptr loop(new ASTloop(driver.StringToShape(dummyvar, (yylocation_stack_[(4) - (1)]), false), dummyvar, (yylocation_stack_[(4) - (2)]), index, (yylocation_stack_[(4) - (4)]), mod_ptr())); driver.push_repContainer(loop->mLoopBody); (yyval.loopObj) = loop.release(); } else { (yyval.loopObj) = 0; } error((yylocation_stack_[(4) - (2)]), "Reserved keyword: adjustment"); } break; case 153: /* Line 670 of lalr1.cc */ #line 1030 "../../src-common/cfdg.ypp" { exp_ptr count((yysemantic_stack_[(2) - (2)].expression)); (yysemantic_stack_[(2) - (2)].expression) = 0; if (driver.mCompilePhase == 2) { static const std::string dummyvar("~~inaccessiblevar~~"); loop_ptr loop(new ASTloop(driver.StringToShape(dummyvar, (yylocation_stack_[(2) - (1)]), false), dummyvar, (yylocation_stack_[(2) - (1)]), count, (yylocation_stack_[(2) - (2)]), mod_ptr())); driver.push_repContainer(loop->mLoopBody); (yyval.loopObj) = loop.release(); } else { (yyval.loopObj) = 0; } } break; case 154: /* Line 670 of lalr1.cc */ #line 1045 "../../src-common/cfdg.ypp" { exp_ptr cond((yysemantic_stack_[(4) - (3)].expression)); (yysemantic_stack_[(4) - (3)].expression) = 0; if (driver.mCompilePhase == 2) { if_ptr ifHeader(new ASTif(cond, (yylocation_stack_[(4) - (3)]))); driver.push_repContainer(ifHeader->mThenBody); (yyval.ifObj) = ifHeader.release(); } else { (yyval.ifObj) = 0; } } break; case 155: /* Line 670 of lalr1.cc */ #line 1058 "../../src-common/cfdg.ypp" { if (driver.mCompilePhase == 2) { driver.pop_repContainer((yysemantic_stack_[(3) - (1)].ifObj)); driver.push_repContainer((yysemantic_stack_[(3) - (1)].ifObj)->mElseBody); } (yyval.ifObj) = (yysemantic_stack_[(3) - (1)].ifObj); } break; case 156: /* Line 670 of lalr1.cc */ #line 1068 "../../src-common/cfdg.ypp" { exp_ptr mods((yysemantic_stack_[(2) - (2)].expression)); (yysemantic_stack_[(2) - (2)].expression) = 0; if ((yysemantic_stack_[(2) - (1)].modToken) != ASTmodTerm::transform) error((yylocation_stack_[(2) - (1)]), "Syntax error"); if (driver.mCompilePhase == 2) { ASTtransform* trans = new ASTtransform((yyloc), mods); driver.push_repContainer(trans->mBody); (yyval.component) = trans; } else { (yyval.component) = 0; } } break; case 157: /* Line 670 of lalr1.cc */ #line 1080 "../../src-common/cfdg.ypp" { exp_ptr mods((yysemantic_stack_[(2) - (2)].expression)); (yysemantic_stack_[(2) - (2)].expression) = 0; if (!ASTparameter::Impure) error((yylocation_stack_[(2) - (1)]), "shape cloning only permitted in impure mode"); if (driver.mCompilePhase == 2) { ASTtransform* trans = new ASTtransform((yyloc), mods); trans->mClone = true; driver.push_repContainer(trans->mBody); (yyval.component) = trans; } else { (yyval.component) = 0; } } break; case 158: /* Line 670 of lalr1.cc */ #line 1096 "../../src-common/cfdg.ypp" { exp_ptr caseVal((yysemantic_stack_[(4) - (3)].expression)); (yysemantic_stack_[(4) - (3)].expression) = 0; if (driver.mCompilePhase == 2) { switch_ptr switchHeader(new ASTswitch(caseVal, (yylocation_stack_[(4) - (3)]))); driver.switchStack.push(switchHeader.get()); (yyval.switchObj) = switchHeader.release(); } else { (yyval.switchObj) = 0; } } break; case 159: /* Line 670 of lalr1.cc */ #line 1109 "../../src-common/cfdg.ypp" { exp_ptr valExp((yysemantic_stack_[(3) - (2)].expression)); (yysemantic_stack_[(3) - (2)].expression) = 0; if (driver.mCompilePhase == 2) { double val = 0.0; try { if (valExp->evaluate(&val, 1) != 1) { driver.error((yylocation_stack_[(3) - (2)]), "Case expression is not a single, numeric expression"); } else { int intval = (int)floor(val); ASTswitch::switchMap& caseMap = driver.switchStack.top()->mCaseStatements; if (caseMap.count(intval)) { driver.error((yylocation_stack_[(3) - (2)]), "Case value already in use"); driver.push_repContainer(*(caseMap[intval])); } else { ASTrepContainer* caseBody = new ASTrepContainer(); caseMap[intval] = caseBody; driver.push_repContainer(*caseBody); } } } catch (DeferUntilRuntime) { driver.error((yylocation_stack_[(3) - (2)]), "Case expression is not constant"); } } (yyval.modToken) = 0; } break; case 160: /* Line 670 of lalr1.cc */ #line 1138 "../../src-common/cfdg.ypp" { if (driver.mCompilePhase == 2) { if (!driver.switchStack.top()->mElseBody.mBody.empty()) { driver.error((yyloc), "There can only be one 'else:' clause"); } else { driver.push_repContainer(driver.switchStack.top()->mElseBody); } } (yyval.modToken) = 0; } break; case 161: /* Line 670 of lalr1.cc */ #line 1151 "../../src-common/cfdg.ypp" { mod_ptr mod((yysemantic_stack_[(3) - (2)].mod)); (yysemantic_stack_[(3) - (2)].mod) = 0; (yyval.mod) = driver.MakeModification(mod, (yyloc), true); } break; case 162: /* Line 670 of lalr1.cc */ #line 1156 "../../src-common/cfdg.ypp" { mod_ptr mod((yysemantic_stack_[(3) - (2)].mod)); (yysemantic_stack_[(3) - (2)].mod) = 0; (yyval.mod) = driver.MakeModification(mod, (yyloc), false); } break; case 163: /* Line 670 of lalr1.cc */ #line 1163 "../../src-common/cfdg.ypp" { mod_ptr mod((yysemantic_stack_[(3) - (2)].mod)); (yysemantic_stack_[(3) - (2)].mod) = 0; (yyval.mod) = driver.MakeModification(mod, (yyloc), true); } break; case 164: /* Line 670 of lalr1.cc */ #line 1168 "../../src-common/cfdg.ypp" { mod_ptr mod((yysemantic_stack_[(5) - (3)].mod)); (yysemantic_stack_[(5) - (3)].mod) = 0; (yyval.mod) = driver.MakeModification(mod, (yyloc), false); } break; case 165: /* Line 670 of lalr1.cc */ #line 1175 "../../src-common/cfdg.ypp" { term_ptr mod((yysemantic_stack_[(2) - (2)].term)); (yysemantic_stack_[(2) - (2)].term) = 0; driver.MakeModTerm((yysemantic_stack_[(2) - (1)].mod)->modExp, mod); (yyval.mod) = (yysemantic_stack_[(2) - (1)].mod); } break; case 166: /* Line 670 of lalr1.cc */ #line 1180 "../../src-common/cfdg.ypp" { static const yy::location def; ASTmodification* m = new ASTmodification(def); m->flags = 0; (yyval.mod) = m; } break; case 167: /* Line 670 of lalr1.cc */ #line 1189 "../../src-common/cfdg.ypp" { exp_ptr mod((yysemantic_stack_[(2) - (2)].expression)); (yysemantic_stack_[(2) - (2)].expression) = 0; (yyval.term) = new ASTmodTerm((ASTmodTerm::modTypeEnum)((yysemantic_stack_[(2) - (1)].modToken)), mod.release(), (yyloc)); } break; case 168: /* Line 670 of lalr1.cc */ #line 1194 "../../src-common/cfdg.ypp" { exp_ptr mod((yysemantic_stack_[(3) - (2)].expression)); (yysemantic_stack_[(3) - (2)].expression) = 0; if ((yysemantic_stack_[(3) - (1)].modToken) < ASTmodTerm::hue || (yysemantic_stack_[(3) - (1)].modToken) > ASTmodTerm::alpha) { error((yyloc), "The target operator can only be applied to color adjustments"); (yyval.term) = 0; } else { (yyval.term) = new ASTmodTerm((ASTmodTerm::modTypeEnum)((yysemantic_stack_[(3) - (1)].modToken) + 4), mod.release(), (yyloc)); } } break; case 169: /* Line 670 of lalr1.cc */ #line 1204 "../../src-common/cfdg.ypp" { str_ptr p((yysemantic_stack_[(2) - (2)].string)); (yysemantic_stack_[(2) - (2)].string) = 0; (yyval.term) = new ASTmodTerm(ASTmodTerm::param, *p, (yyloc)); } break; case 170: /* Line 670 of lalr1.cc */ #line 1209 "../../src-common/cfdg.ypp" { str_ptr p((yysemantic_stack_[(2) - (2)].string)); (yysemantic_stack_[(2) - (2)].string) = 0; (yyval.term) = new ASTmodTerm(ASTmodTerm::param, *p, (yyloc)); } break; case 171: /* Line 670 of lalr1.cc */ #line 1216 "../../src-common/cfdg.ypp" { ASTrepContainer* tempHolder = new ASTrepContainer(); driver.push_repContainer(*tempHolder); (yyval.bodyObj) = tempHolder; } break; case 172: /* Line 670 of lalr1.cc */ #line 1224 "../../src-common/cfdg.ypp" { (yyval.expression) = (yysemantic_stack_[(5) - (4)].expression); } break; case 175: /* Line 670 of lalr1.cc */ #line 1236 "../../src-common/cfdg.ypp" { str_ptr var((yysemantic_stack_[(3) - (1)].string)); (yysemantic_stack_[(3) - (1)].string) = 0; exp_ptr exp((yysemantic_stack_[(3) - (3)].expression)); (yysemantic_stack_[(3) - (3)].expression) = 0; driver.NextParameter(*var, exp, (yylocation_stack_[(3) - (1)]), (yylocation_stack_[(3) - (3)])); } break; case 176: /* Line 670 of lalr1.cc */ #line 1242 "../../src-common/cfdg.ypp" { exp_ptr exp((yysemantic_stack_[(3) - (3)].expression)); (yysemantic_stack_[(3) - (3)].expression) = 0; error((yylocation_stack_[(3) - (1)]), "Reserved keyword: adjustment"); } break; case 177: /* Line 670 of lalr1.cc */ #line 1249 "../../src-common/cfdg.ypp" { (yyval.expression) = ASTexpression::Append((yysemantic_stack_[(2) - (1)].expression), (yysemantic_stack_[(2) - (2)].expression)); } break; case 178: /* Line 670 of lalr1.cc */ #line 1253 "../../src-common/cfdg.ypp" { (yyval.expression) = (yysemantic_stack_[(1) - (1)].expression); } break; case 179: /* Line 670 of lalr1.cc */ #line 1260 "../../src-common/cfdg.ypp" { (yyval.expression) = (yysemantic_stack_[(3) - (1)].expression)->append(new ASTparen((yysemantic_stack_[(3) - (3)].expression))); } break; case 180: /* Line 670 of lalr1.cc */ #line 1264 "../../src-common/cfdg.ypp" { (yyval.expression) = new ASTcons(new ASTparen((yysemantic_stack_[(1) - (1)].expression)), 0); } break; case 181: /* Line 670 of lalr1.cc */ #line 1270 "../../src-common/cfdg.ypp" { (yyval.expression) = new ASTreal(*(yysemantic_stack_[(1) - (1)].string), (yyloc)); delete (yysemantic_stack_[(1) - (1)].string); } break; case 182: /* Line 670 of lalr1.cc */ #line 1272 "../../src-common/cfdg.ypp" { (yyval.expression) = new ASTreal(Renderer::Infinity, (yyloc)); } break; case 183: /* Line 670 of lalr1.cc */ #line 1274 "../../src-common/cfdg.ypp" { (yyval.expression) = new ASTparen((yysemantic_stack_[(3) - (2)].expression)); } break; case 184: /* Line 670 of lalr1.cc */ #line 1276 "../../src-common/cfdg.ypp" { (yyval.expression) = (yysemantic_stack_[(1) - (1)].expression); } break; case 185: /* Line 670 of lalr1.cc */ #line 1278 "../../src-common/cfdg.ypp" { (yyval.expression) = new ASToperator('N', (yysemantic_stack_[(2) - (2)].expression), NULL);; } break; case 186: /* Line 670 of lalr1.cc */ #line 1280 "../../src-common/cfdg.ypp" { (yyval.expression) = new ASToperator('P', (yysemantic_stack_[(2) - (2)].expression), NULL);; } break; case 187: /* Line 670 of lalr1.cc */ #line 1282 "../../src-common/cfdg.ypp" { exp_ptr pair((yysemantic_stack_[(3) - (1)].expression)->append((yysemantic_stack_[(3) - (3)].expression))); (yysemantic_stack_[(3) - (1)].expression) = 0; (yysemantic_stack_[(3) - (3)].expression) = 0; (yyval.expression) = new ASTfunction("rand", pair, driver.mSeed, (yylocation_stack_[(3) - (1)]), (yyloc)); } break; case 188: /* Line 670 of lalr1.cc */ #line 1287 "../../src-common/cfdg.ypp" { exp_ptr pair((yysemantic_stack_[(3) - (1)].expression)->append((yysemantic_stack_[(3) - (3)].expression))); (yysemantic_stack_[(3) - (1)].expression) = 0; (yysemantic_stack_[(3) - (3)].expression) = 0; (yyval.expression) = new ASTfunction("rand+/-", pair, driver.mSeed, (yylocation_stack_[(3) - (1)]), (yyloc)); } break; case 189: /* Line 670 of lalr1.cc */ #line 1294 "../../src-common/cfdg.ypp" { (yyval.expression) = new ASTreal(*(yysemantic_stack_[(1) - (1)].string), (yyloc)); delete (yysemantic_stack_[(1) - (1)].string); } break; case 190: /* Line 670 of lalr1.cc */ #line 1296 "../../src-common/cfdg.ypp" { (yyval.expression) = new ASTreal(Renderer::Infinity, (yyloc)); } break; case 191: /* Line 670 of lalr1.cc */ #line 1298 "../../src-common/cfdg.ypp" { (yyval.expression) = (yysemantic_stack_[(1) - (1)].expression); } break; case 192: /* Line 670 of lalr1.cc */ #line 1300 "../../src-common/cfdg.ypp" { exp_ptr pair((yysemantic_stack_[(3) - (1)].expression)->append((yysemantic_stack_[(3) - (3)].expression))); (yysemantic_stack_[(3) - (1)].expression) = 0; (yysemantic_stack_[(3) - (3)].expression) = 0; (yyval.expression) = new ASTfunction("rand", pair, driver.mSeed, (yylocation_stack_[(3) - (1)]), (yyloc)); } break; case 193: /* Line 670 of lalr1.cc */ #line 1305 "../../src-common/cfdg.ypp" { exp_ptr pair((yysemantic_stack_[(3) - (1)].expression)->append((yysemantic_stack_[(3) - (3)].expression))); (yysemantic_stack_[(3) - (1)].expression) = 0; (yysemantic_stack_[(3) - (3)].expression) = 0; (yyval.expression) = new ASTfunction("rand+/-", pair, driver.mSeed, (yylocation_stack_[(3) - (1)]), (yyloc)); } break; case 194: /* Line 670 of lalr1.cc */ #line 1310 "../../src-common/cfdg.ypp" { (yyval.expression) = (yysemantic_stack_[(3) - (1)].expression)->append((yysemantic_stack_[(3) - (3)].expression)); } break; case 195: /* Line 670 of lalr1.cc */ #line 1312 "../../src-common/cfdg.ypp" { (yyval.expression) = new ASToperator('+', (yysemantic_stack_[(3) - (1)].expression), (yysemantic_stack_[(3) - (3)].expression)); } break; case 196: /* Line 670 of lalr1.cc */ #line 1314 "../../src-common/cfdg.ypp" { (yyval.expression) = new ASToperator('-', (yysemantic_stack_[(3) - (1)].expression), (yysemantic_stack_[(3) - (3)].expression)); } break; case 197: /* Line 670 of lalr1.cc */ #line 1316 "../../src-common/cfdg.ypp" { (yyval.expression) = new ASToperator('_', (yysemantic_stack_[(3) - (1)].expression), (yysemantic_stack_[(3) - (3)].expression)); } break; case 198: /* Line 670 of lalr1.cc */ #line 1318 "../../src-common/cfdg.ypp" { (yyval.expression) = new ASToperator('*', (yysemantic_stack_[(3) - (1)].expression), (yysemantic_stack_[(3) - (3)].expression)); } break; case 199: /* Line 670 of lalr1.cc */ #line 1320 "../../src-common/cfdg.ypp" { (yyval.expression) = new ASToperator('/', (yysemantic_stack_[(3) - (1)].expression), (yysemantic_stack_[(3) - (3)].expression)); } break; case 200: /* Line 670 of lalr1.cc */ #line 1322 "../../src-common/cfdg.ypp" { (yyval.expression) = new ASToperator('N', (yysemantic_stack_[(2) - (2)].expression), NULL); } break; case 201: /* Line 670 of lalr1.cc */ #line 1324 "../../src-common/cfdg.ypp" { (yyval.expression) = new ASToperator('P', (yysemantic_stack_[(2) - (2)].expression), NULL); } break; case 202: /* Line 670 of lalr1.cc */ #line 1326 "../../src-common/cfdg.ypp" { (yyval.expression) = new ASToperator('!', (yysemantic_stack_[(2) - (2)].expression), NULL); } break; case 203: /* Line 670 of lalr1.cc */ #line 1328 "../../src-common/cfdg.ypp" { (yyval.expression) = new ASToperator('^', (yysemantic_stack_[(3) - (1)].expression), (yysemantic_stack_[(3) - (3)].expression)); } break; case 204: /* Line 670 of lalr1.cc */ #line 1330 "../../src-common/cfdg.ypp" { (yyval.expression) = new ASToperator('<', (yysemantic_stack_[(3) - (1)].expression), (yysemantic_stack_[(3) - (3)].expression)); } break; case 205: /* Line 670 of lalr1.cc */ #line 1332 "../../src-common/cfdg.ypp" { (yyval.expression) = new ASToperator('L', (yysemantic_stack_[(3) - (1)].expression), (yysemantic_stack_[(3) - (3)].expression)); } break; case 206: /* Line 670 of lalr1.cc */ #line 1334 "../../src-common/cfdg.ypp" { (yyval.expression) = new ASToperator('>', (yysemantic_stack_[(3) - (1)].expression), (yysemantic_stack_[(3) - (3)].expression)); } break; case 207: /* Line 670 of lalr1.cc */ #line 1336 "../../src-common/cfdg.ypp" { (yyval.expression) = new ASToperator('G', (yysemantic_stack_[(3) - (1)].expression), (yysemantic_stack_[(3) - (3)].expression)); } break; case 208: /* Line 670 of lalr1.cc */ #line 1338 "../../src-common/cfdg.ypp" { (yyval.expression) = new ASToperator('=', (yysemantic_stack_[(3) - (1)].expression), (yysemantic_stack_[(3) - (3)].expression)); } break; case 209: /* Line 670 of lalr1.cc */ #line 1340 "../../src-common/cfdg.ypp" { (yyval.expression) = new ASToperator('n', (yysemantic_stack_[(3) - (1)].expression), (yysemantic_stack_[(3) - (3)].expression)); } break; case 210: /* Line 670 of lalr1.cc */ #line 1342 "../../src-common/cfdg.ypp" { (yyval.expression) = new ASToperator('&', (yysemantic_stack_[(3) - (1)].expression), (yysemantic_stack_[(3) - (3)].expression)); } break; case 211: /* Line 670 of lalr1.cc */ #line 1344 "../../src-common/cfdg.ypp" { (yyval.expression) = new ASToperator('|', (yysemantic_stack_[(3) - (1)].expression), (yysemantic_stack_[(3) - (3)].expression)); } break; case 212: /* Line 670 of lalr1.cc */ #line 1346 "../../src-common/cfdg.ypp" { (yyval.expression) = new ASToperator('X', (yysemantic_stack_[(3) - (1)].expression), (yysemantic_stack_[(3) - (3)].expression)); } break; case 213: /* Line 670 of lalr1.cc */ #line 1348 "../../src-common/cfdg.ypp" { (yyval.expression) = new ASTparen((yysemantic_stack_[(3) - (2)].expression)); } break; case 214: /* Line 670 of lalr1.cc */ #line 1350 "../../src-common/cfdg.ypp" { (yyval.expression) = (yysemantic_stack_[(1) - (1)].mod); } break; case 215: /* Line 670 of lalr1.cc */ #line 1354 "../../src-common/cfdg.ypp" { (yyval.expression) = new ASTreal(*(yysemantic_stack_[(1) - (1)].string), (yyloc)); delete (yysemantic_stack_[(1) - (1)].string); } break; case 216: /* Line 670 of lalr1.cc */ #line 1356 "../../src-common/cfdg.ypp" { (yyval.expression) = new ASTreal(Renderer::Infinity, (yyloc)); } break; case 217: /* Line 670 of lalr1.cc */ #line 1358 "../../src-common/cfdg.ypp" { (yyval.expression) = (yysemantic_stack_[(1) - (1)].expression); } break; case 218: /* Line 670 of lalr1.cc */ #line 1360 "../../src-common/cfdg.ypp" { exp_ptr pair((yysemantic_stack_[(3) - (1)].expression)->append((yysemantic_stack_[(3) - (3)].expression))); (yysemantic_stack_[(3) - (1)].expression) = 0; (yysemantic_stack_[(3) - (3)].expression) = 0; (yyval.expression) = new ASTfunction("rand", pair, driver.mSeed, (yylocation_stack_[(3) - (1)]), (yyloc)); } break; case 219: /* Line 670 of lalr1.cc */ #line 1365 "../../src-common/cfdg.ypp" { exp_ptr pair((yysemantic_stack_[(3) - (1)].expression)->append((yysemantic_stack_[(3) - (3)].expression))); (yysemantic_stack_[(3) - (1)].expression) = 0; (yysemantic_stack_[(3) - (3)].expression) = 0; (yyval.expression) = new ASTfunction("rand+/-", pair, driver.mSeed, (yylocation_stack_[(3) - (1)]), (yyloc)); } break; case 220: /* Line 670 of lalr1.cc */ #line 1370 "../../src-common/cfdg.ypp" { (yyval.expression) = new ASToperator('+', (yysemantic_stack_[(3) - (1)].expression), (yysemantic_stack_[(3) - (3)].expression)); } break; case 221: /* Line 670 of lalr1.cc */ #line 1372 "../../src-common/cfdg.ypp" { (yyval.expression) = new ASToperator('-', (yysemantic_stack_[(3) - (1)].expression), (yysemantic_stack_[(3) - (3)].expression)); } break; case 222: /* Line 670 of lalr1.cc */ #line 1374 "../../src-common/cfdg.ypp" { (yyval.expression) = new ASToperator('_', (yysemantic_stack_[(3) - (1)].expression), (yysemantic_stack_[(3) - (3)].expression)); } break; case 223: /* Line 670 of lalr1.cc */ #line 1376 "../../src-common/cfdg.ypp" { (yyval.expression) = new ASToperator('*', (yysemantic_stack_[(3) - (1)].expression), (yysemantic_stack_[(3) - (3)].expression)); } break; case 224: /* Line 670 of lalr1.cc */ #line 1378 "../../src-common/cfdg.ypp" { (yyval.expression) = new ASToperator('/', (yysemantic_stack_[(3) - (1)].expression), (yysemantic_stack_[(3) - (3)].expression)); } break; case 225: /* Line 670 of lalr1.cc */ #line 1380 "../../src-common/cfdg.ypp" { (yyval.expression) = new ASToperator('N', (yysemantic_stack_[(2) - (2)].expression), NULL); } break; case 226: /* Line 670 of lalr1.cc */ #line 1382 "../../src-common/cfdg.ypp" { (yyval.expression) = new ASToperator('P', (yysemantic_stack_[(2) - (2)].expression), NULL); } break; case 227: /* Line 670 of lalr1.cc */ #line 1384 "../../src-common/cfdg.ypp" { (yyval.expression) = new ASToperator('!', (yysemantic_stack_[(2) - (2)].expression), NULL); } break; case 228: /* Line 670 of lalr1.cc */ #line 1386 "../../src-common/cfdg.ypp" { (yyval.expression) = new ASToperator('^', (yysemantic_stack_[(3) - (1)].expression), (yysemantic_stack_[(3) - (3)].expression)); } break; case 229: /* Line 670 of lalr1.cc */ #line 1388 "../../src-common/cfdg.ypp" { (yyval.expression) = new ASToperator('<', (yysemantic_stack_[(3) - (1)].expression), (yysemantic_stack_[(3) - (3)].expression)); } break; case 230: /* Line 670 of lalr1.cc */ #line 1390 "../../src-common/cfdg.ypp" { (yyval.expression) = new ASToperator('L', (yysemantic_stack_[(3) - (1)].expression), (yysemantic_stack_[(3) - (3)].expression)); } break; case 231: /* Line 670 of lalr1.cc */ #line 1392 "../../src-common/cfdg.ypp" { (yyval.expression) = new ASToperator('>', (yysemantic_stack_[(3) - (1)].expression), (yysemantic_stack_[(3) - (3)].expression)); } break; case 232: /* Line 670 of lalr1.cc */ #line 1394 "../../src-common/cfdg.ypp" { (yyval.expression) = new ASToperator('G', (yysemantic_stack_[(3) - (1)].expression), (yysemantic_stack_[(3) - (3)].expression)); } break; case 233: /* Line 670 of lalr1.cc */ #line 1396 "../../src-common/cfdg.ypp" { (yyval.expression) = new ASToperator('=', (yysemantic_stack_[(3) - (1)].expression), (yysemantic_stack_[(3) - (3)].expression)); } break; case 234: /* Line 670 of lalr1.cc */ #line 1398 "../../src-common/cfdg.ypp" { (yyval.expression) = new ASToperator('n', (yysemantic_stack_[(3) - (1)].expression), (yysemantic_stack_[(3) - (3)].expression)); } break; case 235: /* Line 670 of lalr1.cc */ #line 1400 "../../src-common/cfdg.ypp" { (yyval.expression) = new ASToperator('&', (yysemantic_stack_[(3) - (1)].expression), (yysemantic_stack_[(3) - (3)].expression)); } break; case 236: /* Line 670 of lalr1.cc */ #line 1402 "../../src-common/cfdg.ypp" { (yyval.expression) = new ASToperator('|', (yysemantic_stack_[(3) - (1)].expression), (yysemantic_stack_[(3) - (3)].expression)); } break; case 237: /* Line 670 of lalr1.cc */ #line 1404 "../../src-common/cfdg.ypp" { (yyval.expression) = new ASToperator('X', (yysemantic_stack_[(3) - (1)].expression), (yysemantic_stack_[(3) - (3)].expression)); } break; case 238: /* Line 670 of lalr1.cc */ #line 1406 "../../src-common/cfdg.ypp" { (yyval.expression) = new ASTparen((yysemantic_stack_[(3) - (2)].expression)); } break; case 239: /* Line 670 of lalr1.cc */ #line 1408 "../../src-common/cfdg.ypp" { (yyval.expression) = (yysemantic_stack_[(1) - (1)].mod); } break; case 240: /* Line 670 of lalr1.cc */ #line 1412 "../../src-common/cfdg.ypp" { str_ptr func((yysemantic_stack_[(3) - (1)].string)); (yysemantic_stack_[(3) - (1)].string) = 0; (yyval.expression) = driver.MakeFunction(func, exp_ptr(), (yylocation_stack_[(3) - (1)]), (yylocation_stack_[(3) - (2)]) + (yylocation_stack_[(3) - (3)]), false); } break; case 241: /* Line 670 of lalr1.cc */ #line 1417 "../../src-common/cfdg.ypp" { str_ptr func((yysemantic_stack_[(4) - (1)].string)); (yysemantic_stack_[(4) - (1)].string) = 0; exp_ptr args((yysemantic_stack_[(4) - (3)].expression)); (yysemantic_stack_[(4) - (3)].expression) = 0; (yyval.expression) = driver.MakeFunction(func, args, (yylocation_stack_[(4) - (1)]), (yylocation_stack_[(4) - (3)]), true); } break; case 242: /* Line 670 of lalr1.cc */ #line 1423 "../../src-common/cfdg.ypp" { str_ptr func((yysemantic_stack_[(4) - (1)].string)); (yysemantic_stack_[(4) - (1)].string) = 0; exp_ptr args((yysemantic_stack_[(4) - (3)].expression)); (yysemantic_stack_[(4) - (3)].expression) = 0; (yyval.expression) = driver.MakeArray(func, args, (yylocation_stack_[(4) - (1)]), (yylocation_stack_[(4) - (3)])); } break; case 243: /* Line 670 of lalr1.cc */ #line 1429 "../../src-common/cfdg.ypp" { str_ptr func(new std::string("if")); exp_ptr args((yysemantic_stack_[(4) - (3)].expression)); (yysemantic_stack_[(4) - (3)].expression) = 0; (yyval.expression) = driver.MakeFunction(func, args, (yylocation_stack_[(4) - (1)]), (yylocation_stack_[(4) - (3)]), false); } break; case 244: /* Line 670 of lalr1.cc */ #line 1435 "../../src-common/cfdg.ypp" { exp_ptr exp((yysemantic_stack_[(2) - (2)].expression)); (yysemantic_stack_[(2) - (2)].expression) = 0; std::auto_ptr vars((yysemantic_stack_[(2) - (1)].bodyObj)); (yyval.expression) = driver.MakeLet((yylocation_stack_[(2) - (1)]), exp); } break; case 245: /* Line 670 of lalr1.cc */ #line 1441 "../../src-common/cfdg.ypp" { str_ptr var((yysemantic_stack_[(1) - (1)].string)); (yysemantic_stack_[(1) - (1)].string) = 0; (yyval.expression) = driver.MakeVariable(*var, (yylocation_stack_[(1) - (1)])); } break; case 246: /* Line 670 of lalr1.cc */ #line 1448 "../../src-common/cfdg.ypp" { str_ptr func((yysemantic_stack_[(3) - (1)].string)); (yysemantic_stack_[(3) - (1)].string) = 0; (yyval.expression) = driver.MakeFunction(func, exp_ptr(), (yylocation_stack_[(3) - (1)]), (yylocation_stack_[(3) - (2)]) + (yylocation_stack_[(3) - (3)]), false); } break; case 247: /* Line 670 of lalr1.cc */ #line 1453 "../../src-common/cfdg.ypp" { str_ptr func((yysemantic_stack_[(4) - (1)].string)); (yysemantic_stack_[(4) - (1)].string) = 0; exp_ptr args((yysemantic_stack_[(4) - (3)].expression)); (yysemantic_stack_[(4) - (3)].expression) = 0; (yyval.expression) = driver.MakeFunction(func, args, (yylocation_stack_[(4) - (1)]), (yylocation_stack_[(4) - (3)]), false); } break; case 248: /* Line 670 of lalr1.cc */ #line 1459 "../../src-common/cfdg.ypp" { str_ptr func((yysemantic_stack_[(4) - (1)].string)); (yysemantic_stack_[(4) - (1)].string) = 0; exp_ptr args((yysemantic_stack_[(4) - (3)].expression)); (yysemantic_stack_[(4) - (3)].expression) = 0; (yyval.expression) = driver.MakeArray(func, args, (yylocation_stack_[(4) - (1)]), (yylocation_stack_[(4) - (3)])); } break; case 249: /* Line 670 of lalr1.cc */ #line 1465 "../../src-common/cfdg.ypp" { str_ptr func(new std::string("if")); exp_ptr args((yysemantic_stack_[(4) - (3)].expression)); (yysemantic_stack_[(4) - (3)].expression) = 0; (yyval.expression) = driver.MakeFunction(func, args, (yylocation_stack_[(4) - (1)]), (yylocation_stack_[(4) - (3)]), false); } break; case 250: /* Line 670 of lalr1.cc */ #line 1471 "../../src-common/cfdg.ypp" { str_ptr func((yysemantic_stack_[(4) - (1)].string)); (yysemantic_stack_[(4) - (1)].string) = 0; exp_ptr args(new ASTexpression((yylocation_stack_[(4) - (1)]) + (yylocation_stack_[(4) - (4)]))); (yyval.expression) = driver.MakeFunction(func, args, (yylocation_stack_[(4) - (1)]), (yylocation_stack_[(4) - (3)]), false); } break; case 251: /* Line 670 of lalr1.cc */ #line 1477 "../../src-common/cfdg.ypp" { exp_ptr exp((yysemantic_stack_[(2) - (2)].expression)); (yysemantic_stack_[(2) - (2)].expression) = 0; std::auto_ptr vars((yysemantic_stack_[(2) - (1)].bodyObj)); (yyval.expression) = driver.MakeLet((yylocation_stack_[(2) - (1)]), exp); } break; case 252: /* Line 670 of lalr1.cc */ #line 1483 "../../src-common/cfdg.ypp" { str_ptr var((yysemantic_stack_[(1) - (1)].string)); (yysemantic_stack_[(1) - (1)].string) = 0; (yyval.expression) = driver.MakeVariable(*var, (yylocation_stack_[(1) - (1)])); } break; case 253: /* Line 670 of lalr1.cc */ #line 1490 "../../src-common/cfdg.ypp" { (yyval.string) = (yysemantic_stack_[(1) - (1)].string); } break; case 254: /* Line 670 of lalr1.cc */ #line 1492 "../../src-common/cfdg.ypp" { (yyval.string) = (yysemantic_stack_[(1) - (1)].string); } break; /* Line 670 of lalr1.cc */ #line 2840 "cfdg.tab.cpp" default: break; } /* User semantic actions sometimes alter yychar, and that requires that yytoken be updated with the new translation. We take the approach of translating immediately before every use of yytoken. One alternative is translating here after every semantic action, but that translation would be missed if the semantic action invokes YYABORT, YYACCEPT, or YYERROR immediately after altering yychar. In the case of YYABORT or YYACCEPT, an incorrect destructor might then be invoked immediately. In the case of YYERROR, subsequent parser actions might lead to an incorrect destructor call or verbose syntax error message before the lookahead is translated. */ YY_SYMBOL_PRINT ("-> $$ =", yyr1_[yyn], &yyval, &yyloc); yypop_ (yylen); yylen = 0; YY_STACK_PRINT (); yysemantic_stack_.push (yyval); yylocation_stack_.push (yyloc); /* Shift the result of the reduction. */ yyn = yyr1_[yyn]; yystate = yypgoto_[yyn - yyntokens_] + yystate_stack_[0]; if (0 <= yystate && yystate <= yylast_ && yycheck_[yystate] == yystate_stack_[0]) yystate = yytable_[yystate]; else yystate = yydefgoto_[yyn - yyntokens_]; goto yynewstate; /*------------------------------------. | yyerrlab -- here on detecting error | `------------------------------------*/ yyerrlab: /* Make sure we have latest lookahead translation. See comments at user semantic actions for why this is necessary. */ yytoken = yytranslate_ (yychar); /* If not already recovering from an error, report this error. */ if (!yyerrstatus_) { ++yynerrs_; if (yychar == yyempty_) yytoken = yyempty_; error (yylloc, yysyntax_error_ (yystate, yytoken)); } yyerror_range[1] = yylloc; if (yyerrstatus_ == 3) { /* If just tried and failed to reuse lookahead token after an error, discard it. */ if (yychar <= yyeof_) { /* Return failure if at end of input. */ if (yychar == yyeof_) YYABORT; } else { yydestruct_ ("Error: discarding", yytoken, &yylval, &yylloc); yychar = yyempty_; } } /* Else will try to reuse lookahead token after shifting the error token. */ goto yyerrlab1; /*---------------------------------------------------. | yyerrorlab -- error raised explicitly by YYERROR. | `---------------------------------------------------*/ yyerrorlab: /* Pacify compilers like GCC when the user code never invokes YYERROR and the label yyerrorlab therefore never appears in user code. */ if (false) goto yyerrorlab; yyerror_range[1] = yylocation_stack_[yylen - 1]; /* Do not reclaim the symbols of the rule which action triggered this YYERROR. */ yypop_ (yylen); yylen = 0; yystate = yystate_stack_[0]; goto yyerrlab1; /*-------------------------------------------------------------. | yyerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ yyerrlab1: yyerrstatus_ = 3; /* Each real token shifted decrements this. */ for (;;) { yyn = yypact_[yystate]; if (!yy_pact_value_is_default_ (yyn)) { yyn += yyterror_; if (0 <= yyn && yyn <= yylast_ && yycheck_[yyn] == yyterror_) { yyn = yytable_[yyn]; if (0 < yyn) break; } } /* Pop the current state because it cannot handle the error token. */ if (yystate_stack_.height () == 1) YYABORT; yyerror_range[1] = yylocation_stack_[0]; yydestruct_ ("Error: popping", yystos_[yystate], &yysemantic_stack_[0], &yylocation_stack_[0]); yypop_ (); yystate = yystate_stack_[0]; YY_STACK_PRINT (); } yyerror_range[2] = yylloc; // Using YYLLOC is tempting, but would change the location of // the lookahead. YYLOC is available though. YYLLOC_DEFAULT (yyloc, yyerror_range, 2); yysemantic_stack_.push (yylval); yylocation_stack_.push (yyloc); /* Shift the error token. */ YY_SYMBOL_PRINT ("Shifting", yystos_[yyn], &yysemantic_stack_[0], &yylocation_stack_[0]); yystate = yyn; goto yynewstate; /* Accept. */ yyacceptlab: yyresult = 0; goto yyreturn; /* Abort. */ yyabortlab: yyresult = 1; goto yyreturn; yyreturn: if (yychar != yyempty_) { /* Make sure we have latest lookahead translation. See comments at user semantic actions for why this is necessary. */ yytoken = yytranslate_ (yychar); yydestruct_ ("Cleanup: discarding lookahead", yytoken, &yylval, &yylloc); } /* Do not reclaim the symbols of the rule which action triggered this YYABORT or YYACCEPT. */ yypop_ (yylen); while (1 < yystate_stack_.height ()) { yydestruct_ ("Cleanup: popping", yystos_[yystate_stack_[0]], &yysemantic_stack_[0], &yylocation_stack_[0]); yypop_ (); } return yyresult; } catch (...) { YYCDEBUG << "Exception caught: cleaning lookahead and stack" << std::endl; // Do not try to display the values of the reclaimed symbols, // as their printer might throw an exception. if (yychar != yyempty_) { /* Make sure we have latest lookahead translation. See comments at user semantic actions for why this is necessary. */ yytoken = yytranslate_ (yychar); yydestruct_ (YY_NULL, yytoken, &yylval, &yylloc); } while (1 < yystate_stack_.height ()) { yydestruct_ (YY_NULL, yystos_[yystate_stack_[0]], &yysemantic_stack_[0], &yylocation_stack_[0]); yypop_ (); } throw; } } // Generate an error message. std::string CfdgParser::yysyntax_error_ (int, int) { return YY_("syntax error"); } /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ const short int CfdgParser::yypact_ninf_ = -257; const short int CfdgParser::yypact_[] = { 328, -257, -257, 26, 1276, 1297, -257, 6, -257, 45, 79, 3, 123, 118, -257, 42, 318, -257, 118, -257, -257, -257, -257, -257, -257, -257, -257, 87, -257, 120, -257, 187, 17, 168, 181, -1, 118, 97, 318, 166, 118, -257, -257, -257, -257, -257, -257, 617, 172, -257, -257, -257, 178, 182, -257, -257, 314, 237, 270, 242, -257, -257, -257, -257, -257, -257, -257, 244, -257, -257, -257, -257, -257, -257, -257, 246, 250, 261, 266, -257, 272, -257, 27, 331, -257, -257, -257, 272, 261, 333, -257, 311, 318, -257, 296, -257, 320, -257, 302, 617, -257, 617, 617, 617, 325, -257, 330, 1032, -257, -257, 167, -257, -257, -257, -257, -257, -257, -257, 111, 274, -257, 161, 368, 406, 250, -257, 376, 27, -257, 388, 9, -257, 84, -257, 131, -257, -257, -32, -257, 390, 392, -257, -257, -257, 617, 435, 617, 346, 346, 346, 753, -257, 201, 164, -257, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 214, 575, 347, 348, 617, 541, 4, 354, -257, -11, -257, 617, -257, -257, -257, -257, 397, 250, 484, 484, 484, 351, 330, 246, 303, 327, 186, 116, -257, -257, -257, -257, 361, -257, -257, -257, 8, 118, -257, -257, -257, -257, 405, 44, 64, -257, -257, -257, -257, 180, 118, 357, -257, 638, -257, 638, 638, 617, -257, -257, -25, 1063, -257, -257, -257, 77, -257, 80, -257, -257, -257, -257, 9, -257, -257, -257, 784, 358, -257, 156, 660, -257, 286, -257, 407, 412, 356, -257, 389, 389, 669, 669, 669, 669, 1217, 1217, 1177, 1133, 1087, 1032, 67, 67, 67, 346, 346, 346, 246, 415, 86, 1032, 617, 617, 1032, -257, 1032, -257, -257, -257, 478, -257, 1032, -257, 484, -257, 413, -257, -257, -257, -257, 250, 250, -257, -257, 370, 371, -257, 372, -257, 186, 186, 617, 330, 186, 283, -257, -257, -257, -257, -257, -257, -257, -257, -257, -257, -257, -257, -257, 365, -257, -257, -257, -257, -257, 378, 378, 378, 815, 638, -257, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 423, -257, -257, -257, -257, -257, -257, 373, 617, 617, 596, 250, 617, 617, 846, 877, -257, 908, 484, -257, 349, -257, 83, -257, -257, 617, 512, 617, -257, -257, 939, -257, 367, 186, 186, -257, 118, 297, 307, 382, -257, 1063, 420, 420, 730, 730, 730, 730, 1237, 1237, 1197, 1155, 1110, 317, 317, 317, 378, 378, 378, -257, 1032, 1032, 94, -257, 970, -257, 1032, 1032, 250, -257, -257, -257, -257, 383, 617, -257, -257, 484, 1001, -257, 175, 691, -257, -257, -257, -257, -257, -257, -257, -257, -257, -257, 722, -257, -257, -257, -257, -257 }; /* YYDEFACT[S] -- default reduction number in state S. Performed when YYTABLE doesn't specify something else to do. Zero means the default is an error. */ const unsigned char CfdgParser::yydefact_[] = { 0, 5, 7, 0, 2, 3, 1, 0, 32, 0, 0, 0, 0, 0, 44, 0, 0, 31, 0, 4, 25, 19, 20, 17, 18, 21, 22, 0, 23, 0, 24, 0, 0, 74, 0, 0, 0, 0, 0, 48, 0, 6, 16, 9, 10, 8, 15, 0, 13, 98, 14, 41, 0, 0, 11, 12, 52, 0, 71, 79, 27, 166, 166, 55, 28, 53, 26, 0, 29, 45, 46, 42, 54, 143, 100, 96, 0, 0, 90, 75, 90, 64, 0, 0, 39, 37, 60, 90, 0, 0, 40, 0, 0, 38, 0, 171, 252, 189, 0, 0, 190, 0, 0, 0, 166, 214, 0, 56, 191, 69, 0, 98, 98, 34, 35, 36, 72, 33, 0, 0, 30, 0, 0, 0, 51, 50, 0, 0, 68, 0, 0, 76, 0, 86, 85, 92, 88, 0, 62, 0, 0, 58, 47, 43, 0, 0, 0, 202, 200, 201, 0, 166, 0, 0, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 253, 0, 254, 0, 70, 0, 117, 116, 97, 125, 118, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 162, 165, 161, 253, 0, 73, 147, 142, 0, 0, 134, 135, 138, 140, 139, 253, 0, 80, 129, 99, 131, 0, 0, 0, 215, 0, 216, 0, 0, 0, 95, 239, 0, 180, 217, 49, 61, 0, 57, 0, 84, 82, 83, 81, 0, 91, 63, 59, 0, 0, 246, 0, 0, 213, 0, 163, 0, 0, 0, 174, 192, 193, 205, 204, 207, 206, 208, 209, 210, 211, 212, 194, 196, 195, 197, 198, 199, 203, 96, 0, 252, 153, 0, 0, 157, 66, 156, 65, 127, 126, 0, 128, 67, 119, 0, 98, 121, 110, 122, 123, 114, 0, 0, 77, 78, 0, 245, 181, 0, 182, 0, 0, 0, 0, 167, 178, 184, 169, 170, 149, 143, 148, 145, 146, 137, 136, 133, 132, 166, 0, 100, 112, 130, 102, 94, 227, 225, 226, 0, 0, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 89, 87, 249, 250, 247, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, 0, 0, 141, 0, 155, 0, 107, 105, 0, 0, 0, 185, 186, 0, 244, 177, 0, 0, 168, 0, 0, 0, 0, 238, 179, 218, 219, 230, 229, 232, 231, 233, 234, 235, 236, 237, 221, 220, 222, 223, 224, 228, 164, 176, 175, 252, 173, 0, 108, 152, 151, 154, 158, 103, 120, 109, 0, 0, 124, 113, 0, 0, 240, 0, 0, 183, 187, 188, 150, 144, 101, 111, 172, 106, 160, 0, 115, 243, 241, 242, 159 }; /* YYPGOTO[NTERM-NUM]. */ const short int CfdgParser::yypgoto_[] = { -257, -257, -257, -257, -257, -257, -257, -257, -257, -257, 431, -26, -257, -257, -257, -257, -257, -257, -257, -257, -257, -257, -257, -257, -257, 444, -257, -257, -257, -257, -257, -257, -257, 206, 95, 122, 61, -186, -105, 121, 233, -257, -189, -257, -257, -257, -89, -257, -257, -257, -257, -257, 137, -257, 251, -257, -111, -257, -257, -257, -257, -257, -257, -257, -13, -75, -37, -257, -80, -187, -257, 90, -257, -143, -256, -83, -184, -257, -94, -81 }; /* YYDEFGOTO[NTERM-NUM]. */ const short int CfdgParser::yydefgoto_[] = { -1, 3, 4, 5, 41, 19, 20, 42, 21, 43, 22, 71, 92, 45, 23, 24, 25, 26, 46, 47, 184, 185, 48, 49, 50, 27, 28, 52, 53, 54, 55, 29, 30, 136, 137, 128, 83, 124, 110, 122, 219, 186, 297, 333, 381, 435, 298, 377, 188, 220, 221, 189, 121, 322, 207, 208, 209, 395, 190, 191, 192, 193, 194, 436, 63, 105, 118, 202, 106, 154, 259, 260, 315, 233, 316, 107, 234, 317, 108, 196 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which number is the opposite. If YYTABLE_NINF_, syntax error. */ const signed char CfdgParser::yytable_ninf_ = -92; const short int CfdgParser::yytable_[] = { 65, 125, 252, 299, 300, 72, 197, 198, 302, 81, 303, 222, 90, 60, 288, 132, 147, 245, 148, 149, 150, 187, 84, 85, 340, 119, 6, 93, 133, 235, 195, 246, 56, 132, 204, 134, 77, 57, 341, 181, 210, 223, 336, 78, 337, 338, 133, 291, 232, 236, 292, 235, 66, 134, 326, 387, 388, 82, 61, 391, 62, 249, 61, 253, 62, 289, 143, 152, 67, 321, 232, 58, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 135, 282, 279, 370, 285, 287, 372, 432, 89, 433, 68, 293, 327, 241, 368, 59, 378, 86, 187, 187, 242, 195, 195, 195, 255, 295, 87, 195, 195, 314, 170, 171, 328, 88, 172, 329, 245, 390, 210, 245, 199, 200, 235, 64, 235, 235, 442, 443, 126, 129, 359, 223, 318, 360, 145, 434, 319, 339, 73, 140, 243, 232, 145, 232, 232, 82, 400, 244, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 173, 201, 61, 174, 62, 175, 74, 176, 257, 177, 95, 178, 204, 430, 205, 258, 379, 181, 179, 58, 180, 79, 324, 181, 306, 373, 374, 131, 182, 95, 340, 204, 80, 376, 139, 334, 181, 307, 75, 308, 195, 330, 309, 76, 364, 199, 200, 238, 206, 340, 240, 91, 382, 383, 183, 389, 314, 314, 109, 310, 314, 311, 312, 454, 111, 204, 331, 439, 112, 313, 181, 235, 452, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 232, 256, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 419, 420, 423, 222, 425, 426, 187, 235, 397, 199, 200, 424, 115, 195, 116, 195, 117, 437, 120, 440, 123, 199, 200, 392, 393, 104, 232, 173, 314, 314, 174, 210, 175, 223, 176, 82, 177, 95, 178, 204, 127, 205, 199, 200, 181, 179, 130, 180, 1, 2, 181, 173, 203, 142, 174, 182, 175, 138, 176, 141, 177, 95, 178, 69, 70, 394, 451, 366, 449, 179, 144, 180, 195, 173, 181, 445, 174, 146, 175, 182, 176, 304, 177, 95, 178, 446, 356, 357, 113, 114, 358, 179, 211, 180, 145, 212, 181, 213, 444, 214, 151, 182, 237, 215, 153, 305, 211, 392, 393, 212, 216, 213, 205, 214, 239, 181, 247, 215, 248, 172, 217, 283, 284, 290, 216, 294, 205, 431, 301, 181, 320, 325, 224, 367, 217, 94, 335, 363, 368, 369, 95, 371, 329, 380, 384, 385, 218, 386, 96, -91, 225, 358, 44, 98, 418, 167, 168, 169, 170, 171, 447, 250, 172, 450, 94, 51, 226, 361, 398, 95, 227, 332, 228, 229, 396, 422, 323, 96, 0, 225, 230, 104, 98, 0, 0, 231, 353, 354, 355, 356, 357, 0, 0, 358, 0, 226, 0, 0, 0, 227, 0, 228, 229, 0, 0, 0, 0, 94, 173, 230, 104, 174, 95, 175, 251, 176, 0, 177, 95, 178, 96, 0, 97, 0, 0, 98, 179, 0, 180, 0, 0, 181, 0, 0, 0, 0, 182, 0, 99, 0, 0, 94, 100, 0, 101, 102, 95, 0, 0, 0, 0, 0, 103, 104, 96, 0, 225, 375, 0, 98, 0, 296, 0, 0, 0, 0, 0, 286, 0, 0, 94, 0, 226, 0, 0, 95, 227, 0, 228, 229, 0, 0, 0, 96, 0, 97, 230, 104, 98, 0, 0, 438, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 0, 0, 94, 100, 0, 101, 102, 95, 280, 0, 0, 0, 0, 103, 104, 281, 0, 97, 0, 0, 98, 0, 0, 94, 0, 0, 0, 0, 95, 257, 0, 0, 0, 99, 0, 0, 421, 100, 97, 101, 102, 98, 0, 0, 94, 0, 0, 103, 104, 95, 0, 0, 0, 0, 99, 0, 0, 96, 100, 97, 101, 102, 98, 0, 0, 94, 0, 0, 103, 104, 95, 0, 0, 0, 0, 99, 0, 0, 96, 100, 225, 101, 102, 98, 0, 0, 0, 0, 0, 103, 104, 0, 0, 0, 0, 0, 226, 0, 155, 156, 227, 0, 228, 229, 0, 0, 0, 155, 156, 0, 230, 104, 157, 158, 159, 160, 161, 162, 0, 163, 164, 165, 0, 166, 167, 168, 169, 170, 171, 155, 156, 172, 0, 167, 168, 169, 170, 171, 0, 365, 172, 0, 0, 157, 158, 159, 160, 161, 162, 0, 163, 164, 165, 0, 166, 167, 168, 169, 170, 171, 155, 156, 172, 0, 0, 0, 0, 0, 342, 343, 455, 0, 0, 0, 157, 158, 159, 160, 161, 162, 0, 163, 164, 165, 0, 166, 167, 168, 169, 170, 171, 155, 156, 172, 353, 354, 355, 356, 357, 0, 456, 358, 0, 0, 0, 157, 158, 159, 160, 161, 162, 0, 163, 164, 165, 0, 166, 167, 168, 169, 170, 171, 155, 156, 172, 0, 0, 0, 0, 0, 254, 0, 0, 0, 0, 0, 157, 158, 159, 160, 161, 162, 0, 163, 164, 165, 0, 166, 167, 168, 169, 170, 171, 155, 156, 172, 0, 0, 0, 0, 0, 362, 0, 0, 0, 0, 0, 157, 158, 159, 160, 161, 162, 0, 163, 164, 165, 0, 166, 167, 168, 169, 170, 171, 155, 156, 172, 0, 0, 0, 0, 0, 399, 0, 0, 0, 0, 0, 157, 158, 159, 160, 161, 162, 0, 163, 164, 165, 0, 166, 167, 168, 169, 170, 171, 155, 156, 172, 0, 0, 0, 0, 0, 427, 0, 0, 0, 0, 0, 157, 158, 159, 160, 161, 162, 0, 163, 164, 165, 0, 166, 167, 168, 169, 170, 171, 155, 156, 172, 0, 0, 0, 0, 0, 428, 0, 0, 0, 0, 0, 157, 158, 159, 160, 161, 162, 0, 163, 164, 165, 0, 166, 167, 168, 169, 170, 171, 155, 156, 172, 0, 0, 0, 0, 0, 429, 0, 0, 0, 0, 0, 157, 158, 159, 160, 161, 162, 0, 163, 164, 165, 0, 166, 167, 168, 169, 170, 171, 155, 156, 172, 0, 0, 0, 0, 0, 441, 0, 0, 0, 0, 0, 157, 158, 159, 160, 161, 162, 0, 163, 164, 165, 0, 166, 167, 168, 169, 170, 171, 155, 156, 172, 0, 0, 0, 0, 0, 448, 0, 0, 0, 0, 0, 157, 158, 159, 160, 161, 162, 0, 163, 164, 165, 0, 166, 167, 168, 169, 170, 171, 155, 156, 172, 0, 0, 0, 0, 0, 453, 0, 0, 0, 0, 0, 157, 158, 159, 160, 161, 162, 0, 163, 164, 165, 0, 166, 167, 168, 169, 170, 171, 342, 343, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 344, 345, 346, 347, 348, 349, 0, 350, 351, 352, 155, 156, 353, 354, 355, 356, 357, 0, 0, 358, 0, 0, 0, 0, 157, 158, 159, 160, 161, 162, 0, 163, 164, 342, 343, 0, 167, 168, 169, 170, 171, 0, 0, 172, 0, 0, 0, 344, 345, 346, 347, 348, 349, 0, 350, 351, 155, 156, 0, 353, 354, 355, 356, 357, 0, 0, 358, 0, 0, 0, 157, 158, 159, 160, 161, 162, 0, 163, 342, 343, 0, 0, 167, 168, 169, 170, 171, 0, 0, 172, 0, 0, 344, 345, 346, 347, 348, 349, 0, 350, 155, 156, 0, 0, 353, 354, 355, 356, 357, 0, 0, 358, 0, 0, 157, 158, 159, 160, 161, 162, 342, 343, 0, 0, 0, 0, 167, 168, 169, 170, 171, 0, 0, 172, 344, 345, 346, 347, 348, 349, 155, 156, 0, 0, 0, 0, 353, 354, 355, 356, 357, 0, 0, 358, 157, 158, 159, 160, 0, 0, 342, 343, 0, 0, 0, 0, 167, 168, 169, 170, 171, 0, 0, 172, 344, 345, 346, 347, 7, 0, 0, 8, 9, 10, 0, 0, 353, 354, 355, 356, 357, 0, 0, 358, 11, 12, 13, 0, 14, 31, 0, 15, 32, 33, 34, 0, 0, 16, 17, 18, 0, 0, 0, 0, 0, 35, 0, 36, 0, 14, 0, 0, 37, 0, 0, 0, 0, 0, 38, 39, 40 }; /* YYCHECK. */ const short int CfdgParser::yycheck_[] = { 13, 76, 145, 192, 193, 18, 111, 112, 195, 10, 196, 122, 38, 10, 10, 6, 99, 49, 101, 102, 103, 110, 35, 36, 49, 62, 0, 40, 19, 123, 110, 63, 26, 6, 26, 26, 19, 31, 63, 31, 121, 122, 226, 26, 228, 229, 19, 58, 123, 124, 61, 145, 10, 26, 10, 311, 312, 58, 59, 315, 61, 144, 59, 146, 61, 61, 92, 104, 26, 61, 145, 26, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 63, 174, 173, 279, 177, 178, 10, 14, 37, 16, 58, 184, 58, 19, 10, 26, 295, 10, 197, 198, 26, 191, 192, 193, 151, 190, 19, 197, 198, 199, 53, 54, 58, 26, 57, 61, 49, 314, 209, 49, 19, 20, 226, 10, 228, 229, 392, 393, 77, 78, 63, 222, 26, 63, 58, 62, 30, 230, 61, 88, 19, 226, 58, 228, 229, 58, 340, 26, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 8, 65, 59, 11, 61, 13, 61, 15, 19, 17, 18, 19, 26, 377, 28, 26, 296, 31, 26, 26, 28, 28, 210, 31, 13, 283, 284, 80, 36, 18, 49, 26, 26, 291, 87, 223, 31, 26, 26, 28, 295, 36, 31, 31, 63, 19, 20, 127, 62, 49, 130, 60, 302, 303, 62, 313, 311, 312, 61, 48, 315, 50, 51, 63, 61, 26, 61, 385, 61, 58, 31, 340, 436, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 340, 65, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 367, 368, 369, 398, 371, 372, 379, 385, 329, 19, 20, 370, 59, 377, 28, 379, 58, 384, 58, 386, 58, 19, 20, 24, 25, 59, 385, 8, 392, 393, 11, 396, 13, 398, 15, 58, 17, 18, 19, 26, 58, 28, 19, 20, 31, 26, 58, 28, 4, 5, 31, 8, 62, 26, 11, 36, 13, 10, 15, 10, 17, 18, 19, 29, 30, 66, 433, 65, 427, 26, 58, 28, 436, 8, 31, 62, 11, 59, 13, 36, 15, 62, 17, 18, 19, 62, 53, 54, 58, 59, 57, 26, 8, 28, 58, 11, 31, 13, 395, 15, 59, 36, 10, 19, 58, 62, 8, 24, 25, 11, 26, 13, 28, 15, 10, 31, 10, 19, 10, 57, 36, 58, 58, 53, 26, 12, 28, 62, 61, 31, 53, 10, 10, 10, 36, 13, 63, 63, 10, 67, 18, 10, 61, 14, 58, 58, 62, 59, 26, 10, 28, 57, 5, 31, 65, 50, 51, 52, 53, 54, 62, 10, 57, 64, 13, 5, 44, 245, 331, 18, 48, 222, 50, 51, 321, 369, 209, 26, -1, 28, 58, 59, 31, -1, -1, 63, 50, 51, 52, 53, 54, -1, -1, 57, -1, 44, -1, -1, -1, 48, -1, 50, 51, -1, -1, -1, -1, 13, 8, 58, 59, 11, 18, 13, 63, 15, -1, 17, 18, 19, 26, -1, 28, -1, -1, 31, 26, -1, 28, -1, -1, 31, -1, -1, -1, -1, 36, -1, 44, -1, -1, 13, 48, -1, 50, 51, 18, -1, -1, -1, -1, -1, 58, 59, 26, -1, 28, 63, -1, 31, -1, 61, -1, -1, -1, -1, -1, 10, -1, -1, 13, -1, 44, -1, -1, 18, 48, -1, 50, 51, -1, -1, -1, 26, -1, 28, 58, 59, 31, -1, -1, 63, -1, -1, -1, -1, -1, -1, -1, -1, -1, 44, -1, -1, 13, 48, -1, 50, 51, 18, 19, -1, -1, -1, -1, 58, 59, 26, -1, 28, -1, -1, 31, -1, -1, 13, -1, -1, -1, -1, 18, 19, -1, -1, -1, 44, -1, -1, 26, 48, 28, 50, 51, 31, -1, -1, 13, -1, -1, 58, 59, 18, -1, -1, -1, -1, 44, -1, -1, 26, 48, 28, 50, 51, 31, -1, -1, 13, -1, -1, 58, 59, 18, -1, -1, -1, -1, 44, -1, -1, 26, 48, 28, 50, 51, 31, -1, -1, -1, -1, -1, 58, 59, -1, -1, -1, -1, -1, 44, -1, 24, 25, 48, -1, 50, 51, -1, -1, -1, 24, 25, -1, 58, 59, 38, 39, 40, 41, 42, 43, -1, 45, 46, 47, -1, 49, 50, 51, 52, 53, 54, 24, 25, 57, -1, 50, 51, 52, 53, 54, -1, 65, 57, -1, -1, 38, 39, 40, 41, 42, 43, -1, 45, 46, 47, -1, 49, 50, 51, 52, 53, 54, 24, 25, 57, -1, -1, -1, -1, -1, 24, 25, 65, -1, -1, -1, 38, 39, 40, 41, 42, 43, -1, 45, 46, 47, -1, 49, 50, 51, 52, 53, 54, 24, 25, 57, 50, 51, 52, 53, 54, -1, 64, 57, -1, -1, -1, 38, 39, 40, 41, 42, 43, -1, 45, 46, 47, -1, 49, 50, 51, 52, 53, 54, 24, 25, 57, -1, -1, -1, -1, -1, 63, -1, -1, -1, -1, -1, 38, 39, 40, 41, 42, 43, -1, 45, 46, 47, -1, 49, 50, 51, 52, 53, 54, 24, 25, 57, -1, -1, -1, -1, -1, 63, -1, -1, -1, -1, -1, 38, 39, 40, 41, 42, 43, -1, 45, 46, 47, -1, 49, 50, 51, 52, 53, 54, 24, 25, 57, -1, -1, -1, -1, -1, 63, -1, -1, -1, -1, -1, 38, 39, 40, 41, 42, 43, -1, 45, 46, 47, -1, 49, 50, 51, 52, 53, 54, 24, 25, 57, -1, -1, -1, -1, -1, 63, -1, -1, -1, -1, -1, 38, 39, 40, 41, 42, 43, -1, 45, 46, 47, -1, 49, 50, 51, 52, 53, 54, 24, 25, 57, -1, -1, -1, -1, -1, 63, -1, -1, -1, -1, -1, 38, 39, 40, 41, 42, 43, -1, 45, 46, 47, -1, 49, 50, 51, 52, 53, 54, 24, 25, 57, -1, -1, -1, -1, -1, 63, -1, -1, -1, -1, -1, 38, 39, 40, 41, 42, 43, -1, 45, 46, 47, -1, 49, 50, 51, 52, 53, 54, 24, 25, 57, -1, -1, -1, -1, -1, 63, -1, -1, -1, -1, -1, 38, 39, 40, 41, 42, 43, -1, 45, 46, 47, -1, 49, 50, 51, 52, 53, 54, 24, 25, 57, -1, -1, -1, -1, -1, 63, -1, -1, -1, -1, -1, 38, 39, 40, 41, 42, 43, -1, 45, 46, 47, -1, 49, 50, 51, 52, 53, 54, 24, 25, 57, -1, -1, -1, -1, -1, 63, -1, -1, -1, -1, -1, 38, 39, 40, 41, 42, 43, -1, 45, 46, 47, -1, 49, 50, 51, 52, 53, 54, 24, 25, 57, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 38, 39, 40, 41, 42, 43, -1, 45, 46, 47, 24, 25, 50, 51, 52, 53, 54, -1, -1, 57, -1, -1, -1, -1, 38, 39, 40, 41, 42, 43, -1, 45, 46, 24, 25, -1, 50, 51, 52, 53, 54, -1, -1, 57, -1, -1, -1, 38, 39, 40, 41, 42, 43, -1, 45, 46, 24, 25, -1, 50, 51, 52, 53, 54, -1, -1, 57, -1, -1, -1, 38, 39, 40, 41, 42, 43, -1, 45, 24, 25, -1, -1, 50, 51, 52, 53, 54, -1, -1, 57, -1, -1, 38, 39, 40, 41, 42, 43, -1, 45, 24, 25, -1, -1, 50, 51, 52, 53, 54, -1, -1, 57, -1, -1, 38, 39, 40, 41, 42, 43, 24, 25, -1, -1, -1, -1, 50, 51, 52, 53, 54, -1, -1, 57, 38, 39, 40, 41, 42, 43, 24, 25, -1, -1, -1, -1, 50, 51, 52, 53, 54, -1, -1, 57, 38, 39, 40, 41, -1, -1, 24, 25, -1, -1, -1, -1, 50, 51, 52, 53, 54, -1, -1, 57, 38, 39, 40, 41, 3, -1, -1, 6, 7, 8, -1, -1, 50, 51, 52, 53, 54, -1, -1, 57, 19, 20, 21, -1, 23, 3, -1, 26, 6, 7, 8, -1, -1, 32, 33, 34, -1, -1, -1, -1, -1, 19, -1, 21, -1, 23, -1, -1, 26, -1, -1, -1, -1, -1, 32, 33, 34 }; /* STOS_[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ const unsigned char CfdgParser::yystos_[] = { 0, 4, 5, 69, 70, 71, 0, 3, 6, 7, 8, 19, 20, 21, 23, 26, 32, 33, 34, 73, 74, 76, 78, 82, 83, 84, 85, 93, 94, 99, 100, 3, 6, 7, 8, 19, 21, 26, 32, 33, 34, 72, 75, 77, 78, 81, 86, 87, 90, 91, 92, 93, 95, 96, 97, 98, 26, 31, 26, 26, 10, 59, 61, 132, 10, 132, 10, 26, 58, 29, 30, 79, 132, 61, 61, 26, 31, 19, 26, 28, 26, 10, 58, 104, 132, 132, 10, 19, 26, 104, 79, 60, 80, 132, 13, 18, 26, 28, 31, 44, 48, 50, 51, 58, 59, 133, 136, 143, 146, 61, 106, 61, 61, 58, 59, 59, 28, 58, 134, 134, 58, 120, 107, 58, 105, 133, 104, 58, 103, 104, 58, 103, 6, 19, 26, 63, 101, 102, 10, 103, 104, 10, 26, 79, 58, 58, 59, 143, 143, 143, 143, 59, 134, 58, 137, 24, 25, 38, 39, 40, 41, 42, 43, 45, 46, 47, 49, 50, 51, 52, 53, 54, 57, 8, 11, 13, 15, 17, 19, 26, 28, 31, 36, 62, 88, 89, 109, 114, 116, 119, 126, 127, 128, 129, 130, 136, 147, 106, 106, 19, 20, 65, 135, 62, 26, 28, 62, 122, 123, 124, 147, 8, 11, 13, 15, 19, 26, 36, 62, 108, 117, 118, 124, 147, 10, 28, 44, 48, 50, 51, 58, 63, 133, 141, 144, 146, 133, 10, 102, 10, 102, 19, 26, 19, 26, 49, 63, 10, 10, 143, 10, 63, 141, 143, 63, 134, 65, 19, 26, 138, 139, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 147, 19, 26, 143, 58, 58, 143, 10, 143, 10, 61, 53, 58, 61, 143, 12, 133, 61, 110, 114, 110, 110, 61, 137, 105, 62, 62, 13, 26, 28, 31, 48, 50, 51, 58, 136, 140, 142, 145, 26, 30, 53, 61, 121, 122, 132, 10, 10, 58, 58, 61, 36, 61, 108, 111, 132, 63, 144, 144, 144, 143, 49, 63, 24, 25, 38, 39, 40, 41, 42, 43, 45, 46, 47, 50, 51, 52, 53, 54, 57, 63, 63, 101, 63, 63, 63, 65, 65, 10, 10, 67, 105, 10, 10, 143, 143, 63, 143, 115, 110, 106, 14, 112, 133, 133, 58, 58, 59, 142, 142, 143, 137, 142, 24, 25, 66, 125, 120, 134, 107, 63, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 65, 143, 143, 26, 139, 143, 133, 143, 143, 63, 63, 63, 110, 62, 14, 16, 62, 113, 131, 143, 63, 141, 143, 63, 142, 142, 132, 62, 62, 62, 63, 133, 64, 143, 110, 63, 63, 65, 64 }; #if YYDEBUG /* TOKEN_NUMBER_[YYLEX-NUM] -- Internal symbol number corresponding to YYLEX-NUM. */ const unsigned short int CfdgParser::yytoken_number_[] = { 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 44, 45, 43, 95, 42, 47, 304, 305, 94, 40, 91, 64, 123, 125, 41, 58, 93, 124, 59 }; #endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ const unsigned char CfdgParser::yyr1_[] = { 0, 68, 69, 69, 70, 70, 71, 71, 72, 72, 72, 72, 72, 72, 72, 72, 72, 73, 73, 73, 73, 73, 73, 73, 73, 73, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 75, 75, 75, 75, 75, 76, 77, 78, 79, 79, 80, 80, 81, 81, 81, 82, 83, 84, 85, 86, 87, 87, 87, 87, 87, 87, 87, 87, 88, 88, 89, 90, 91, 92, 93, 93, 94, 95, 95, 96, 97, 98, 99, 100, 101, 101, 101, 101, 101, 101, 102, 102, 103, 103, 104, 104, 105, 105, 105, 105, 106, 106, 107, 107, 108, 108, 109, 109, 109, 109, 109, 109, 110, 110, 111, 111, 112, 112, 113, 114, 114, 114, 115, 114, 114, 114, 114, 114, 114, 116, 116, 116, 117, 117, 117, 118, 118, 118, 118, 118, 118, 118, 118, 118, 119, 120, 120, 121, 121, 122, 123, 123, 125, 124, 126, 126, 126, 127, 128, 129, 129, 130, 131, 131, 132, 132, 133, 133, 134, 134, 135, 135, 135, 135, 136, 137, 138, 138, 139, 139, 140, 140, 141, 141, 142, 142, 142, 142, 142, 142, 142, 142, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 145, 145, 145, 145, 145, 145, 146, 146, 146, 146, 146, 146, 146, 147, 147 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ const unsigned char CfdgParser::yyr2_[] = { 0, 2, 2, 2, 2, 0, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 1, 1, 3, 3, 3, 3, 2, 2, 2, 2, 1, 2, 3, 1, 1, 1, 2, 0, 4, 3, 3, 2, 2, 2, 2, 2, 4, 3, 4, 2, 4, 3, 4, 2, 2, 2, 2, 3, 2, 3, 2, 3, 4, 1, 2, 3, 4, 4, 2, 4, 2, 2, 2, 2, 1, 1, 3, 1, 3, 0, 3, 2, 3, 3, 2, 0, 2, 0, 2, 0, 4, 2, 4, 3, 3, 5, 3, 4, 3, 1, 3, 1, 2, 0, 2, 1, 1, 1, 0, 4, 2, 2, 2, 4, 1, 2, 2, 2, 1, 2, 1, 2, 2, 1, 1, 2, 2, 1, 1, 1, 3, 2, 0, 3, 1, 2, 1, 2, 0, 4, 4, 4, 2, 4, 3, 2, 2, 4, 3, 2, 3, 3, 3, 5, 2, 0, 2, 3, 2, 2, 1, 5, 3, 1, 3, 3, 2, 1, 3, 1, 1, 1, 3, 1, 2, 2, 3, 3, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 3, 4, 4, 4, 2, 1, 3, 4, 4, 4, 4, 2, 1, 1, 1 }; #if YYDEBUG /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at \a yyntokens_, nonterminals. */ const char* const CfdgParser::yytname_[] = { "$end", "error", "$undefined", "STARTSHAPE", "CFDG2", "CFDG3", "SHAPE", "RULE", "PATH", "DEFINE", "BECOMES", "LOOP", "FINALLY", "IF", "ELSE", "SWITCH", "CASE", "CLONE", "LET", "MODTYPE", "PARAM", "BACKGROUND", "BADEOF", "GOODEOF", "RANGEOP", "PLUSMINUSOP", "USER_STRING", "USER_INTEGER", "USER_RATIONAL", "USER_FILENAME", "USER_QSTRING", "USER_ARRAYNAME", "INCLUDE", "IMPORT", "TILE", "PARAMETERS", "USER_PATHOP", "STROKEWIDTH", "LE", "LT", "GE", "GT", "EQ", "NEQ", "NOT", "AND", "OR", "XOR", "CF_INFINITY", "','", "'-'", "'+'", "'_'", "'*'", "'/'", "POS", "NEG", "'^'", "'('", "'['", "'@'", "'{'", "'}'", "')'", "':'", "']'", "'|'", "';'", "$accept", "choose", "cfdg2", "cfdg3", "statement", "statement_v2", "v3clues", "v2stuff", "inclusion", "import", "eof", "fileString", "fileNameSpace", "initialization", "initialization_v2", "background", "tile", "size", "global_definition", "global_definition_header", "definition_header", "definition", "shape", "shape_singleton_header", "shape_singleton", "rule_header_v2", "rule_v2", "rule_header", "path_header", "rule", "path", "path_header_v2", "path_v2", "parameter", "buncha_parameters", "parameter_list", "function_parameter_list", "parameter_spec", "buncha_elements", "buncha_pathOps_v2", "pathOp_simple_v2", "element_simple", "one_or_more_elements", "one_or_more_pathOp_v2", "caseBody", "caseBody_element", "element", "$@1", "element_v2clue", "pathOp_v2", "pathOp_v3clues", "element_loop", "buncha_replacements_v2", "one_or_more_replacements_v2", "replacement_simple_v2", "replacement_v2", "loopHeader_v2", "$@2", "loopHeader", "ifHeader", "ifElseHeader", "transHeader", "switchHeader", "caseHeader", "modification_v2", "modification", "buncha_adjustments", "adjustment", "letHeader", "letBody", "letVariables", "letVariable", "explist", "arglist", "exp", "exp2", "exp3", "expfunc", "exp2func", "shapeName", YY_NULL }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ const CfdgParser::rhs_number_type CfdgParser::yyrhs_[] = { 69, 0, -1, 4, 70, -1, 5, 71, -1, 70, 73, -1, -1, 71, 72, -1, -1, 81, -1, 77, -1, 78, -1, 97, -1, 98, -1, 90, -1, 92, -1, 86, -1, 75, -1, 82, -1, 83, -1, 76, -1, 78, -1, 84, -1, 85, -1, 94, -1, 100, -1, 74, -1, 26, 10, -1, 19, 10, -1, 20, 10, -1, 26, 58, -1, 26, 26, 58, -1, 33, -1, 6, -1, 8, 26, 58, -1, 3, 26, 58, -1, 3, 26, 59, -1, 3, 31, 59, -1, 21, 132, -1, 34, 132, -1, 19, 132, -1, 32, 79, -1, 93, -1, 32, 79, -1, 33, 80, 79, -1, 23, -1, 29, -1, 30, -1, 60, 26, -1, -1, 3, 26, 105, 133, -1, 3, 31, 133, -1, 3, 26, 105, -1, 3, 26, -1, 21, 132, -1, 34, 132, -1, 19, 132, -1, 87, 143, -1, 6, 26, 104, 10, -1, 26, 104, 10, -1, 26, 26, 104, 10, -1, 26, 10, -1, 6, 19, 104, 10, -1, 19, 104, 10, -1, 26, 19, 103, 10, -1, 19, 10, -1, 26, 10, -1, 19, 10, -1, 88, 143, -1, 6, 26, 103, -1, 90, 61, -1, 91, 106, 62, -1, 7, 26, -1, 7, 26, 28, -1, 93, 61, 120, 62, -1, 7, -1, 7, 28, -1, 8, 26, 103, -1, 95, 61, 106, 62, -1, 96, 61, 106, 62, -1, 8, 26, -1, 99, 61, 107, 62, -1, 26, 26, -1, 6, 26, -1, 26, 19, -1, 6, 19, -1, 26, -1, 19, -1, 102, 49, 101, -1, 101, -1, 58, 102, 63, -1, -1, 58, 102, 63, -1, 58, 63, -1, 58, 141, 63, -1, 58, 10, 63, -1, 58, 63, -1, -1, 106, 114, -1, -1, 107, 117, -1, -1, 36, 61, 134, 62, -1, 147, 132, -1, 36, 58, 143, 63, -1, 36, 58, 63, -1, 147, 105, 133, -1, 13, 58, 143, 63, 133, -1, 136, 137, 133, -1, 8, 147, 105, 133, -1, 61, 106, 62, -1, 114, -1, 61, 107, 62, -1, 108, -1, 112, 113, -1, -1, 131, 110, -1, 109, -1, 89, -1, 119, -1, -1, 119, 12, 115, 110, -1, 127, 110, -1, 128, 110, -1, 129, 110, -1, 130, 61, 112, 62, -1, 116, -1, 28, 53, -1, 26, 61, -1, 36, 61, -1, 108, -1, 124, 111, -1, 118, -1, 36, 58, -1, 26, 58, -1, 8, -1, 11, -1, 26, 10, -1, 19, 10, -1, 13, -1, 19, -1, 15, -1, 126, 133, 110, -1, 120, 123, -1, -1, 61, 120, 62, -1, 122, -1, 147, 132, -1, 122, -1, 124, 121, -1, -1, 28, 53, 125, 132, -1, 11, 26, 10, 143, -1, 11, 19, 10, 143, -1, 11, 143, -1, 13, 58, 143, 63, -1, 127, 110, 14, -1, 19, 143, -1, 17, 143, -1, 15, 58, 143, 63, -1, 16, 143, 64, -1, 14, 64, -1, 61, 134, 62, -1, 59, 134, 65, -1, 59, 134, 65, -1, 59, 59, 134, 65, 65, -1, 134, 135, -1, -1, 19, 140, -1, 19, 142, 66, -1, 20, 26, -1, 20, 30, -1, 18, -1, 58, 138, 67, 143, 63, -1, 138, 67, 139, -1, 139, -1, 26, 10, 143, -1, 19, 10, 143, -1, 140, 142, -1, 142, -1, 141, 49, 144, -1, 144, -1, 28, -1, 48, -1, 58, 143, 63, -1, 145, -1, 50, 142, -1, 51, 142, -1, 142, 24, 142, -1, 142, 25, 142, -1, 28, -1, 48, -1, 146, -1, 143, 24, 143, -1, 143, 25, 143, -1, 143, 49, 143, -1, 143, 51, 143, -1, 143, 50, 143, -1, 143, 52, 143, -1, 143, 53, 143, -1, 143, 54, 143, -1, 50, 143, -1, 51, 143, -1, 44, 143, -1, 143, 57, 143, -1, 143, 39, 143, -1, 143, 38, 143, -1, 143, 41, 143, -1, 143, 40, 143, -1, 143, 42, 143, -1, 143, 43, 143, -1, 143, 45, 143, -1, 143, 46, 143, -1, 143, 47, 143, -1, 58, 143, 63, -1, 133, -1, 28, -1, 48, -1, 146, -1, 144, 24, 144, -1, 144, 25, 144, -1, 144, 51, 144, -1, 144, 50, 144, -1, 144, 52, 144, -1, 144, 53, 144, -1, 144, 54, 144, -1, 50, 144, -1, 51, 144, -1, 44, 144, -1, 144, 57, 144, -1, 144, 39, 144, -1, 144, 38, 144, -1, 144, 41, 144, -1, 144, 40, 144, -1, 144, 42, 144, -1, 144, 43, 144, -1, 144, 45, 144, -1, 144, 46, 144, -1, 144, 47, 144, -1, 58, 143, 63, -1, 133, -1, 26, 58, 63, -1, 26, 58, 141, 63, -1, 31, 59, 143, 65, -1, 13, 58, 143, 63, -1, 136, 137, -1, 26, -1, 26, 58, 63, -1, 26, 58, 141, 63, -1, 31, 59, 143, 65, -1, 13, 58, 143, 63, -1, 26, 58, 10, 63, -1, 136, 137, -1, 26, -1, 26, -1, 31, -1 }; /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in YYRHS. */ const unsigned short int CfdgParser::yyprhs_[] = { 0, 0, 3, 6, 9, 12, 13, 16, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 56, 59, 62, 65, 69, 71, 73, 77, 81, 85, 89, 92, 95, 98, 101, 103, 106, 110, 112, 114, 116, 119, 120, 125, 129, 133, 136, 139, 142, 145, 148, 153, 157, 162, 165, 170, 174, 179, 182, 185, 188, 191, 195, 198, 202, 205, 209, 214, 216, 219, 223, 228, 233, 236, 241, 244, 247, 250, 253, 255, 257, 261, 263, 267, 268, 272, 275, 279, 283, 286, 287, 290, 291, 294, 295, 300, 303, 308, 312, 316, 322, 326, 331, 335, 337, 341, 343, 346, 347, 350, 352, 354, 356, 357, 362, 365, 368, 371, 376, 378, 381, 384, 387, 389, 392, 394, 397, 400, 402, 404, 407, 410, 412, 414, 416, 420, 423, 424, 428, 430, 433, 435, 438, 439, 444, 449, 454, 457, 462, 466, 469, 472, 477, 481, 484, 488, 492, 496, 502, 505, 506, 509, 513, 516, 519, 521, 527, 531, 533, 537, 541, 544, 546, 550, 552, 554, 556, 560, 562, 565, 568, 572, 576, 578, 580, 582, 586, 590, 594, 598, 602, 606, 610, 614, 617, 620, 623, 627, 631, 635, 639, 643, 647, 651, 655, 659, 663, 667, 669, 671, 673, 675, 679, 683, 687, 691, 695, 699, 703, 706, 709, 712, 716, 720, 724, 728, 732, 736, 740, 744, 748, 752, 756, 758, 762, 767, 772, 777, 780, 782, 786, 791, 796, 801, 806, 809, 811, 813 }; /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ const unsigned short int CfdgParser::yyrline_[] = { 0, 189, 189, 189, 192, 197, 201, 206, 210, 211, 212, 213, 214, 215, 216, 217, 218, 225, 226, 227, 228, 229, 230, 231, 232, 233, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 259, 260, 261, 262, 263, 267, 276, 287, 294, 294, 297, 298, 302, 315, 327, 341, 352, 362, 372, 387, 396, 402, 408, 414, 418, 423, 428, 434, 441, 444, 451, 460, 476, 490, 499, 508, 523, 531, 543, 560, 585, 594, 604, 617, 624, 630, 636, 641, 645, 651, 657, 658, 662, 663, 667, 668, 672, 673, 674, 675, 679, 684, 688, 691, 695, 702, 712, 721, 730, 742, 756, 770, 784, 786, 794, 796, 802, 806, 810, 814, 818, 822, 833, 833, 851, 862, 873, 884, 893, 900, 901, 902, 906, 908, 916, 928, 929, 930, 931, 932, 933, 934, 935, 936, 940, 951, 954, 958, 960, 966, 975, 977, 988, 988, 1003, 1016, 1030, 1045, 1058, 1068, 1080, 1096, 1109, 1138, 1151, 1156, 1163, 1168, 1175, 1180, 1189, 1194, 1204, 1209, 1216, 1224, 1230, 1232, 1236, 1242, 1249, 1253, 1260, 1264, 1270, 1272, 1274, 1276, 1278, 1280, 1282, 1287, 1294, 1296, 1298, 1300, 1305, 1310, 1312, 1314, 1316, 1318, 1320, 1322, 1324, 1326, 1328, 1330, 1332, 1334, 1336, 1338, 1340, 1342, 1344, 1346, 1348, 1350, 1354, 1356, 1358, 1360, 1365, 1370, 1372, 1374, 1376, 1378, 1380, 1382, 1384, 1386, 1388, 1390, 1392, 1394, 1396, 1398, 1400, 1402, 1404, 1406, 1408, 1412, 1417, 1423, 1429, 1435, 1441, 1448, 1453, 1459, 1465, 1471, 1477, 1483, 1490, 1492 }; // Print the state stack on the debug stream. void CfdgParser::yystack_print_ () { *yycdebug_ << "Stack now"; for (state_stack_type::const_iterator i = yystate_stack_.begin (); i != yystate_stack_.end (); ++i) *yycdebug_ << ' ' << *i; *yycdebug_ << std::endl; } // Report on the debug stream that the rule \a yyrule is going to be reduced. void CfdgParser::yy_reduce_print_ (int yyrule) { unsigned int yylno = yyrline_[yyrule]; int yynrhs = yyr2_[yyrule]; /* Print the symbols being reduced, and their result. */ *yycdebug_ << "Reducing stack by rule " << yyrule - 1 << " (line " << yylno << "):" << std::endl; /* The symbols being reduced. */ for (int yyi = 0; yyi < yynrhs; yyi++) YY_SYMBOL_PRINT (" $" << yyi + 1 << " =", yyrhs_[yyprhs_[yyrule] + yyi], &(yysemantic_stack_[(yynrhs) - (yyi + 1)]), &(yylocation_stack_[(yynrhs) - (yyi + 1)])); } #endif // YYDEBUG /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ CfdgParser::token_number_type CfdgParser::yytranslate_ (int t) { static const token_number_type translate_table[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 58, 63, 53, 51, 49, 50, 2, 54, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 64, 67, 2, 2, 2, 2, 60, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 59, 2, 65, 57, 52, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 61, 66, 62, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 55, 56 }; if ((unsigned int) t <= yyuser_token_number_max_) return translate_table[t]; else return yyundef_token_; } const int CfdgParser::yyeof_ = 0; const int CfdgParser::yylast_ = 1331; const int CfdgParser::yynnts_ = 80; const int CfdgParser::yyempty_ = -2; const int CfdgParser::yyfinal_ = 6; const int CfdgParser::yyterror_ = 1; const int CfdgParser::yyerrcode_ = 256; const int CfdgParser::yyntokens_ = 68; const unsigned int CfdgParser::yyuser_token_number_max_ = 305; const CfdgParser::token_number_type CfdgParser::yyundef_token_ = 2; } // yy /* Line 1141 of lalr1.cc */ #line 3882 "cfdg.tab.cpp" /* Line 1142 of lalr1.cc */ #line 1495 "../../src-common/cfdg.ypp" void yy::CfdgParser::error(const CfdgParser::location_type& l, const std::string& m) { driver.mWant2ndPass = false; driver.error(l, m); } contextfree-3.0.5+dfsg1.orig/README.txt0000644000175000017500000001074312076364074016144 0ustar brambram*** Context Free *** version 3.0 by Chris Coyne, John Horigan and Mark Lentczner Context Free Copyright 2005-2013 Mark Lentczner and John Horigan CFDG Copyright 2005 Chris Coyne Anti-Grain Geometry library Copyright 2002-2005 Maxim Shemanarev ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ DISTRIBUTION & LICENSE Context Free is released under the GNU license. Context Free is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ GENERAL NOTES ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ FILE TREE ./ - top level: this file, license, Makefile, Xcode project and Windows CLI solution ./input/ - sample input files ./src-agg/ - a subset of the Anti_Grain Geometry sources ./src-common/ - the CFDG engine ./src-ffmpeg/ - FFmpeg resources ./src-ffmpeg/include/ - FFmpeg include files ./src-ffmpeg/lib/ - FFmpeg libraries for Linux ./src-ffmpeg/lib32/ - FFmpeg libraries for Windows i386 ./src-ffmpeg/lib64/ - FFmpeg libraries for Windows x86_64 ./src-net/ - Windows .Net specific sources ./src-osx/ - Mac specific sources ./src-unix/ - Unix/Posix specific sources ./src-win/ - Windows specific sources ./src-win/derived/ - pre-built output from flex and yacc for folks that don't have those tools available ./src-win/icon/ - Explorer icons ./src-win/res/ - UI icons ./src-win/win-install/ - files for creating NSIS installer EXE ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MACINTOSH BUILD NOTES Requires Xcode 4 & Mac OS X 10.5 (Leopard). Developed with XCode 4.5 and Mac OS X 10.8 (Mountain Lion), has not been tested with older versions of XCode or Mac OS X. The Xcode project file is in the top directory: ./Context Free.xcodeproj ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ WINDOWS GUI BUILD NOTES Requires Visual Studio 2010 or later. The VS2010 solution file is at ./src-net/ContextFreeNet.sln The VS2012 Express solution file is at ./src-net/ContextFreeNetVS11.sln If you modify cfdg.l or cfdg.ypp then you must rebuild the parser files in src-win/derived. If you have Cygwin installed or have access to a Unix/Linux or Mac system then cd to src-win/derived and type 'make'. ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ WINDOWS CLI (command line) BUILD NOTES Requires Visual Studio 2010 or Visual C++ 2010 Express edition, or later. The VS2010 CLI solution file is at ./ContextFreeCLI.sln The VS2012 Express CLI solution file is at ./ContextFreeCLIVS11.sln If you modify cfdg.l or cfdg.ypp then you must rebuild the parser files in src-win/derived. If you have Cygwin installed or have access to a Unix/Linux or Mac system then cd to src-win/derived and type 'make'. ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ BSD/LINUX/UNIX/POSIX BUILD NOTES You'll need a c++ compiler, flex (not lex), bison and the libpng Library. Most of this should be installed or easily available on any modern operating system distribution. If you need it, libpng can be found here: http://libpng.org/pub/png/libpng.html The Makefile assumes that libpng is installed at /usr/local/lib. If libpng is installed in a different location then you must update the LIB_DIRS variable in the Makefile with this location. From the top level, you should just run: $ make You'll see a warning about "mktemp" and "mkstemp" during the link step. This can be ignored. To run the program, try something like: $ ./cfdg -s 500 input/mtree.cfdg mtree.png Run it with -? to get a usage summary: $ ./cfdg -? ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ FFmpeg BUILD NOTES Check out README.ffmpeg for building ffmpeg or disabling ffmpeg support contextfree-3.0.5+dfsg1.orig/ContextFreeCLI.sln0000644000175000017500000000375412076364074017746 0ustar brambram Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ContextFreeCLI", "ContextFreeCLI.vcxproj", "{86A42375-C631-493B-8785-DE489713E3A5}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Debug64|Win32 = Debug64|Win32 Debug64|x64 = Debug64|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 Release64|Win32 = Release64|Win32 Release64|x64 = Release64|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {86A42375-C631-493B-8785-DE489713E3A5}.Debug|Win32.ActiveCfg = Debug|Win32 {86A42375-C631-493B-8785-DE489713E3A5}.Debug|Win32.Build.0 = Debug|Win32 {86A42375-C631-493B-8785-DE489713E3A5}.Debug|x64.ActiveCfg = Debug|x64 {86A42375-C631-493B-8785-DE489713E3A5}.Debug|x64.Build.0 = Debug|x64 {86A42375-C631-493B-8785-DE489713E3A5}.Debug64|Win32.ActiveCfg = Debug64|Win32 {86A42375-C631-493B-8785-DE489713E3A5}.Debug64|Win32.Build.0 = Debug64|Win32 {86A42375-C631-493B-8785-DE489713E3A5}.Debug64|x64.ActiveCfg = Debug64|x64 {86A42375-C631-493B-8785-DE489713E3A5}.Debug64|x64.Build.0 = Debug64|x64 {86A42375-C631-493B-8785-DE489713E3A5}.Release|Win32.ActiveCfg = Release|Win32 {86A42375-C631-493B-8785-DE489713E3A5}.Release|Win32.Build.0 = Release|Win32 {86A42375-C631-493B-8785-DE489713E3A5}.Release|x64.ActiveCfg = Release|x64 {86A42375-C631-493B-8785-DE489713E3A5}.Release|x64.Build.0 = Release|x64 {86A42375-C631-493B-8785-DE489713E3A5}.Release64|Win32.ActiveCfg = Release64|Win32 {86A42375-C631-493B-8785-DE489713E3A5}.Release64|Win32.Build.0 = Release64|Win32 {86A42375-C631-493B-8785-DE489713E3A5}.Release64|x64.ActiveCfg = Release64|x64 {86A42375-C631-493B-8785-DE489713E3A5}.Release64|x64.Build.0 = Release64|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal contextfree-3.0.5+dfsg1.orig/ContextFreeCLIVS11.vcxproj0000644000175000017500000007154012076364074021256 0ustar brambram Debug64 Win32 Debug64 x64 Debug Win32 Debug x64 Release64 Win32 Release64 x64 Release Win32 Release x64 {86A42375-C631-493B-8785-DE489713E3A5} ContextFreeCLI Win32Proj Application Unicode v110_xp Application Unicode v110_xp Application Unicode v110_xp Application Unicode v110_xp Application Unicode v110_xp Application Unicode v110_xp Application Unicode v110_xp Application Unicode v110_xp <_ProjectFileVersion>10.0.40219.1 Debug\ Debug\ Debug\ Debug64\ Debug\ Debug\ Debug\ Debug64\ true true true true Release\ Release\ Release\ Release64\ Release\ Release\ Release\ Release64\ true true true false ContextFreeCLI ContextFreeCLI ContextFreeCLI ContextFreeCLI ContextFreeCLI Disabled src-ffmpeg\include;..\include;src-common;src-win;src-win/derived;src-agg\include;src-common\agg-extras;src-unix;%(AdditionalIncludeDirectories) _DEBUG;UNICODE;WIN32;_WINDOWS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Fast Level4 EditAndContinue 4100;4290;%(DisableSpecificWarnings) libavformat.a;libavutil.a;libavcodec.a;GdiPlus.lib;%(AdditionalDependencies) true Console MachineX86 $(SolutionDir)/src-ffmpeg/lib32;%(AdditionalLibraryDirectories) false Disabled src-ffmpeg\include;..\include;src-common;src-win;src-win/derived;src-agg\include;src-common\agg-extras;src-unix;%(AdditionalIncludeDirectories) _DEBUG;UNICODE;WIN32;_WINDOWS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Fast Level4 EditAndContinue 4100;4290;%(DisableSpecificWarnings) libavformat.a;libavutil.a;libavcodec.a;GdiPlus.lib;%(AdditionalDependencies) true Console MachineX86 $(SolutionDir)/src-ffmpeg/lib32;%(AdditionalLibraryDirectories) false Disabled src-ffmpeg\include;..\include;src-common;src-win;src-win/derived;src-agg\include;src-common\agg-extras;src-unix;%(AdditionalIncludeDirectories) _DEBUG;UNICODE;WIN32;_WINDOWS;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL Fast Level4 ProgramDatabase 4100;4290;%(DisableSpecificWarnings) libavformat.a;libavutil.a;libavcodec.a;GdiPlus.lib;%(AdditionalDependencies) true Console $(SolutionDir)/src-ffmpeg/lib32;%(AdditionalLibraryDirectories) Disabled src-ffmpeg\include;..\include;src-common;src-win;src-win/derived;src-agg\include;src-common\agg-extras;src-unix;%(AdditionalIncludeDirectories) _DEBUG;UNICODE;WIN32;_WINDOWS;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL Fast Level4 ProgramDatabase 4100;4290;%(DisableSpecificWarnings) libavformat.a;libavutil.a;libavcodec.a;GdiPlus.lib;%(AdditionalDependencies) true Console $(SolutionDir)/src-ffmpeg/lib64;%(AdditionalLibraryDirectories) src-ffmpeg\include;..\include;src-common;src-win;src-win/derived;src-agg\include;src-common\agg-extras;src-unix;%(AdditionalIncludeDirectories) NDEBUG;UNICODE;WIN32;_WINDOWS;%(PreprocessorDefinitions) MultiThreadedDLL Fast Level4 ProgramDatabase 4100;4290;%(DisableSpecificWarnings) libavformat.a;libavutil.a;libavcodec.a;GdiPlus.lib;%(AdditionalDependencies) true Console true true MachineX86 $(SolutionDir)/src-ffmpeg/lib32;%(AdditionalLibraryDirectories) false src-ffmpeg\include;..\include;src-common;src-win;src-win/derived;src-agg\include;src-common\agg-extras;src-unix;%(AdditionalIncludeDirectories) NDEBUG;UNICODE;WIN32;_WINDOWS;%(PreprocessorDefinitions) MultiThreadedDLL Fast Level4 ProgramDatabase 4100;4290;%(DisableSpecificWarnings) libavformat.a;libavutil.a;libavcodec.a;GdiPlus.lib;%(AdditionalDependencies) true Console true true MachineX86 $(SolutionDir)/src-ffmpeg/lib32;%(AdditionalLibraryDirectories) false src-ffmpeg\include;..\include;src-common;src-win;src-win/derived;src-agg\include;src-common\agg-extras;src-unix;%(AdditionalIncludeDirectories) NDEBUG;UNICODE;WIN32;_WINDOWS;%(PreprocessorDefinitions) MultiThreadedDLL Fast Level4 ProgramDatabase 4100;4290;%(DisableSpecificWarnings) libavformat.a;libavutil.a;libavcodec.a;GdiPlus.lib;%(AdditionalDependencies) true Console true true $(SolutionDir)/src-ffmpeg/lib32;%(AdditionalLibraryDirectories) src-ffmpeg\include;..\include;src-common;src-win;src-win/derived;src-agg\include;src-common\agg-extras;src-unix;%(AdditionalIncludeDirectories) NDEBUG;UNICODE;WIN32;_WINDOWS;%(PreprocessorDefinitions) MultiThreadedDLL Fast Level4 ProgramDatabase 4100;4290;%(DisableSpecificWarnings) libavformat.a;libavutil.a;libavcodec.a;GdiPlus.lib;%(AdditionalDependencies) true Console true true $(SolutionDir)/src-ffmpeg/lib64;%(AdditionalLibraryDirectories) NotUsing NotUsing NotUsing NotUsing NotUsing NotUsing NotUsing NotUsing NotUsing NotUsing NotUsing NotUsing NotUsing NotUsing NotUsing NotUsing false contextfree-3.0.5+dfsg1.orig/ContextFreeCLI.vcproj0000644000175000017500000002761112076364074020453 0ustar brambram contextfree-3.0.5+dfsg1.orig/ContextFreeCLI.vcxproj0000644000175000017500000006674012076364074020651 0ustar brambram Debug64 Win32 Debug64 x64 Debug Win32 Debug x64 Release64 Win32 Release64 x64 Release Win32 Release x64 {86A42375-C631-493B-8785-DE489713E3A5} ContextFreeCLI Win32Proj Application Unicode Application Unicode Application Unicode Application Unicode Application Unicode Application Unicode Application Unicode Application Unicode <_ProjectFileVersion>10.0.40219.1 Debug\ Debug\ Debug\ Debug64\ Debug\ Debug\ Debug\ Debug64\ true true true true Release\ Release\ Release\ Release64\ Release\ Release\ Release\ Release64\ true true true false Disabled src-ffmpeg\include;..\include;src-common;src-win;src-win/derived;src-agg\include;src-common\agg-extras;src-unix;%(AdditionalIncludeDirectories) _DEBUG;UNICODE;WIN32;_WINDOWS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Fast Level4 EditAndContinue 4100;4290;%(DisableSpecificWarnings) libavformat.a;libavutil.a;libavcodec.a;GdiPlus.lib;%(AdditionalDependencies) true Console MachineX86 $(SolutionDir)/src-ffmpeg/lib32;%(AdditionalLibraryDirectories) Disabled src-ffmpeg\include;..\include;src-common;src-win;src-win/derived;src-agg\include;src-common\agg-extras;src-unix;%(AdditionalIncludeDirectories) _DEBUG;UNICODE;WIN32;_WINDOWS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Fast Level4 EditAndContinue 4100;4290;%(DisableSpecificWarnings) libavformat.a;libavutil.a;libavcodec.a;GdiPlus.lib;%(AdditionalDependencies) true Console MachineX86 $(SolutionDir)/src-ffmpeg/lib32;%(AdditionalLibraryDirectories) Disabled src-ffmpeg\include;..\include;src-common;src-win;src-win/derived;src-agg\include;src-common\agg-extras;src-unix;%(AdditionalIncludeDirectories) _DEBUG;UNICODE;WIN32;_WINDOWS;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL Fast Level4 ProgramDatabase 4100;4290;%(DisableSpecificWarnings) libavformat.a;libavutil.a;libavcodec.a;GdiPlus.lib;%(AdditionalDependencies) true Console $(SolutionDir)/src-ffmpeg/lib32;%(AdditionalLibraryDirectories) Disabled src-ffmpeg\include;..\include;src-common;src-win;src-win/derived;src-agg\include;src-common\agg-extras;src-unix;%(AdditionalIncludeDirectories) _DEBUG;UNICODE;WIN32;_WINDOWS;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL Fast Level4 ProgramDatabase 4100;4290;%(DisableSpecificWarnings) libavformat.a;libavutil.a;libavcodec.a;GdiPlus.lib;%(AdditionalDependencies) true Console $(SolutionDir)/src-ffmpeg/lib64;%(AdditionalLibraryDirectories) src-ffmpeg\include;..\include;src-common;src-win;src-win/derived;src-agg\include;src-common\agg-extras;src-unix;%(AdditionalIncludeDirectories) NDEBUG;UNICODE;WIN32;_WINDOWS;%(PreprocessorDefinitions) MultiThreadedDLL Fast Level4 ProgramDatabase 4100;4290;%(DisableSpecificWarnings) libavformat.a;libavutil.a;libavcodec.a;GdiPlus.lib;%(AdditionalDependencies) true Console true true MachineX86 $(SolutionDir)/src-ffmpeg/lib32;%(AdditionalLibraryDirectories) src-ffmpeg\include;..\include;src-common;src-win;src-win/derived;src-agg\include;src-common\agg-extras;src-unix;%(AdditionalIncludeDirectories) NDEBUG;UNICODE;WIN32;_WINDOWS;%(PreprocessorDefinitions) MultiThreadedDLL Fast Level4 ProgramDatabase 4100;4290;%(DisableSpecificWarnings) libavformat.a;libavutil.a;libavcodec.a;GdiPlus.lib;%(AdditionalDependencies) true Console true true MachineX86 $(SolutionDir)/src-ffmpeg/lib32;%(AdditionalLibraryDirectories) src-ffmpeg\include;..\include;src-common;src-win;src-win/derived;src-agg\include;src-common\agg-extras;src-unix;%(AdditionalIncludeDirectories) NDEBUG;UNICODE;WIN32;_WINDOWS;%(PreprocessorDefinitions) MultiThreadedDLL Fast Level4 ProgramDatabase 4100;4290;%(DisableSpecificWarnings) libavformat.a;libavutil.a;libavcodec.a;GdiPlus.lib;%(AdditionalDependencies) true Console true true $(SolutionDir)/src-ffmpeg/lib32;%(AdditionalLibraryDirectories) src-ffmpeg\include;..\include;src-common;src-win;src-win/derived;src-agg\include;src-common\agg-extras;src-unix;%(AdditionalIncludeDirectories) NDEBUG;UNICODE;WIN32;_WINDOWS;%(PreprocessorDefinitions) MultiThreadedDLL Fast Level4 ProgramDatabase 4100;4290;%(DisableSpecificWarnings) libavformat.a;libavutil.a;libavcodec.a;GdiPlus.lib;%(AdditionalDependencies) true Console true true $(SolutionDir)/src-ffmpeg/lib64;%(AdditionalLibraryDirectories) NotUsing NotUsing NotUsing NotUsing NotUsing NotUsing NotUsing NotUsing NotUsing NotUsing NotUsing NotUsing NotUsing NotUsing NotUsing NotUsing false contextfree-3.0.5+dfsg1.orig/.hg_archival.txt0000644000175000017500000000023612076364074017530 0ustar brambramrepo: 344a7ad237afa6daa1ae2e1716cf246dc8f3abbe node: c703bb5fa62f667c98c871b452030dbf2604ca63 branch: default latesttag: Version3.0.4_2 latesttagdistance: 27 contextfree-3.0.5+dfsg1.orig/ContextFreeCLIVS11.sln0000644000175000017500000000376012076364074020356 0ustar brambram Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ContextFreeCLI", "ContextFreeCLIVS11.vcxproj", "{86A42375-C631-493B-8785-DE489713E3A5}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Debug64|Win32 = Debug64|Win32 Debug64|x64 = Debug64|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 Release64|Win32 = Release64|Win32 Release64|x64 = Release64|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {86A42375-C631-493B-8785-DE489713E3A5}.Debug|Win32.ActiveCfg = Debug|Win32 {86A42375-C631-493B-8785-DE489713E3A5}.Debug|Win32.Build.0 = Debug|Win32 {86A42375-C631-493B-8785-DE489713E3A5}.Debug|x64.ActiveCfg = Debug|x64 {86A42375-C631-493B-8785-DE489713E3A5}.Debug|x64.Build.0 = Debug|x64 {86A42375-C631-493B-8785-DE489713E3A5}.Debug64|Win32.ActiveCfg = Debug64|Win32 {86A42375-C631-493B-8785-DE489713E3A5}.Debug64|Win32.Build.0 = Debug64|Win32 {86A42375-C631-493B-8785-DE489713E3A5}.Debug64|x64.ActiveCfg = Debug64|x64 {86A42375-C631-493B-8785-DE489713E3A5}.Debug64|x64.Build.0 = Debug64|x64 {86A42375-C631-493B-8785-DE489713E3A5}.Release|Win32.ActiveCfg = Release|Win32 {86A42375-C631-493B-8785-DE489713E3A5}.Release|Win32.Build.0 = Release|Win32 {86A42375-C631-493B-8785-DE489713E3A5}.Release|x64.ActiveCfg = Release|x64 {86A42375-C631-493B-8785-DE489713E3A5}.Release|x64.Build.0 = Release|x64 {86A42375-C631-493B-8785-DE489713E3A5}.Release64|Win32.ActiveCfg = Release64|Win32 {86A42375-C631-493B-8785-DE489713E3A5}.Release64|Win32.Build.0 = Release64|Win32 {86A42375-C631-493B-8785-DE489713E3A5}.Release64|x64.ActiveCfg = Release64|x64 {86A42375-C631-493B-8785-DE489713E3A5}.Release64|x64.Build.0 = Release64|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal contextfree-3.0.5+dfsg1.orig/ContextFreeCLI.vcxprojVS11.filters0000644000175000017500000003141712076364074022724 0ustar brambram {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files contextfree-3.0.5+dfsg1.orig/src-common/0000755000175000017500000000000012245646004016510 5ustar brambramcontextfree-3.0.5+dfsg1.orig/src-common/pathIterator.h0000644000175000017500000000552012076364074021337 0ustar brambram// pathIterator.cpp // this file is part of Context Free // --------------------- // Copyright (C) 2011 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #ifndef INCLUDE_PATHITERATOR_H #define INCLUDE_PATHITERATOR_H #include "agg_bounding_rect.h" #include "agg_rasterizer_scanline_aa.h" #include "agg_conv_stroke.h" #include "agg_conv_curve.h" #include "agg_trans_affine.h" #include "agg_path_storage.h" #include "agg_conv_centroid.h" namespace AST { struct CommandInfo; } class pathIterator { public: typedef agg::conv_curve CurvedPath; typedef agg::conv_stroke CurvedStroked; typedef agg::conv_transform CurvedStrokedTrans; typedef agg::conv_transform CurvedTrans; typedef agg::conv_stroke CurvedTransStroked; typedef agg::conv_centroid CurvedTransCentroid; typedef agg::conv_centroid CurvedStrokedTransCentroid; typedef agg::conv_centroid CurvedTransStrokedCentroid; agg::trans_affine unitTrans; CurvedPath curved; CurvedStroked curvedStroked; CurvedStrokedTrans curvedStrokedTrans; CurvedTrans curvedTrans; CurvedTransStroked curvedTransStroked; CurvedTransCentroid curvedTransCentroid; CurvedStrokedTransCentroid curvedStrokedTransCentroid; CurvedTransStrokedCentroid curvedTransStrokedCentroid; pathIterator(); ~pathIterator() {} void apply(const AST::CommandInfo& attr, const agg::trans_affine& tr, double accuracy); template void addPath(Rasterizer& ras, const agg::trans_affine& tr, const AST::CommandInfo& attr); bool boundingRect(const agg::trans_affine& tr, const AST::CommandInfo& attr, double& minx, double& miny, double& maxx, double& maxy, double scale, agg::point_d* cent = NULL, double* area = NULL); }; #endif contextfree-3.0.5+dfsg1.orig/src-common/cfdg.cpp0000644000175000017500000001420612076364074020130 0ustar brambram/* * Context Free Design Grammar - version 0.2 Copyright (C) 2005 Chris Coyne - ccoyne77@gmail.com Copyright (C) 2005-2008 Mark Lentczner - markl@glyphic.com Copyright (C) 2005-2013 John Horigan - john@glyphic.com [Send me anything cool you make with it or of it.] This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "cfdg.h" #include #include "builder.h" #include "cfdgimpl.h" #include #include #include "astexpression.h" #include "scanner.h" #include "cfdg.tab.hpp" #include #include "tiledCanvas.h" using namespace std; yy::location CfdgError::Default; double Renderer::Infinity = numeric_limits::infinity(); // Ignore the gcc warning bool Renderer::AbortEverything = false; CfdgError::CfdgError(const yy::location& loc, const char* msg) : what(msg), where(loc) { where.begin.column -= Default.begin.column; where.end.column -= Default.end.column; } CfdgError::CfdgError(const char* msg) : what(msg), where(Default) { where.begin.column = 0; where.end.column = 0; } void CfdgError::Error(const yy::location& errLoc, const char* msg) { if (Builder::CurrentBuilder) Builder::CurrentBuilder->error(errLoc, msg); else throw CfdgError(errLoc, msg); } void CfdgError::Warning(const yy::location& errLoc, const char* msg) { if (Builder::CurrentBuilder) Builder::CurrentBuilder->warning(errLoc, msg); } AbstractSystem::~AbstractSystem() { } void AbstractSystem::stats(const Stats&) { } Canvas::~Canvas() { } Renderer::~Renderer() { delete mCurrentPath; delete m_tiledCanvas; } CFDG::~CFDG() { } CFDG* CFDG::ParseFile(const char* fname, AbstractSystem* system, int variation) { CFDGImpl* pCfdg = NULL; for (int version = 2; version <= 4; ++version) { if (pCfdg == NULL) pCfdg = new CFDGImpl(system); Builder b(pCfdg, variation); yy::Scanner lexer; b.lexer = &lexer; lexer.driver = &b; lexer.startToken = version == 2 ? yy::CfdgParser::token::CFDG2 : yy::CfdgParser::token::CFDG3; b.mCompilePhase = version < 4 ? 1 : 2; b.mWant2ndPass = version == 3; yy::CfdgParser parser(b); istream* input = system->openFileForRead(fname); if (!input || !input->good()) { delete input; input = 0; system->error(); system->message("Couldn't open rules file %s", fname); return 0; } pCfdg->fileNames.push_back(fname); b.m_currentPath = &(pCfdg->fileNames.back()); b.m_basePath = b.m_currentPath; b.m_filesToLoad.push(b.m_currentPath); b.m_streamsToLoad.push(input); b.m_includeNamespace.push(false); if (version == 2) system->message("Reading rules file %s", fname); lexer.yyrestart(input); //parser.set_debug_level(1); int yyresult = 0; try { yyresult = parser.parse(); } catch (CfdgError err) { system->syntaxError(err); return 0; } if (b.mErrorOccured) return 0; if (yyresult == 0) { pCfdg->rulesLoaded(); if (b.mErrorOccured) return 0; if (b.mWant2ndPass) { pCfdg = new CFDGImpl(pCfdg); system->message("Compiling 2nd phase"); continue; } b.m_CFDG = 0; break; } if (lexer.maybeVersion == 0 || lexer.maybeVersion == (version == 2 ? yy::CfdgParser::token::CFDG2 : yy::CfdgParser::token::CFDG3)) return 0; system->message("Restarting as a version 3 design"); pCfdg = NULL; } system->message("%d rules loaded", pCfdg->numRules()); return pCfdg; } void Renderer::init() { mLastPoint.x = mLastPoint.y = 0.0; mStop = false; mClosed = false; mWantMoveTo = true; mWantCommand = true; mIndex = mNextIndex = 0; } bool Renderer::isNatural(Renderer* r, double n) { return n >= 0 && n <= (r ? r->mMaxNatural : Builder::MaxNatural) && n == floor(n); } void Renderer::ColorConflict(Renderer* r, const yy::location& w) { if (r) r->colorConflict(w); else CfdgError::Warning(w, "Conflicting color change"); } void Renderer::initStack(const StackType* p) { if (p && p->ruleHeader.mParamCount) { for (unsigned i = 0; i < p->ruleHeader.mParamCount; ++i) mCFstack.push_back(p[i + 2]); } if (!mCFstack.empty()) { mLogicalStackTop = &(mCFstack.back()) + 1; } else { mLogicalStackTop = NULL; } } void Renderer::unwindStack(size_t oldsize, const std::vector& params) { if (oldsize == mCFstack.size()) return; StackType* pos = &(mCFstack[oldsize]); for (std::vector::const_iterator it = params.begin(), p_end = params.end(); it != p_end; ++it) { if (it->isLoopIndex) continue; // loop indices are unwound in ASTloop::traverse() if (it->mType == AST::ASTexpression::RuleType) pos->rule->release(); pos += it->mTuplesize; if (pos > &(mCFstack.back())) break; // no guarantee entire frame was computed } mCFstack.resize(oldsize, mCFstack.back()); if (oldsize) mLogicalStackTop = &(mCFstack[0]) + oldsize; else mLogicalStackTop = NULL; } contextfree-3.0.5+dfsg1.orig/src-common/astreplacement.cpp0000644000175000017500000013124212076364074022234 0ustar brambram// astreplacement.cpp // this file is part of Context Free // --------------------- // Copyright (C) 2009-2013 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #include "astreplacement.h" #include "agg_basics.h" #include "pathIterator.h" #include #ifdef _MSC_VER #include #pragma intrinsic(_InterlockedCompareExchange64) #endif namespace AST { const char* ASTpathOp::PathOpNames[9] = { "MOVETO", "MOVEREL", "LINETO", "LINEREL", "ARCTO", "ARCREL", "CURVETO", "CURVEREL", "CLOSEPOLY" }; CommandInfo::UIDtype ASTcompiledPath::GlobalPathUID = 1; static const ASTparameter zeroParam; const ASTrule* ASTrule::PrimitivePaths[primShape::numTypes] = { 0 }; agg::trans_affine ASTtransform::Dummy; void ASTrepContainer::addParameter(const std::string& type, int index, const yy::location& typeLoc, const yy::location& nameLoc) { mParameters.push_back(zeroParam); mParameters.back().mLocation = typeLoc + nameLoc; mParameters.back().init(type, index); mParameters.back().isParameter = true; mParameters.back().check(typeLoc, nameLoc); } ASTparameter& ASTrepContainer::addParameter(int index, ASTdefine* def, const yy::location& nameLoc, const yy::location& expLoc) { mParameters.push_back(zeroParam); ASTparameter& b = mParameters.back(); b.mLocation = nameLoc + expLoc; b.init(index, def); b.check(nameLoc, nameLoc); return b; } void ASTrepContainer::move(ASTrepContainer& to) { to.mPathOp = mPathOp; to.mRepType = mRepType; mBody.swap(to.mBody); mParameters.swap(to.mParameters); to.isGlobal = isGlobal; to.mStackCount = mStackCount; } ASTreplacement::ASTreplacement(ASTruleSpecifier& shapeSpec, const std::string& name, mod_ptr mods, const yy::location& loc, repElemListEnum t) : mShapeSpec(shapeSpec), mRepType(t), mPathOp(unknownPathop), mChildChange(mods, loc), mLocation(loc) { mChildChange.addEntropy(name); } ASTreplacement::ASTreplacement(ASTruleSpecifier& shapeSpec, mod_ptr mods, const yy::location& loc, repElemListEnum t) : mShapeSpec(shapeSpec), mRepType(t), mPathOp(unknownPathop), mChildChange(mods, loc), mLocation(loc) { } ASTloop::ASTloop(int nameIndex, const std::string& name, const yy::location& nameLoc, exp_ptr args, const yy::location& argsLoc, mod_ptr mods) : ASTreplacement(ASTruleSpecifier::Zero, mods, nameLoc + argsLoc, empty), mLoopArgs(NULL) { std::string ent(name); args->entropy(ent); mChildChange.addEntropy(ent); bool bodyNatural = false; bool finallyNatural = false; bool local = args->isLocal; if (args->isConstant) { setupLoop(mLoopData[0], mLoopData[1], mLoopData[2], args.get(), argsLoc); bodyNatural = mLoopData[0] == floor(mLoopData[0]) && mLoopData[1] == floor(mLoopData[1]) && mLoopData[2] == floor(mLoopData[2]) && mLoopData[0] >= 0.0 && mLoopData[1] >= 0.0 && mLoopData[0] < 9007199254740992. && mLoopData[1] < 9007199254740992.; finallyNatural = bodyNatural && mLoopData[1] + mLoopData[2] >= -1.0 && mLoopData[1] + mLoopData[2] < 9007199254740992.; } else { int c = args->evaluate(0, 0); if (c < 1 || c > 3) { CfdgError::Error(argsLoc, "A loop must have one to three index parameters."); } mLoopArgs = args.release()->simplify(); for (int i = 0, count = 0; i < mLoopArgs->size(); ++i) { int num = (*mLoopArgs)[i]->evaluate(0, 0); switch (count) { case 0: if ((*mLoopArgs)[i]->isNatural) bodyNatural = finallyNatural = true; break; case 2: { // Special case: if 1st & 2nd args are natural and 3rd // is -1 then that is ok double step; if ((*mLoopArgs)[i]->isConstant && (*mLoopArgs)[i]->evaluate(&step, 1) == 1 && step == -1.0) { break; } } // else fall through case 1: if (!((*mLoopArgs)[i]->isNatural)) bodyNatural = finallyNatural = false; break; default: break; } count += num; } } ASTexpression loopVar(nameLoc, false, bodyNatural, ASTexpression::NumericType); ASTdefine loopDef(name, exp_ptr(&loopVar), nameLoc); ASTparameter& bodyParam = mLoopBody.addParameter(nameIndex, &loopDef, nameLoc, nameLoc); bodyParam.isLoopIndex = true; bodyParam.isNatural = bodyNatural; bodyParam.isLocal = local; ASTparameter& finallyParam = mFinallyBody.addParameter(nameIndex, &loopDef, nameLoc, nameLoc); finallyParam.isLoopIndex = true; finallyParam.isNatural = finallyNatural; finallyParam.isLocal = local; loopDef.mExpression = 0; } ASTtransform::ASTtransform(const yy::location& loc, exp_ptr mods) : ASTreplacement(ASTruleSpecifier::Zero, mod_ptr(), loc, empty), mTransforms(), mModifications(getTransforms(mods.get(), mTransforms, NULL, false, Dummy)), mExpHolder(mods.release()), mClone(false) { } ASTdefine::ASTdefine(const std::string& name, exp_ptr e, const yy::location& loc) : ASTreplacement(ASTruleSpecifier::Zero, mod_ptr(), loc, empty), mType(e->mType), isConstant(e->isConstant), mStackCount(0), mName(name), isFunction(false) { if (mType != ASTexpression::NumericType && mType != ASTexpression::ModType && mType != ASTexpression::RuleType) CfdgError::Error(e->where, "Unsupported expression type"); mTuplesize = e->mType == ASTexpression::NumericType ? e->evaluate(0, 0) : 1; mExpression = e.release()->simplify(); // Set the Modification entropy to parameter name, not its own contents int i = 0; mChildChange.modData.mRand64Seed.init(); mChildChange.modData.mRand64Seed.xorString(name.c_str(), i); } ASTdefine::ASTdefine(const std::string& name, mod_ptr e, const yy::location& loc) : ASTreplacement(ASTruleSpecifier::Zero, e, loc, empty), mExpression(0), mTuplesize(ModificationSize), mType(ASTexpression::ModType), isConstant(mChildChange.modExp.empty()), mStackCount(0), mName(name), isFunction(false) { // Set the Modification entropy to parameter name, not its own contents int i = 0; mChildChange.modData.mRand64Seed.init(); mChildChange.modData.mRand64Seed.xorString(name.c_str(), i); } void ASTloop::setupLoop(double& start, double& end, double& step, ASTexpression* e, const yy::location& loc, Renderer* rti) { double data[3]; switch (e->evaluate(data, 3, rti)) { case 1: data[1] = data[0]; data[0] = 0.0; case 2: data[2] = 1.0; case 3: break; default: CfdgError::Error(loc, "A loop must have one to three index parameters."); break; } start = data[0]; end = data[1]; step = data[2]; } ASTif::ASTif(exp_ptr ifCond, const yy::location& condLoc) : ASTreplacement(ASTruleSpecifier::Zero, mod_ptr(), condLoc, empty), mCondition(ifCond.release()->simplify()) { if (mCondition->mType != ASTexpression::NumericType || mCondition->evaluate(0, 0) != 1) CfdgError::Error(mCondition->where, "If condition must be a numeric scalar"); } ASTswitch::ASTswitch(exp_ptr switchExp, const yy::location& expLoc) : ASTreplacement(ASTruleSpecifier::Zero, mod_ptr(), expLoc, empty), mSwitchExp(switchExp.release()->simplify()) { if (mSwitchExp->mType != ASTexpression::NumericType || mSwitchExp->evaluate(0, 0) != 1) CfdgError::Error(mSwitchExp->where, "Switch selector must be a numeric scalar"); } void ASTswitch::unify() { if (mElseBody.mPathOp != mPathOp) mPathOp = unknownPathop; for (switchMap::iterator it = mCaseStatements.begin(); it != mCaseStatements.end(); ++it) { if ((*it).second->mPathOp != mPathOp) mPathOp = unknownPathop; } } ASTrepContainer::~ASTrepContainer() { for (ASTbody::iterator it = mBody.begin(); it != mBody.end(); ++it) delete *it; mBody.clear(); } ASTcompiledPath::ASTcompiledPath() : mComplete(false), mUseTerminal(false), mParameters(NULL) { mPathUID = NextPathUID(); } ASTpathOp::ASTpathOp(const std::string& s, exp_ptr a, const yy::location& loc) : ASTreplacement(ASTruleSpecifier::Zero, mod_ptr(), loc, op), mArguments(0), mFlags(0), mArgCount(0) { for (int i = MOVETO; i <= CLOSEPOLY; ++i) { if (!(s.compare(PathOpNames[i]))) { mPathOp = (pathOpEnum)i; break; } } if (mPathOp == unknownPathop) { CfdgError::Error(loc, "Unknown path operation type"); } checkArguments(a); pathDataConst(); } ASTpathOp::ASTpathOp(const std::string& s, mod_ptr a, const yy::location& loc) : ASTreplacement(ASTruleSpecifier::Zero, mod_ptr(), loc, op), mArguments(0), mFlags(0), mArgCount(0) { for (int i = MOVETO; i <= CLOSEPOLY; ++i) { if (!(s.compare(PathOpNames[i]))) { mPathOp = (pathOpEnum)i; break; } } if (mPathOp == unknownPathop) { CfdgError::Error(loc, "Unknown path operation type"); } makePositional(a); pathDataConst(); } ASTpathCommand::ASTpathCommand(const std::string& s, mod_ptr mods, const yy::location& loc) : ASTreplacement(ASTruleSpecifier::Zero, mods, loc, command), mMiterLimit(4.0) { mChildChange.addEntropy(s); if (!(s.compare("FILL"))) { mChildChange.flags |= CF_FILL; } else if (!s.compare("STROKE")) { mChildChange.flags &= ~CF_FILL; } else { CfdgError::Error(loc, "Unknown path command/operation"); } check4z(); } ASTpathCommand::ASTpathCommand(const std::string& s, mod_ptr mods, exp_ptr params, const yy::location& loc) : ASTreplacement(ASTruleSpecifier::Zero, mods, loc, command), mMiterLimit(4.0) { mChildChange.addEntropy(s); if (!(s.compare("FILL"))) { mChildChange.flags |= CF_FILL; } else if (!s.compare("STROKE")) { mChildChange.flags &= ~CF_FILL; } else { CfdgError::Error(loc, "Unknown path command/operation"); } check4z(); if (params.get() == NULL) return; exp_ptr stroke, flags; switch (params->size()) { case 2: stroke.reset((*params)[0]); flags.reset((*params)[1]); if (!params->release()) { CfdgError::Error(params->where, "Path commands can have zero, one, or two parameters"); stroke.release(); flags.release(); return; } break; case 1: switch (params->mType) { case ASTexpression::NumericType: stroke = params; break; case ASTexpression::FlagType: flags = params; break; default: CfdgError::Error(params->where, "Bad expression type in path command parameters"); break; } break; case 0: return; default: CfdgError::Error(params->where, "Path commands can have zero, one, or two parameters"); return; } if (stroke.get()) { if (mChildChange.flags & CF_FILL) CfdgError::Warning(stroke->where, "Stroke width only useful for STROKE commands"); if (stroke->mType != ASTexpression::NumericType || stroke->evaluate(0, 0) != 1) { CfdgError::Error(stroke->where, "Stroke width expression must be numeric scalar"); } else if (!stroke->isConstant || stroke->evaluate(&(mChildChange.strokeWidth), 1) != 1) { ASTmodTerm* w = new ASTmodTerm(ASTmodTerm::stroke, stroke.release()->simplify(), loc); mChildChange.modExp.push_back(w); } } if (flags.get()) { if (flags->mType != ASTexpression::FlagType) { CfdgError::Error(flags->where, "Unexpected argument in path command"); return; } flags.reset(flags.release()->simplify()); if (ASTreal* r = dynamic_cast (flags.get())) { int f = (int)(r->value); if (f & CF_JOIN_PRESENT) mChildChange.flags &= ~CF_JOIN_MASK; if (f & CF_CAP_PRESENT) mChildChange.flags &= ~CF_CAP_MASK; mChildChange.flags |= f; if ((mChildChange.flags & CF_FILL) && (f & (CF_JOIN_PRESENT | CF_CAP_PRESENT))) CfdgError::Warning(flags->where, "Stroke flags only useful for STROKE commands"); } else { CfdgError::Error(flags->where, "Flag expressions must be constant"); } } } ASTreplacement::~ASTreplacement() { } ASTloop::~ASTloop() { delete mLoopArgs; } ASTif::~ASTif() { delete mCondition; } ASTswitch::~ASTswitch() { delete mSwitchExp; for (switchMap::iterator it = mCaseStatements.begin(); it != mCaseStatements.end(); ++it) { delete (*it).second; } mCaseStatements.clear(); } ASTrule::~ASTrule() { delete mCachedPath; mCachedPath = 0; } ASTtransform::~ASTtransform() { ASTexpression* m = const_cast(mModifications); if (m && m->release()) delete mModifications; delete mExpHolder; } ASTpathOp::~ASTpathOp() { delete mArguments; } void ASTreplacement::replaceShape(Shape& s, Renderer* r) const { if (mShapeSpec.argSource == ASTruleSpecifier::NoArgs) { s.mShapeType = mShapeSpec.shapeType; s.mParameters = NULL; } else { s.mParameters = mShapeSpec.evalArgs(r, s.mParameters); if (mShapeSpec.argSource == ASTruleSpecifier::SimpleParentArgs) s.mShapeType = mShapeSpec.shapeType; else s.mShapeType = s.mParameters->ruleHeader.mRuleName; if (s.mParameters->ruleHeader.mParamCount == 0) s.mParameters = NULL; } } void ASTreplacement::replace(Shape& s, Renderer* r, double* width) const { int dummy; replaceShape(s, r); r->mCurrentSeed ^= mChildChange.modData.mRand64Seed; r->mCurrentSeed.bump(); mChildChange.evaluate(s.mWorldState, 0, width, false, dummy, true, r); s.mAreaCache = s.mWorldState.area(); } void ASTreplacement::traverse(const Shape& parent, bool tr, Renderer* r) const { Shape child = parent; switch (mRepType) { case replacement: replace(child, r); child.mWorldState.mRand64Seed = r->mCurrentSeed; child.mWorldState.mRand64Seed.bump(); r->processShape(child); break; case op: if (!tr) child.mWorldState.m_transform.reset(); case mixed: case command: replace(child, r); r->processSubpath(child, tr || (mRepType == op), mRepType); break; default: throw CfdgError("Subpaths must be all path operation or all path command"); } } void ASTloop::traverse(const Shape& parent, bool tr, Renderer* r) const { Shape loopChild = parent; bool opsOnly = (mLoopBody.mRepType | mFinallyBody.mRepType) == op; if (opsOnly && !tr) loopChild.mWorldState.m_transform.reset(); double start, end, step; r->mCurrentSeed ^= mChildChange.modData.mRand64Seed; if (mLoopArgs) { setupLoop(start, end, step, mLoopArgs, mLocation, r); } else { start = mLoopData[0]; end = mLoopData[1]; step = mLoopData[2]; } int dummy; StackType t = {start}; const StackType* oldTop = r->mLogicalStackTop; r->mCFstack.push_back(t); StackType& index = r->mCFstack.back(); r->mLogicalStackTop = &index + 1; for (;;) { if (r->requestStop || Renderer::AbortEverything) throw CfdgError(mLocation, "Stopping"); if (step > 0.0) { if (index.number >= end) break; } else { if (index.number <= end) break; } mLoopBody.traverse(loopChild, tr || opsOnly, r); mChildChange.evaluate(loopChild.mWorldState, 0, 0, false, dummy, true, r); index.number += step; } mFinallyBody.traverse(loopChild, tr || opsOnly, r); r->mCFstack.pop_back(); r->mLogicalStackTop = oldTop; } void ASTtransform::traverse(const Shape& parent, bool tr, Renderer* r) const { Rand64 cloneSeed = r->mCurrentSeed; Shape transChild = parent; bool opsOnly = mBody.mRepType == op; if (opsOnly && !tr) transChild.mWorldState.m_transform.reset(); int dummy; int modsLength = mModifications ? mModifications->size() : 0; int totalLength = modsLength + mTransforms.size(); for(int i = 0; i < totalLength; ++i) { Shape child = transChild; if (i < modsLength) { if (const ASTmodification* m = dynamic_cast((*mModifications)[i])) { r->mCurrentSeed ^= m->modData.mRand64Seed; m->evaluate(child.mWorldState, 0, 0, false, dummy, true, r); } else { continue; } } else { child.mWorldState.m_transform.premultiply(mTransforms[i - modsLength]); } r->mCurrentSeed.bump(); // Specialized mBody.traverse() with cloning behavior size_t s = r->mCFstack.size(); for (AST::ASTbody::const_iterator bit = mBody.mBody.begin(), ebit = mBody.mBody.end(); bit != ebit; ++bit) { if (mClone) r->mCurrentSeed = cloneSeed; (*bit)->traverse(child, opsOnly || tr, r); } r->unwindStack(s, mBody.mParameters); } } void ASTif::traverse(const Shape& parent, bool tr, Renderer* r) const { double cond = 0.0; if (mCondition->evaluate(&cond, 1, r) != 1) { CfdgError::Error(mLocation, "Error evaluating if condition"); return; } if (cond) mThenBody.traverse(parent, tr, r); else mElseBody.traverse(parent, tr, r); } void ASTswitch::traverse(const Shape& parent, bool tr, Renderer* r) const { double caseValue = 0.0; if (mSwitchExp->evaluate(&caseValue, 1, r) != 1) { CfdgError::Error(mLocation, "Error evaluating switch selector"); return; } switchMap::const_iterator it = mCaseStatements.find((int)floor(caseValue)); if (it != mCaseStatements.end()) (*it).second->traverse(parent, tr, r); else mElseBody.traverse(parent, tr, r); } void ASTdefine::traverse(const Shape& p, bool, Renderer* r) const { static const StackType zero = {0.0}; int s = (int)r->mCFstack.size(); r->mCFstack.resize(s + mTuplesize, zero); r->mCurrentSeed ^= mChildChange.modData.mRand64Seed; StackType* dest = &(r->mCFstack[s]); switch (mType) { case ASTexpression::NumericType: if (mExpression->evaluate(&dest->number, mTuplesize, r) != mTuplesize) CfdgError::Error(mExpression->where, "Error evaluating parameters (too many or not enough)."); break; case ASTexpression::ModType: { int dummy; Modification* smod = reinterpret_cast (dest); mChildChange.setVal(*smod, 0, 0, false, dummy, r); break; } case ASTexpression::RuleType: dest->rule = mExpression->evalArgs(r, p.mParameters); break; default: CfdgError::Error(mExpression->where, "Unimplemented parameter type."); break; } if (!(r->mCFstack.empty())) r->mLogicalStackTop = &(r->mCFstack.back()) + 1; } void ASTrule::traverse(const Shape& parent, bool tr, Renderer* r) const { r->mCurrentSeed = parent.mWorldState.mRand64Seed; if (isPath) { r->processPrimShape(parent, this); } else { mRuleBody.traverse(parent, tr, r, true); parent.releaseParams(); } } void ASTshape::traverse(const Shape&, bool, Renderer*) const { CfdgError::Error(mLocation, "Tried to traverse ASTshape."); } void ASTpathOp::traverse(const Shape& s, bool tr, Renderer* r) const { if (r->mCurrentPath->mComplete) return; double opData[6]; pathData(opData, r); r->mCurrentPath->addPathOp(this, opData, s, tr, r); } void ASTpathCommand::traverse(const Shape& s, bool, Renderer* r) const { Shape child = s; double width = mChildChange.strokeWidth; replace(child, r, &width); CommandInfo* info = NULL; if (r->mCurrentPath->mComplete) { if (r->mCurrentCommand == r->mCurrentPath->mCommandInfo.end()) CfdgError::Error(mLocation, "Not enough path commands in cache"); info = &(*(r->mCurrentCommand++)); } else { if (r->mCurrentPath->mPath.total_vertices() == 0) CfdgError::Error(mLocation, "Path commands must be preceeded by at least one path operation"); r->mWantCommand = false; r->mCurrentPath->finish(false, r); mInfoCache.tryInit(r->mIndex, r->mCurrentPath, width, this); if (mInfoCache.mPathUID == r->mCurrentPath->mPathUID && mInfoCache.mIndex == r->mIndex) { r->mCurrentPath->mCommandInfo.push_back(mInfoCache); } else { CommandInfo newCmd(r->mIndex, r->mCurrentPath, width, this); r->mCurrentPath->mCommandInfo.push_back(newCmd); } info = &(r->mCurrentPath->mCommandInfo.back()); } r->processPathCommand(child, info); } void ASTrule::traversePath(const Shape& parent, Renderer* r) const { r->init(); r->mCurrentSeed = parent.mWorldState.mRand64Seed; r->mRandUsed = false; ASTcompiledPath* savedPath = NULL; if (mCachedPath && StackRule::Equal(mCachedPath->mParameters, parent.mParameters)) { savedPath = r->mCurrentPath; r->mCurrentPath = mCachedPath; r->mCurrentCommand = mCachedPath->mCommandInfo.begin(); } mRuleBody.traverse(parent, false, r, true); if (!r->mCurrentPath->mComplete) r->mCurrentPath->finish(true, r); if (r->mCurrentPath->mUseTerminal) r->mCurrentPath->mTerminalCommand.traverse(parent, false, r); if (savedPath) { r->mCurrentPath = savedPath; } else { if (!(r->mRandUsed) && mCachedPath == NULL) { mCachedPath = r->mCurrentPath; mCachedPath->mComplete = true; if (parent.mParameters) mCachedPath->mParameters = &(parent.mParameters->ruleHeader); r->mCurrentPath = new ASTcompiledPath(); } else { r->mCurrentPath->mPath.remove_all(); r->mCurrentPath->mCommandInfo.clear(); r->mCurrentPath->mUseTerminal = false; r->mCurrentPath->mPathUID = ASTcompiledPath::NextPathUID(); } } } void ASTcompiledPath::addPathOp(const ASTpathOp* pop, double data[6], const Shape& s, bool tr, Renderer* r) { // Process the parameters for ARCTO/ARCREL double radius_x = 0.0, radius_y = 0.0, angle = 0.0; bool sweep = (pop->mFlags & CF_ARC_CW) == 0; bool largeArc = (pop->mFlags & CF_ARC_LARGE) != 0; if (pop->mPathOp == ARCTO || pop->mPathOp == ARCREL) { if (pop->mArgCount == 5) { // If the radii are specified then use the ellipse ARCxx form radius_x = data[2]; radius_y = data[3]; angle = data[4] * 0.0174532925199; } else { // Otherwise use the circle ARCxx form radius_x = radius_y = data[2]; angle = 0.0; } if (radius_x < 0.0 || radius_y < 0.0) { radius_x = fabs(radius_x); radius_y = fabs(radius_y); sweep = !sweep; } } else if (tr) { s.mWorldState.m_transform.transform(data + 0, data + 1); s.mWorldState.m_transform.transform(data + 2, data + 3); s.mWorldState.m_transform.transform(data + 4, data + 5); } // If this is the first path operation following a path command then set the // path index used by subsequent path commands to the path sequence that the // current path operation is part of. // If this is not the first path operation following a path command then this // line does nothing. r->mIndex = r->mNextIndex; // If the op is anything other than a CLOSEPOLY then we are opening up a // new path sequence. r->mClosed = false; r->mStop = false; // This new path op needs to be covered by a command, either from the cfdg // file or default. r->mWantCommand = true; if (pop->mPathOp == CLOSEPOLY) { if (mPath.total_vertices() > 1 && agg::is_drawing(mPath.vertices().last_command())) { // Find the MOVETO/MOVEREL that is the start of the current path sequence // and reset LastPoint to that. unsigned last = mPath.total_vertices() - 1; unsigned cmd = agg::path_cmd_stop; for (unsigned i = last - 1; i < last && agg::is_vertex(cmd = mPath.command(i)); --i) { if (agg::is_move_to(cmd)) { mPath.vertex(i, &(r->mLastPoint.x), &(r->mLastPoint.y)); break; } } if (!agg::is_move_to(cmd)) CfdgError::Error(pop->mLocation, "CLOSEPOLY: Unable to find a MOVETO/MOVEREL for start of path."); // If this is an aligning CLOSEPOLY then change the last vertex to // exactly match the first vertex in the path sequence if (pop->mFlags & CF_ALIGN) { mPath.modify_vertex(last, r->mLastPoint.x, r->mLastPoint.y); } } else if (pop->mFlags & CF_ALIGN) { CfdgError::Error(pop->mLocation, "Nothing to align to."); } mPath.close_polygon(); r->mClosed = true; r->mWantMoveTo = true; return; } // Insert an implicit MOVETO unless the pathOp is a MOVETO/MOVEREL if (r->mWantMoveTo && pop->mPathOp > MOVEREL) { r->mWantMoveTo = false; mPath.move_to(r->mLastPoint.x, r->mLastPoint.y); } switch (pop->mPathOp) { case MOVEREL: mPath.rel_to_abs(data + 0, data + 1); case MOVETO: mPath.move_to(data[0], data[1]); r->mWantMoveTo = false; break; case LINEREL: mPath.rel_to_abs(data + 0, data + 1); case LINETO: mPath.line_to(data[0], data[1]); break; case ARCREL: mPath.rel_to_abs(data + 0, data + 1); case ARCTO: { if (!agg::is_vertex(mPath.last_vertex(data + 2, data + 3)) || (tr && s.mWorldState.m_transform.determinant() < 1e-10)) { break; } // Transforming an arc as they are parameterized by AGG is VERY HARD. // So instead we insert the arc and then transform the bezier curves // that are used to approximate the arc. But first we have to inverse // transform the starting point to match the untransformed arc. // Afterwards the starting point is restored to its original value. if (tr) { unsigned start = mPath.total_vertices() - 1; agg::trans_affine inverseTr = ~s.mWorldState.m_transform; mPath.transform(inverseTr, start); mPath.arc_to(radius_x, radius_y, angle, largeArc, sweep, data[0], data[1]); mPath.modify_vertex(start, data[2], data[3]); mPath.transform(s.mWorldState.m_transform, start + 1); } else { mPath.arc_to(radius_x, radius_y, angle, largeArc, sweep, data[0], data[1]); } break; } case CURVEREL: mPath.rel_to_abs(data + 0, data + 1); mPath.rel_to_abs(data + 2, data + 3); mPath.rel_to_abs(data + 4, data + 5); case CURVETO: if ((pop->mFlags & CF_CONTINUOUS) && !agg::is_curve(mPath.last_vertex(data + 4, data + 5))) { CfdgError::Error(pop->mLocation, "Smooth curve operations must be preceded by another curve operation."); break; } switch (pop->mArgCount) { case 2: mPath.curve3(data[0], data[1]); break; case 4: if (pop->mFlags & CF_CONTINUOUS) mPath.curve4(data[2], data[3], data[0], data[1]); else mPath.curve3(data[2], data[3], data[0], data[1]); break; case 6: mPath.curve4(data[2], data[3], data[4], data[5], data[0], data[1]); break; default: break; } break; default: break; } mPath.last_vertex(&(r->mLastPoint.x), &(r->mLastPoint.y)); } void ASTcompiledPath::finish(bool setAttr, Renderer* r) { // Close and end the last path sequence if it wasn't already closed and ended if (!r->mClosed) { mPath.end_poly(0); r->mClosed = true; } if (!r->mStop) { mPath.start_new_path(); r->mStop = true; } r->mWantMoveTo = true; r->mNextIndex = mPath.total_vertices(); // If setAttr is true then make sure that the last path sequence has a path // attribute associated with it. if (setAttr && r->mWantCommand) { mUseTerminal = true; r->mWantCommand = false; } } CommandInfo::UIDtype ASTcompiledPath::NextPathUID() { #ifdef _MSC_VER do { __int64 from = (__int64)GlobalPathUID; __int64 next = from + 1; if (_InterlockedCompareExchange64((__int64*)(&GlobalPathUID), next, from) == from) return (uint64_t)next; } while (true); #else return __sync_fetch_and_add(&GlobalPathUID, (CommandInfo::UIDtype)1); #endif } bool ASTrule::compareLT(const ASTrule* a, const ASTrule* b) { return (a->mNameIndex == b->mNameIndex) ? (a->mWeight < b->mWeight) : (a->mNameIndex < b->mNameIndex); } void ASTpathOp::pathData(double* data, Renderer* rti) const { if (mArguments) { if (mArguments->evaluate(data, 7, rti) < 0) CfdgError::Error(mArguments->where, "Cannot evaluate arguments"); } else { const double* cdata = reinterpret_cast (&mChildChange); for (int i = 0; i < mArgCount; ++i) data[i] = cdata[i]; } } void ASTpathOp::pathDataConst() { if (mArguments && mArguments->isConstant) { double* data = reinterpret_cast (&mChildChange); if (mArguments->evaluate(data, 7) < 0) CfdgError::Error(mArguments->where, "Cannot evaluate arguments"); delete mArguments; mArguments = NULL; } } void ASTpathOp::checkArguments(exp_ptr a) { if (a.get()) { mArguments = a.release()->simplify(); mArgCount = mArguments->evaluate(0, 0); } for (int i = 0; mArguments && i < mArguments->size(); ++i) { ASTexpression* temp = (*mArguments)[i]; assert(temp); switch (temp->mType) { case ASTexpression::FlagType: { if (i != mArguments->size() - 1) CfdgError::Error(temp->where, "Flags must be the last argument"); if (ASTreal* rf = dynamic_cast (temp)) mFlags = (int)(rf->value); else CfdgError::Error(temp->where, "Flag expressions must be constant"); --mArgCount; break; } case ASTexpression::NumericType: break; default: CfdgError::Error(temp->where, "Path operation arguments must be numeric expressions or flags"); break; } } switch (mPathOp) { case LINETO: case LINEREL: case MOVETO: case MOVEREL: if (mArgCount != 2) CfdgError::Error(mLocation, "Move/line path operation requires two arguments"); break; case ARCTO: case ARCREL: if (mArgCount != 3 && mArgCount != 5) CfdgError::Error(mLocation, "Arc path operations require three or five arguments"); break; case CURVETO: case CURVEREL: if (mFlags & CF_CONTINUOUS) { if (mArgCount != 2 && mArgCount != 4) CfdgError::Error(mLocation, "Continuous curve path operations require two or four arguments"); } else { if (mArgCount != 4 && mArgCount != 6) CfdgError::Error(mLocation, "Non-continuous curve path operations require four or six arguments"); } break; case CLOSEPOLY: if (mArgCount) CfdgError::Error(mLocation, "CLOSEPOLY takes no arguments, only flags"); break; default: break; } } static ASTexpression* parseXY(exp_ptr ax, exp_ptr ay, double def, const yy::location& loc) { if (!ax.get()) ax.reset(new ASTreal(def, loc)); int sz = ax->evaluate(0, 0); if (sz == 1 && !ay.get()) ay.reset(new ASTreal(def, loc)); if (ay.get()) sz += ay->evaluate(0, 0); if (sz != 2) CfdgError::Error(loc, "Error parsing path operation arguments"); return ax.release()->append(ay.release()); } static void rejectTerm(exp_ptr term) { if (term.get()) CfdgError::Error(term->where, "Illegal argument"); // and delete it } void ASTpathOp::makePositional(mod_ptr a) { exp_ptr ax; exp_ptr ay; exp_ptr ax1; exp_ptr ay1; exp_ptr ax2; exp_ptr ay2; exp_ptr arx; exp_ptr ary; exp_ptr ar; for (ASTtermArray::iterator it = a->modExp.begin(); it != a->modExp.end(); ++it) { ASTmodTerm* mod = *it; switch (mod ? mod->modType : ASTmodTerm::unknownType) { case ASTmodTerm::x: ax.reset(mod->args->simplify()); mod->args = NULL; break; case ASTmodTerm::y: ay.reset(mod->args->simplify()); mod->args = NULL; break; case ASTmodTerm::x1: ax1.reset(mod->args->simplify()); mod->args = NULL; break; case ASTmodTerm::y1: ay1.reset(mod->args->simplify()); mod->args = NULL; break; case ASTmodTerm::x2: ax2.reset(mod->args->simplify()); mod->args = NULL; break; case ASTmodTerm::y2: ay2.reset(mod->args->simplify()); mod->args = NULL; break; case ASTmodTerm::xrad: arx.reset(mod->args->simplify()); mod->args = NULL; break; case ASTmodTerm::yrad: ary.reset(mod->args->simplify()); mod->args = NULL; break; case ASTmodTerm::rot: ar.reset(mod->args->simplify()); mod->args = NULL; break; case ASTmodTerm::param: if (mod->entString.find("large") != std::string::npos) mFlags |= CF_ARC_LARGE; if (mod->entString.find("cw") != std::string::npos) mFlags |= CF_ARC_CW; if (mod->entString.find("align") != std::string::npos) mFlags |= CF_ALIGN; break; case ASTmodTerm::Entropy: break; case ASTmodTerm::z: case ASTmodTerm::zsize: CfdgError::Error((*it)->where, "Z changes are not permitted in paths"); break; case ASTmodTerm::unknownType: CfdgError::Error((*it)->where, "Unrecognized element in a path operation"); break; default: CfdgError::Error(mod->where, "Unrecognized element in a path operation"); break; } } ASTexpression* xy = 0; if (mPathOp != CLOSEPOLY) { xy = parseXY(ax, ay, 0.0, mLocation); } switch (mPathOp) { case LINETO: case LINEREL: case MOVETO: case MOVEREL: rejectTerm(ar); rejectTerm(arx); rejectTerm(ary); rejectTerm(ax1); rejectTerm(ay1); rejectTerm(ax2); rejectTerm(ay2); mArguments = xy; break; case ARCTO: case ARCREL: rejectTerm(ax1); rejectTerm(ay1); rejectTerm(ax2); rejectTerm(ay2); if (arx.get() || ary.get()) { ASTexpression* rxy = parseXY(arx, ary, 1, mLocation); ASTexpression* angle = ar.release(); if (!angle) angle = new ASTreal(0.0, mLocation); if (angle->evaluate(0, 0) != 1) CfdgError(angle->where, "Arc angle must be a scalar value"); mArguments = xy->append(rxy)->append(angle); } else { ASTexpression* radius = ar.release(); if (!radius) radius = new ASTreal(1.0, mLocation); if (radius->evaluate(0, 0) != 1) CfdgError::Error(radius->where, "Arc radius must be a scalar value"); mArguments = xy->append(radius); } break; case CURVETO: case CURVEREL: { rejectTerm(ar); rejectTerm(arx); rejectTerm(ary); ASTexpression *xy1 = 0, *xy2 = 0; if (ax1.get() || ay1.get()) { xy1 = parseXY(ax1, ay1, 0.0, mLocation); } else { mFlags |= CF_CONTINUOUS; } if (ax2.get() || ay2.get()) { xy2 = parseXY(ax2, ay2, 0.0, mLocation); } mArguments = xy->append(xy1)->append(xy2); break; } case CLOSEPOLY: rejectTerm(ax); rejectTerm(ay); rejectTerm(ar); rejectTerm(arx); rejectTerm(ary); rejectTerm(ax1); rejectTerm(ay1); rejectTerm(ax2); rejectTerm(ay2); break; default: break; } mArgCount = mArguments ? mArguments->evaluate(0, 0) : 0; } void ASTpathCommand::check4z() const { if (mChildChange.modData.m_Z.tz != 0.0) { CfdgError::Warning(mLocation, "Z changes are not supported within paths"); return; } for (ASTtermArray::const_iterator it = mChildChange.modExp.begin(), eit = mChildChange.modExp.end(); it != eit; ++it) { if ((*it)->modType == ASTmodTerm::z) { CfdgError::Warning((*it)->where, "Z changes are not supported within paths"); return; } } } } contextfree-3.0.5+dfsg1.orig/src-common/countable.h0000644000175000017500000000474312076364074020653 0ustar brambram// countable.h // this file is part of Context Free // --------------------- // Copyright (C) 2006-2007 Mark Lentczner - markl@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // Mark Lentczner can be contacted at markl@glyphic.com or at // Mark Lentczner, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #ifndef INCULDE_COUNTABLE_H #define INCULDE_COUNTABLE_H template class ref_ptr; class Countable { protected: Countable() : mUseCount(0) { } virtual ~Countable(); template static ref_ptr build(C* p) { return ref_ptr(p); } public: class RefPtr { protected: static void adjust(Countable* pointer, Countable* value); }; private: int mUseCount; friend class RefPtr; }; inline void Countable::RefPtr::adjust(Countable* pointer, Countable* value) { if (value) ++value->mUseCount; if (pointer) if (--pointer->mUseCount == 0) delete pointer; } template class ref_ptr : private Countable::RefPtr { private: C* ptr; void assign(C* p) { RefPtr::adjust(ptr, p); ptr = p; } public: ref_ptr() : ptr(0) { } ref_ptr(const ref_ptr& r) : ptr(0) { assign(r.ptr); } ~ref_ptr() { assign(0); } ref_ptr& operator=(const ref_ptr& r) { assign(r.ptr); return *this; } C& operator*() const { return *ptr; } C* operator->() const { return ptr; } C* get() const { return ptr; } #ifndef WIN32 template ref_ptr(const ref_ptr& r) : ptr(0) { assign(r.get()); } template ref_ptr& operator=(const ref_ptr& r) { assign(r.get()); return *this; } #endif // !WIN32 private: friend class Countable; explicit ref_ptr(C* p) : ptr(0) { assign(p); } }; #endif // INCULDE_COUNTABLE_H contextfree-3.0.5+dfsg1.orig/src-common/ffCanvasDummy.cpp0000644000175000017500000000327112076364074021770 0ustar brambram// ffCanvasDummy.cpp // this file is part of Context Free // --------------------- // Copyright (C) 2012 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #define __STDC_CONSTANT_MACROS 1 #include "ffCanvas.h" static aggCanvas::PixelFormat mapPixFmt(aggCanvas::PixelFormat in) { switch (in) { case aggCanvas::Gray8_Blend: case aggCanvas::Gray16_Blend: return aggCanvas::Gray8_Blend; case aggCanvas::RGB8_Blend: case aggCanvas::RGB16_Blend: return aggCanvas::FF24_Blend; default: return aggCanvas::FF_Blend; } } ffCanvas::ffCanvas(const char* name, PixelFormat fmt, int width, int height, int fps) : aggCanvas(mapPixFmt(fmt)), mError("Quicktime support not compiled in"), impl(NULL) { width &= ~3; height &= ~3; } ffCanvas::~ffCanvas() { } void ffCanvas::end() { aggCanvas::end(); } contextfree-3.0.5+dfsg1.orig/src-common/test-test.cpp0000644000175000017500000001471712076364074021170 0ustar brambram// test-test.cpp // this file is part of Context Free // --------------------- // Copyright (C) 2003 Mark Lentczner - markl@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // Mark Lentczner can be contacted at markl@glyphic.com or at // Mark Lentczner, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #include "test.h" #include using namespace std; namespace { string message(exception* f) { return f->what(); } } TEST(test, check) { CHECK(true); CHECK_MSG(true, "true wasn't true"); CHECK_SAME(7, 3 + 4); string a("abc"); string b("a"); b += "b"; b += "c"; CHECK_SAME(a, b); int* i = new int[42]; CHECK_VALID(i); delete[] i; } TEST(test, failure) { bool fail; fail = false; try { PASS(); } catch (exception* f) { delete f; fail = true; } CHECK(!fail); fail = false; try { FAIL("failure"); } catch (exception* f) { delete f; fail = true; } CHECK(fail); fail = false; try { CHECK(false); } catch (exception* f) { delete f; fail = true; } CHECK(fail); fail = false; try { CHECK_MSG(false, "false wasn't true"); } catch (exception* f) { delete f; fail = true; } CHECK(fail); fail = false; try { CHECK_SAME(42, 3 + 4); } catch (exception* f) { delete f; fail = true; } CHECK(fail); fail = false; try { string a("alpha"); string b("beta"); CHECK_SAME(a, b); } catch (exception* f) { delete f; fail = true; } CHECK(fail); fail = false; try { int* i = 0; CHECK_VALID(i); } catch (exception* f) { delete f; fail = true; } CHECK(fail); bool skip = false; try { SKIP(); } catch (exception* f) { delete f; skip = true; } CHECK(skip); } TEST(test, reporting) { try { CHECK_MSG(false, "false wasn't true"); FAIL("should have failed"); } catch (exception* f) { CHECK_SAME("false wasn't true", message(f)); delete f; } try { typedef int thing[2]; // this has no conversion to string thing x = { 1, 2 }; thing y = { 3, 4 }; CHECK_SAME(x, y); FAIL("should have failed"); } catch (exception* f) { CHECK_SAME("y had wrong value; expected x", message(f)); delete f; } try { bool x = true; bool y = false; CHECK_SAME(x, y); FAIL("should have failed"); } catch (exception* f) { CHECK_SAME("y had wrong value; expected true; actual false", message(f)); delete f; } try { int x = 4; int y = 5; CHECK_SAME(x, y); FAIL("should have failed"); } catch (exception* f) { CHECK_SAME("y had wrong value; expected 4; actual 5", message(f)); delete f; } try { string x("abc"); string y("def"); CHECK_SAME(x, y); FAIL("should have failed"); } catch (exception* f) { CHECK_SAME("y had wrong value; expected abc; actual def", message(f)); delete f; } try { string x("abc\nuvw"); string y("def\nxyz"); CHECK_SAME(x, y); FAIL("should have failed"); } catch (exception* f) { CHECK_SAME( "y had wrong value\nexpected:\nabc\nuvw\nactual:\ndef\nxyz\n", message(f)); delete f; } try { string y("def"); CHECK_SAME("abc", y); FAIL("should have failed"); } catch (exception* f) { CHECK_SAME("y had wrong value; expected abc; actual def", message(f)); delete f; } try { SKIP(); } catch (exception* f) { CHECK_CONTAINS("test skipped", message(f)); } } TEST(test, check_contains) { CHECK_CONTAINS("abc", "now i've sung my abc's"); try { CHECK_CONTAINS("abc", "row row row"); FAIL("should have failed"); } catch (exception* f) { CHECK_SAME("abc not found in row row row", message(f)); delete f; } } TEST(test, calledfrom) { Test::testlocation a("alpha", 18); CHECK_SAME("[alpha:18]", (string)a); { WHERE(a); Test::testlocation b("beta", 22, _called_from); CHECK_SAME("[beta:22]\n from [alpha:18]", (string)b); } Test::testlocation c("gamma", 34); CHECK_SAME("[gamma:34]", (string)c); { WHERE(c); Test::testlocation d("delta", 42, _called_from); { WHERE(d); Test::testlocation e("epsilon", 55, _called_from); CHECK_SAME("[epsilon:55]\n from [delta:42]\n from [gamma:34]", (string)e); } Test::testlocation f("phi", 62, _called_from); CHECK_SAME("[phi:62]\n from [gamma:34]", (string)f); } } #if 0 static TestGroupList tests(SL_SORTED | SL_DUPLICATES); struct Test_airplanes_takeoff : test { Test_airplanes_takeoff() : test(tests, "airplanes", "takeoff", "Apr 6 2005 18:43:31") { } void run(); } test_airplanes_takeoff; void Test_airplanes_takeoff::run() { CHECK_SAME("thrust", "thrust"); } TEST(test, runAll) { pt::outmemory out; out.open(); pt::runAll(out, tests, false, false); pt::string output = out.get_strdata(); CHECK_SAME("Running all unit tests:\n" "--------------------------------------------------\n" " airplanes: .\n" "--------------------------------------------------\n" "1 tests: 1 passed, 0 failed, 0 skipped\n" , output); } #endif contextfree-3.0.5+dfsg1.orig/src-common/tiledCanvas.h0000644000175000017500000000426112076364074021127 0ustar brambram// tiledCanvas.h // this file is part of Context Free // --------------------- // Copyright (C) 2006-2012 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #ifndef INCLUDE_TILEDCANVAS_H #define INCLUDE_TILEDCANVAS_H #include "agg_trans_affine.h" #include "agg_color_rgba.h" #include "cfdg.h" #include "bounds.h" #include "shape.h" #include #include "pathIterator.h" typedef std::vector tileList; class tiledCanvas : public Canvas { public: void start(bool clear, const agg::rgba& bk, int width, int height); void end(); void circle(RGBA8 c, agg::trans_affine tr); void square(RGBA8 c, agg::trans_affine tr); void triangle(RGBA8 c, agg::trans_affine tr); void fill(RGBA8 c); void path(RGBA8 c, agg::trans_affine tr, const AST::CommandInfo& attr); tiledCanvas(Canvas* tile, const agg::trans_affine& tr, CFDG::frieze_t f); ~tiledCanvas() {}; void scale(double scaleFactor); void getTesselation(tileList& tl, int width, int height, int x, int y, bool flipY = false); void tileTransform(const Bounds& b); private: Canvas* mTile; const agg::trans_affine mTileTransform; CFDG::frieze_t mFrieze; agg::trans_affine mOffset; agg::trans_affine mInvert; std::vector mTileList; tiledCanvas& operator=(const tiledCanvas&); }; #endif // INCLUDE_TILEDCANVAS_H contextfree-3.0.5+dfsg1.orig/src-common/version.h0000644000175000017500000000215212076364074020354 0ustar brambram// version.h // Context Free // --------------------- // Copyright (C) 2008 John Horigan // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #ifndef INCLUDE_VERSION_H #define INCLUDE_VERSION_H const char* APP_NAME(const char* argv0); const char* APP_VERSION(); int APP_BUILD(); char APP_OPTCHAR(); #endif //INCLUDE_VERSION_H contextfree-3.0.5+dfsg1.orig/src-common/countable.cpp0000644000175000017500000000203612076364074021177 0ustar brambram// countable.cpp // this file is part of Context Free // --------------------- // Copyright (C) 2006-2007 Mark Lentczner - markl@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // Mark Lentczner can be contacted at markl@glyphic.com or at // Mark Lentczner, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #include "countable.h" Countable::~Countable() { } contextfree-3.0.5+dfsg1.orig/src-common/primShape.cpp0000644000175000017500000000413612076364074021156 0ustar brambram// primShape.cpp // Context Free // --------------------- // Copyright (C) 2006-2011 John Horigan // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #include "primShape.h" #include #include "agg_basics.h" using namespace agg; #ifndef M_PI #define M_PI 3.14159265358979323846 #endif static const point_d squareV[4] = { point_d( 0.5, 0.5), point_d(-0.5, 0.5), point_d(-0.5, -0.5), point_d( 0.5, -0.5) }; const primShape primShape::square(squareV, 4); static const double h = 0.5 / cos(M_PI/6.0); static const double hp = h; static const double hn = -h / 2.0; static const point_d triV[3] = { point_d( 0.0, hp), point_d(-0.5, hn), point_d( 0.5, hn) }; const primShape primShape::triangle(triV, 3); static const double t = sqrt(2.0) / 4.0; static const point_d circleV[8] = { point_d( 0.5, 0.0), point_d( t, t), point_d( 0.0, 0.5), point_d( -t, t), point_d(-0.5, 0.0), point_d( -t, -t), point_d( 0.0, -0.5), point_d( t, -t) }; const primShape primShape::circle(circleV, 8); const primShape* primShape::shapeMap[numTypes] = { &primShape::circle, &primShape::square, &primShape::triangle, 0 }; bool primShape::isPrimShape(agg::path_storage* p) { return (p == &circle) || (p == &square) || (p == &triangle); } contextfree-3.0.5+dfsg1.orig/src-common/ffCanvas.h0000644000175000017500000000255412076364074020424 0ustar brambram// ffCanvas.h // this file is part of Context Free // --------------------- // Copyright (C) 2011 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #ifndef INCLUDE_FFCANVAS_H #define INCLUDE_FFCANVAS_H #include "aggCanvas.h" class ffCanvas : public aggCanvas { public: ffCanvas(const char* name, PixelFormat fmt, int width, int height, int fps); ~ffCanvas(); const char* mError; void end(); private: class Impl; Impl* impl; ffCanvas& operator=(ffCanvas& c) { return c; } }; #endif // INCLUDE_FFCANVAS_H contextfree-3.0.5+dfsg1.orig/src-common/astexpression.h0000644000175000017500000004106412076364074021603 0ustar brambram// astexpression.h // this file is part of Context Free // --------------------- // Copyright (C) 2011-2013 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #ifndef INCLUDE_ASTEXPRESSION_H #define INCLUDE_ASTEXPRESSION_H #include "ast.h" #include "location.hh" #include "cfdg.h" #include "shape.h" #include #include #include "Rand64.h" namespace AST { class ASTdefine; class ASTexpression { public: enum expType { NoType = 0, NumericType = 1, ModType = 2, RuleType = 4, FlagType = 8 }; bool isConstant; bool isNatural; bool isLocal; expType mType; yy::location where; ASTexpression(const yy::location& loc) : isConstant(false), isNatural(false), isLocal(true), mType(NoType), where(loc) {}; ASTexpression(const yy::location& loc, bool c, bool n, expType t = NoType) : isConstant(c), isNatural(n), isLocal(true), mType(t), where(loc) {}; virtual ~ASTexpression() {}; virtual int evaluate(double* , int, Renderer* = 0) const { return 0; } virtual void evaluate(Modification& , int* , double* , bool , int& , bool , Renderer*) const { CfdgError::Error(where, "Cannot convert this expression into an adjustment"); } virtual const StackType* evalArgs(Renderer* = 0, const StackType* = 0) const { CfdgError::Error(where, "Cannot convert this expression into a shape"); return NULL; } virtual void entropy(std::string&) const {}; virtual ASTexpression* simplify() { return this; } virtual ASTexpression* operator[](size_t i); virtual const ASTexpression* operator[](size_t i) const; virtual int size() const { return 1; } virtual ASTexpression* append(ASTexpression* sib); virtual bool release(size_t = std::numeric_limits::max()) { return false; } static ASTexpression* Append(ASTexpression* l, ASTexpression* r); }; class ASTfunction : public ASTexpression { public: enum FuncType { IllegalArguments = -2, NotAFunction = -1, Cos, Sin, Tan, Cot, Acos, Asin, Atan, Acot, Cosh, Sinh, Tanh, Acosh, Asinh, Atanh, Log, Log10, Sqrt, Exp, Abs, Floor, Infinity, Factorial, Sg, IsNatural, BitNot, BitOr, BitAnd, BitXOR, BitLeft, BitRight, Atan2, Mod, Divides, Div, Min, Max, Ftime, Frame, Rand_Static, Rand, Rand2, RandInt, LastOne }; static const char* FuncNames[LastOne]; static const char* Entropies[LastOne]; static FuncType GetFuncType(const std::string& func); FuncType functype; ASTexpression* arguments; double random; ASTfunction(const std::string& func, exp_ptr args, Rand64& r, const yy::location& nameLoc, const yy::location& argsLoc); virtual ~ASTfunction() {delete arguments;}; virtual int evaluate(double* r, int size, Renderer* rti = 0) const; virtual void entropy(std::string& e) const; virtual ASTexpression* simplify(); private: ASTfunction() : ASTexpression(CfdgError::Default) {}; }; class ASTselect : public ASTexpression { public: int tupleSize; unsigned indexCache; std::string ent; ASTexpression* arguments; bool ifSelect; ASTselect(exp_ptr args, const yy::location& loc, bool asIf); virtual ~ASTselect(); virtual int evaluate(double* r, int size, Renderer* = 0) const; virtual void evaluate(Modification& m, int* p, double* width, bool justCheck, int& seedIndex, bool shapeDest, Renderer* r) const; virtual const StackType* evalArgs(Renderer* rti = 0, const StackType* parent = 0) const; virtual void entropy(std::string& e) const; virtual ASTexpression* simplify(); private: ASTselect(const yy::location& loc) : ASTexpression(loc), tupleSize(-1), indexCache(0) {} unsigned getIndex(Renderer* rti = 0) const; }; class ASTruleSpecifier : public ASTexpression { public: enum ArgSource { NoArgs, DynamicArgs, StackArgs, SimpleArgs, ParentArgs, SimpleParentArgs, ShapeArgs }; int shapeType; int argSize; std::string entropyVal; ArgSource argSource; ASTexpression* arguments; const StackType* simpleRule; int mStackIndex; const ASTparameters* typeSignature; static ASTruleSpecifier Zero; ASTruleSpecifier(int t, const std::string& name, exp_ptr args, const yy::location& loc, const ASTparameters* types, const ASTparameters* parent); ASTruleSpecifier(const std::string& name, const yy::location& loc, int stackIndex); ASTruleSpecifier(const ASTruleSpecifier* r, const std::string& name, const yy::location& loc); ASTruleSpecifier(exp_ptr args, const yy::location& loc); ASTruleSpecifier(ASTruleSpecifier& r); explicit ASTruleSpecifier() : ASTexpression(CfdgError::Default, false, false, RuleType), shapeType(-1), argSize(0), argSource(NoArgs), arguments(0), simpleRule(0), mStackIndex(0), typeSignature(0) {}; virtual ~ASTruleSpecifier(); virtual int evaluate(double* r, int size, Renderer* = 0) const; virtual const StackType* evalArgs(Renderer* = 0, const StackType* parent = 0) const; virtual void entropy(std::string& e) const; virtual ASTexpression* simplify(); private: ASTruleSpecifier(const ASTruleSpecifier& r); ASTruleSpecifier& operator=(const ASTruleSpecifier&); }; class ASTcons : public ASTexpression { public: ASTexpArray children; ASTcons(ASTexpression* l, ASTexpression* r); virtual ~ASTcons(); virtual int evaluate(double* r, int size, Renderer* = 0) const; virtual void evaluate(Modification& m, int* p, double* width, bool justCheck, int& seedIndex, bool shapeDest, Renderer* r) const; virtual void entropy(std::string& e) const; virtual ASTexpression* simplify(); virtual ASTexpression* operator[](size_t i); virtual const ASTexpression* operator[](size_t i) const; virtual int size() const { return (int)(children.size()); } virtual ASTexpression* append(ASTexpression* sib); virtual bool release(size_t i = std::numeric_limits::max()); private: ASTcons() : ASTexpression(CfdgError::Default) {}; }; class ASTreal : public ASTexpression { public: double value; std::string text; ASTreal(const std::string& t, const yy::location& loc, bool negative = false) : ASTexpression(loc, true, false, NumericType), text(t) { if (negative) text.insert(0, 1, '-'); value = CFatof(text.c_str()); isNatural = floor(value) == value && value >= 0.0 && value < 9007199254740992.; }; ASTreal(double v, const yy::location& loc) : ASTexpression(loc, true, floor(v) == v && v >= 0.0 && v < 9007199254740992., NumericType), value(v) {}; virtual ~ASTreal() {}; virtual int evaluate(double* r, int size, Renderer* = 0) const; virtual void entropy(std::string& e) const; private: ASTreal() : ASTexpression(CfdgError::Default) {}; }; class ASTvariable : public ASTexpression { public: int stringIndex; std::string text; int stackIndex; int count; bool isParameter; ASTvariable(int stringNum, const std::string& str, const yy::location& loc); virtual int evaluate(double* r, int size, Renderer* = 0) const; virtual void evaluate(Modification& m, int* p, double* width, bool justCheck, int& seedIndex, bool shapeDest, Renderer* r) const; virtual void entropy(std::string& e) const; private: ASTvariable() : ASTexpression(CfdgError::Default) {}; }; class ASTuserFunction : public ASTexpression { public: ASTdefine* definition; ASTexpression* arguments; bool isLet; ASTuserFunction(ASTexpression* args, ASTdefine* func, const yy::location& nameLoc); virtual ~ASTuserFunction() { delete arguments; } virtual int evaluate(double* , int, Renderer* = 0) const; virtual void evaluate(Modification& m, int* p, double* width, bool justCheck, int& seedIndex, bool shapeDest, Renderer* r) const; virtual const StackType* evalArgs(Renderer* rti = 0, const StackType* parent = 0) const; virtual void entropy(std::string&) const; virtual ASTexpression* simplify(); }; class ASTlet : public ASTuserFunction { public: ASTlet(ASTexpression* args, ASTdefine* func, const yy::location& letLoc, const yy::location& defLoc); virtual ~ASTlet(); }; class ASToperator : public ASTexpression { public: char op; ASTexpression* left; ASTexpression* right; ASToperator(char o, ASTexpression* l, ASTexpression* r); virtual ~ASToperator() { delete left; delete right; } virtual int evaluate(double* r, int size, Renderer* = 0) const; virtual void entropy(std::string& e) const; virtual ASTexpression* simplify(); static ASTexpression* Op(char o, ASTexpression* l, ASTexpression* r); private: ASToperator() : ASTexpression(CfdgError::Default) {}; }; class ASTparen : public ASTexpression { public: ASTexpression* e; ASTparen(ASTexpression* e1) : ASTexpression(e1->where, e1->isConstant, e1->isNatural, e1->mType), e(e1) { isLocal = e1->isLocal; }; virtual ~ASTparen() { delete e; } virtual int evaluate(double* r, int size, Renderer* = 0) const; virtual void evaluate(Modification& m, int* p, double* width, bool justCheck, int& seedIndex, bool shapeDest, Renderer* r) const; virtual const StackType* evalArgs(Renderer* rti = 0, const StackType* parent = 0) const; virtual void entropy(std::string& e) const; virtual ASTexpression* simplify(); private: ASTparen() : ASTexpression(CfdgError::Default) {}; }; class ASTmodTerm : public ASTexpression { public: enum modTypeEnum { unknownType, x, y, z, xyz, transform, size, sizexyz, rot, skew, flip, zsize, Entropy, hue, sat, bright, alpha, hueTarg, satTarg, brightTarg, alphaTarg, targHue, targSat, targBright, targAlpha, time, timescale, stroke, param, x1, y1, x2, y2, xrad, yrad, modification, lastModType }; modTypeEnum modType; ASTexpression* args; std::string entString; static const char* Entropies[lastModType]; static void Eval(ASTexpression* mod, Modification& m, std::string* p = 0, double* width = 0, Renderer* r = 0); ASTmodTerm(modTypeEnum t, ASTexpression* a, const yy::location& loc); ASTmodTerm(modTypeEnum t, const std::string& ent, const yy::location& loc) : ASTexpression(loc, true, false, ModType), modType(t), args(0), entString(ent) {}; ASTmodTerm(modTypeEnum t, const yy::location& loc) : ASTexpression(loc, true, false, ModType), modType(t), args(0) {}; virtual ~ASTmodTerm() { delete args; } virtual int evaluate(double* r, int size, Renderer* = 0) const; virtual void evaluate(Modification& m, int* p, double* width, bool justCheck, int& seedIndex, bool shapeDest, Renderer*) const; virtual void entropy(std::string& e) const; virtual ASTexpression* simplify(); }; class ASTmodification : public ASTexpression { public: enum modClassEnum { NotAClass = 0, GeomClass = 1, ZClass = 2, TimeClass = 4, HueClass = 8, SatClass = 16, BrightClass = 32, AlphaClass = 64, HueTargetClass = 128, SatTargetClass = 256, BrightTargetClass = 512, AlphaTargetClass = 1024, StrokeClass = 2048, ParamClass = 4096, PathOpClass = 8192 }; Modification modData; ASTtermArray modExp; int modClass; double strokeWidth; int flags; int entropyIndex; static int ModClass[ASTmodTerm::lastModType]; ASTmodification(const yy::location& loc) : ASTexpression(loc, true, false, ModType), modExp(0), modClass(NotAClass), strokeWidth(0.1), flags(CF_MITER_JOIN + CF_BUTT_CAP + CF_FILL), entropyIndex(0) {} ASTmodification(const ASTmodification& m, const yy::location& loc); ASTmodification(mod_ptr m, const yy::location& loc); virtual ~ASTmodification(); virtual int evaluate(double* r, int size, Renderer* = 0) const; virtual void evaluate(Modification& m, int* p, double* width, bool justCheck, int& seedIndex, bool shapeDest, Renderer*) const; void setVal(Modification& m, int* p, double* width, bool justCheck, int& seedIndex, Renderer* = 0) const; void addEntropy(const std::string& name); void evalConst(); void makeCanonical(); void grab(ASTmodification* m); }; class ASTarray : public ASTexpression { public: double mData[9]; bool mConstData; ASTexpression* mArgs; int mLength; int mStride; int mStackIndex; int mCount; bool isParameter; std::string entString; ASTarray(const ASTparameter* bound, exp_ptr args, int stackOffset, const yy::location& loc, const std::string& name); virtual ~ASTarray(); virtual int evaluate(double* r, int size, Renderer* = 0) const; virtual void entropy(std::string& e) const; virtual ASTexpression* simplify(); }; class ASTdefine; class ASTparameter { public: ASTexpression::expType mType; bool isParameter; bool isLoopIndex; bool isNatural; bool isLocal; int mName; yy::location mLocation; ASTdefine* mDefinition; int mStackIndex; int mTuplesize; static bool Impure; ASTparameter() : mType(ASTexpression::NoType), isParameter(false), isLoopIndex(false), isNatural(false), isLocal(false), mName(-1), mDefinition(0), mStackIndex(-1), mTuplesize(1) {}; void init(const std::string& typeName, int nameIndex); void init(int nameIndex, ASTdefine* def); void check(const yy::location& typeLoc, const yy::location& nameLoc); bool operator!=(const ASTparameter& p) const; bool operator!=(const ASTexpression& e) const; static int CheckType(const ASTparameters* types, const ASTparameters* parent, const ASTexpression* args, const yy::location& where, bool checkNumber); }; } #endif //INCLUDE_ASTEXPRESSION_H contextfree-3.0.5+dfsg1.orig/src-common/test.cpp0000644000175000017500000002146012076364074020204 0ustar brambram// test.cpp // this file is part of Context Free // --------------------- // Copyright (C) 2003 Mark Lentczner - markl@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // Mark Lentczner can be contacted at markl@glyphic.com or at // Mark Lentczner, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #include "test.h" #include #include #include #include #include #include #define SPIN 0 // set to 1 if you want to see spinning characters during tests // only works if your output device supports backspace namespace Test { testlocation::testlocation(const char* f, long l, int) : file(f), line(l), from(0) { } testlocation::testlocation(const char* f, long l, const testlocation& t) : file(f), line(l), from(&t) { } testlocation::testlocation(const testlocation& o) : file(o.file), line(o.line), from(o.from) { } testlocation& testlocation::operator=(const testlocation& o) { file = o.file; line = o.line; from = o.from; return *this; } void testlocation::put(std::ostream& out) const { if (line >= 0) { out << "[" << file << ":" << line << "]"; } else if (file) { out << "[" << file << ":-]"; } else { out << "[-:-]"; } if (from) { out << "\n from "; from->put(out); } } testlocation::operator std::string() const { std::ostringstream out; put(out); return out.str(); } class testfailure : public std::exception { public: testfailure(const testlocation& l, const std::string& m, bool fatal = true); testfailure(const std::string& m, bool fatal = true); ~testfailure() throw(); const char* what() const throw(); operator std::string() const; void put(std::ostream&) const; bool isFatal() const { return fatal; } void set_test_info(const std::string& group, const std::string& name); class list : public std::vector { public: void dump(std::ostream& out); }; private: std::string message; std::string group; std::string name; std::string location; bool fatal; }; testfailure::testfailure(const testlocation& l, const std::string& m, bool f) : message(m), location(l), fatal(f) { } testfailure::testfailure(const std::string& m, bool f) : message(m), fatal(f) { } testfailure::~testfailure() throw() { } const char* testfailure::what() const throw() { return message.c_str(); } void testfailure::put(std::ostream& out) const { out << (fatal ? "***" : "---") << " " << group << ", " << name << " " << location << std::endl << " " << message << std::endl; } #if 0 testfailure::operator std::string() const { std::ostringstream out; put(out); return out.str(); } #endif void testfailure::set_test_info(const std::string& g, const std::string& n) { group = g; name = n; } void testfailure::list::dump(std::ostream& out) { if (empty()) return; out << std::endl; for (const_iterator i = begin(); i != end(); ++i) (*i)->put(out); out << std::endl; clear(); } typedef std::vector TestList; struct TestGroup { std::string name; TestList list; TestGroup(const char* n) : name(n) { } }; typedef std::map TestMap; TestMap& registry() { /* This trick is to ensure that this global is constructed before it is used. See C++ FAQ Lite, sections 10.11 through 10.13 */ static TestMap* r = new TestMap; return *r; } test::test(const char* group, const char* n, const char* built) : name(n) { std::string key; struct tm timeInfo; if (built && strptime(built, "%b %d %Y %H:%M:%S", &timeInfo)) { char buf[20]; strftime(buf, sizeof(buf), "%Y%m%d%H%M%S", &timeInfo); key = buf; } else { key = "00000000000000"; } key += group; TestMap& r = registry(); TestMap::iterator i = r.find(key); if (i == r.end()) { r[key] = new TestGroup(group); } r[key]->list.push_back(this); } bool anyPasses; void pass(const testlocation& loc) { anyPasses = true; if (SPIN) { static int seqIndex = 0; static const char seqChars[] = { '-', '\\', '|', '/' }; static const int seqLength = sizeof(seqChars) / sizeof(seqChars[0]); std::cout << '\010' // backspace << seqChars[seqIndex]; seqIndex = (seqIndex + 1) % seqLength; } } void fail(const testlocation& loc, const std::string& message) { throw new testfailure(loc, message); } namespace { bool longstr(const std::string& s) { return s.size() > 20 || s.find('\n') != std::string::npos; } }; void failsame(const testlocation& loc, const char* expectExpr, const std::string& expected, const char* actualExpr, const std::string& actual) { bool longmsg = longstr(expected) || longstr(actual); bool noconv = expected.empty() && actual.empty(); // if both value strings are empty, then there was no conversion // to string available, just show the expectedExpr std::ostringstream message; message << actualExpr << " had wrong value"; if (noconv) { message << "; expected " << expectExpr; } else { message << (longmsg ? "\nexpected:\n" : "; expected ") << expected << (longmsg ? "\nactual:\n" : "; actual ") << actual << (longmsg ? "\n" : ""); } fail(loc, message.str()); } void fail_contains(const testlocation& loc, const std::string& needle, const std::string& haystack) { if (longstr(haystack) || longstr(needle)) fail(loc, "needle:\n" + needle + "\nnot found in haystack:\n" + haystack + "\n"); else fail(loc, needle + " not found in " + haystack); } std::string tostring(bool b) { return b ? "true" : "false"; } std::string tostring(const std::string& s) { return s; } std::string tostring(int i) { std::ostringstream o; o << i; return o.str(); } void skip(const testlocation& loc) { throw new testfailure(loc, "test skipped", false); } void check_contains(const testlocation& loc, const char* needleExpr, const std::string& needle, const char* haystackExpr, const std::string& haystack) { if (haystack.find(needle) == std::string::npos) fail_contains(loc, needle, haystack); else pass(loc); } void check(const testlocation& loc, const char* expr, bool actual) { if (!actual) fail(loc, expr); else pass(loc); } bool runAll(bool reportPerGroup, bool stopOnFailingGroup) { testfailure::list failures; int testCount = 0; int passCount = 0; int failCount = 0; int skipCount = 0; std::cout << "Running all unit tests:\n" "--------------------------------------------------\n"; TestMap& r = registry(); for (TestMap::const_iterator i = r.begin(); i != r.end(); ++i) { TestGroup& group = *i->second; std::cout << std::setw(12) << group.name; TestList& l = group.list; for (TestList::const_iterator j = l.begin(); j != l.end(); ++j) { test& t = **j; testfailure* failure = 0; anyPasses = false; if (SPIN) std::cout << ' '; try { t.run(); } catch (testfailure* f) { failure = f; } catch (std::exception* e) { failure = new testfailure(e->what()); delete e; } catch (const std::string& s) { failure = new testfailure(s); } catch (...) { failure = new testfailure("threw an uncaught exception"); } if (!failure && anyPasses == 0) { failure = new testfailure("test skipped", false); } if (SPIN) std::cout << '\010'; if (failure) { failure->set_test_info(group.name, t.name); failures.push_back(failure); if (failure->isFatal()) { std::cout << '*'; failCount += 1; } else { std::cout << '-'; skipCount += 1; } } else if (anyPasses) { std::cout << '.'; passCount += 1; } testCount += 1; } std::cout << std::endl; if (reportPerGroup) failures.dump(std::cout); if (stopOnFailingGroup && failCount > 0) break; } std::cout << "--------------------------------------------------\n" << testCount << " tests: " << passCount << " passed, " << failCount << " failed, " << skipCount << " skipped\n"; failures.dump(std::cout); return failCount == 0; } } contextfree-3.0.5+dfsg1.orig/src-common/Rand64.h0000644000175000017500000000401712076364074017727 0ustar brambram// Rand64.h // this file is part of Context Free // --------------------- // Copyright (C) 2008-2012 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #ifndef INCLUDE_RAND48_H #define INCLUDE_RAND48_H #define RAND64_MULT 0x5851F42D4C957F2DULL #define RAND64_ADD 0x14057B7EF767814FULL #define RAND64_SEED 0x3DF41234ABCD330EULL #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS #endif #include // This class implements the 64-bit linear congruent PRNG from Knuth's MMIX architecture. class Rand64 { public: uint64_t mSeed; static Rand64 Common; Rand64() : mSeed(RAND64_SEED) { } Rand64(uint64_t seed) : mSeed(seed) { } double getDouble(bool bump = true); long getLong(bool bump = true); long getPositive(bool bump = true); unsigned long getUnsigned(bool bump = true); void seed(uint64_t seed); void init(); Rand64& operator^=(const Rand64& r) { mSeed ^= r.mSeed; return *this; }; bool operator==(const Rand64& r) { return mSeed == r.mSeed; }; void xorString(const char* t, int& i); void xorChar(unsigned char c, unsigned i); void bump(); }; #endif // INCLUDE_RAND48_H contextfree-3.0.5+dfsg1.orig/src-common/HSBColor.cpp0000644000175000017500000001264112076364074020641 0ustar brambram// HSBColor.cpp // this file is part of Context Free // --------------------- // Copyright (C) 2005-2008 Mark Lentczner - markl@glyphic.com // Copyright (C) 2005-2012 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // Mark Lentczner can be contacted at markl@glyphic.com or at // Mark Lentczner, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #include "HSBColor.h" #include #include void HSBColor::getRGBA(agg::rgba& c) const { // Determine which facet of the HSB hexcone we are in and how // far we are into this hextant. double hue = h / 60.0;; double remainder, hex; for(;;) { // try splitting the hue into an integer hextant in [0,6) and // a real remainder in [0,1) remainder = modf(hue, &hex); if (hex > -0.1 && hex < 5.1 && remainder >= 0) break; // We didn't get the ranges that we wanted. Adjust hue and try again. if (hex < 0 || remainder < 0) hue += 6.0; if (hex > 5.5) hue -= 6.0; } int hextant = (int)(hex + 0.5); // guaranteed to be in 0..5 double p = b * (1 - s); double q = b * (1 - (s * remainder)); double t = b * (1 - (s * (1 - remainder))); c.a = a; switch (hextant) { case 0: c.r = b; c.g = t; c.b = p; return; case 1: c.r = q; c.g = b; c.b = p; return; case 2: c.r = p; c.g = b; c.b = t; return; case 3: c.r = p; c.g = q; c.b = b; return; case 4: c.r = t; c.g = p; c.b = b; return; case 5: c.r = b; c.g = p; c.b = q; return; default: // this should never happen c.r = 0; c.g = 0; c.b = 0; c.a = 1; return; } } static inline double myfmin(double x, double y) { return x < y ? x : y; } static inline double myfmax(double x, double y) { return x > y ? x : y; } HSBColor::HSBColor(const agg::rgba& c) { double min = myfmin(c.r, myfmin(c.g, c.b)); double max = myfmax(c.r, myfmax(c.g, c.b)); double delta = max - min; b = max; if (delta < EQUALITY_THRESHOLD) { h = s = 0.0; } else { s = delta / b; // hsb.b can't be zero here // The == operator is normally useless for floats and doubles. But // since max is always assigned from either c.r/g/b we will take // a chance. double temp; if (c.r == max) { temp = (c.g - c.b) / (delta); } else if (c.g == max) { temp = 2 + ((c.b - c.r) / (delta)); } else /* if (c.b == max) */ { temp = 4 + ((c.r - c.g) / (delta)); } // compute hue in the interval [0,360) temp *= 60; h = temp < 0.0 ? fmod(temp + 360.0, 360.0) : fmod(temp, 360.0); } a = c.a; } void HSBColor::Adjust(HSBColor& dest, HSBColor& destTarget, const HSBColor& adj, const HSBColor& adjTarg, int assign) { int current = assign & HueMask; bool twoValue = current == Hue2Value; dest.h = adjustHue(dest.h, adj.h, current, twoValue ? adjTarg.h : destTarget.h); if (!twoValue) destTarget.h = adjustHue(destTarget.h, adjTarg.h); current = assign & SaturationMask; twoValue = current == Saturation2Value; dest.s = adjust(dest.s, adj.s, current, twoValue ? adjTarg.s : destTarget.s); if (!twoValue) destTarget.s = adjust(destTarget.s, adjTarg.s); current = assign & BrightnessMask; twoValue = current == Brightness2Value; dest.b = adjust(dest.b, adj.b, current, twoValue ? adjTarg.b : destTarget.b); if (!twoValue) destTarget.b = adjust(destTarget.b, adjTarg.b); current = assign & AlphaMask; twoValue = current == Alpha2Value; dest.a = adjust(dest.a, adj.a, current, twoValue ? adjTarg.a : destTarget.a); if (!twoValue) destTarget.a = adjust(destTarget.a, adjTarg.a); } double HSBColor::delta(double to, double from, unsigned int steps) { if (fabs(to - from) < EQUALITY_THRESHOLD) return 0.0; if (to > from) return -delta(1.0 - to, 1.0 - from, steps); // from >= EQUALITY_THRESHOLD if (steps == 1) return to / from - 1.0; return pow(to / from, 1.0 / ((double)steps)) - 1.0; } double HSBColor::deltaHue(double to, double from, unsigned int steps) { double diff = fmod(to - from, 360.0) / steps; // Normalize result to the interval (-180,180] if (diff <= -180.0) return diff + 360.0; if (diff > 180.0) return diff - 360.0; return diff; } contextfree-3.0.5+dfsg1.orig/src-common/shape.cpp0000644000175000017500000001023512076364074020323 0ustar brambram// shape.cpp // this file is part of Context Free // --------------------- // Copyright (C) 2005-2008 Mark Lentczner - markl@glyphic.com // Copyright (C) 2005-2013 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // Mark Lentczner can be contacted at markl@glyphic.com or at // Mark Lentczner, 1209 Villa St., Mountain View, CA 94041-1123, USA // // // Shape layout in files: // Shapebase (shape type and world state) // Shape bounds if this is a finished shape // Parameter token (8 bytes): // zero if there are no parameters // a memory pointer if the parameters are owned by some other object // a header token if the parameters are owned by the shape // (this is shapeName << 24 | paramCount << 8 | 0xff) // The parameter block starting with the typeInfo block (2nd block) // A header token can be distinguished from a pointer by the lower two bits: // 00b for a pointer and 11b for a header token. See shapetype.cpp for // information on parameter block file layout. // #include "shape.h" #include #include #include "stacktype.h" #include #ifdef _WIN32 #include #define isfinite _finite #else #include using std::isfinite; #endif bool Modification::isFinite() const { return isfinite(m_transform.sx) && isfinite(m_transform.shy) && isfinite(m_transform.shx) && isfinite(m_transform.sy) && isfinite(m_transform.tx) && isfinite(m_transform.ty) && isfinite(m_Z.sz) && isfinite(m_Z.tz); } bool Modification::merge(const Modification& m) { m_transform.premultiply(m.m_transform); m_Z.premultiply(m.m_Z); m_time.premultiply(m.m_time); mRand64Seed ^= m.mRand64Seed; bool conflict = (m_ColorAssignment & m.m_ColorAssignment) || ((m.m_ColorAssignment & HSBColor::HueMask) && m_Color.h != 0.0) || (( m_ColorAssignment & HSBColor::HueMask) && m.m_Color.h != 0.0) || (m_Color.b != 0.0 && m.m_Color.b != 0.0) || (m_Color.s != 0.0 && m.m_Color.s != 0.0) || (m_Color.a != 0.0 && m.m_Color.a != 0.0); m_ColorTarget.h += m.m_ColorTarget.h; m_ColorTarget.b += m.m_ColorTarget.b; m_ColorTarget.s += m.m_ColorTarget.s; m_ColorTarget.a += m.m_ColorTarget.a; m_Color.h += m.m_Color.h; m_Color.b += m.m_Color.b; m_Color.s += m.m_Color.s; m_Color.a += m.m_Color.a; m_ColorAssignment |= m.m_ColorAssignment; return conflict; } void ShapeBase::write(std::ostream& os) const { os.write((const char*)(this), sizeof(ShapeBase)); } void ShapeBase::read(std::istream& is) { is.read((char *)(this), sizeof(ShapeBase)); } void Shape::write(std::ostream& os) const { ShapeBase::write(os); writeParams(os); } void Shape::read(std::istream& is) { ShapeBase::read(is); readParams(is); } void Shape::writeParams(std::ostream& os) const { StackType::writeHeader(os, mParameters); releaseParams(); } void Shape::readParams(std::istream& is) { mParameters = StackType::readHeader(is); } void FinishedShape::write(std::ostream& os) const { ShapeBase::write(os); os.write((const char*)(&mBounds), sizeof(Bounds)); writeParams(os); } void FinishedShape::read(std::istream& is) { ShapeBase::read(is); is.read((char *)(&mBounds), sizeof(Bounds)); readParams(is); } contextfree-3.0.5+dfsg1.orig/src-common/builder.cpp0000644000175000017500000012213312076364074020652 0ustar brambram// builder.cpp // this file is part of Context Free // --------------------- // Copyright (C) 2005-2008 Mark Lentczner - markl@glyphic.com // Copyright (C) 2005-2012 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // Mark Lentczner can be contacted at markl@glyphic.com or at // Mark Lentczner, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #include "builder.h" #include "astreplacement.h" #define _USE_MATH_DEFINES #include "agg_trans_affine.h" #include "agg_path_storage.h" #include "agg_basics.h" #include "cfdgimpl.h" #include "primShape.h" #include #include #include #include #include #include "scanner.h" #include using namespace AST; std::map Builder::FlagNames; Builder* Builder::CurrentBuilder = 0; double Builder:: MaxNatural = 1000.0; Builder::Builder(CFDGImpl* cfdg, int variation) : m_CFDG(cfdg), m_currentPath(0), m_basePath(0), m_pathCount(1), mInPathContainer(false), mCurrentShape(-1), mWant2ndPass(false), mCompilePhase(1), mLocalStackDepth(0), mIncludeDepth(0), mAllowOverlap(false), lexer(0), mErrorOccured(false) { //CommandInfo::shapeMap[0].mArea = M_PI * 0.25; mSeed.seed((unsigned long long)variation); if (FlagNames.empty()) { FlagNames.insert(std::pair("CF::None", AST::CF_NONE)); FlagNames.insert(std::pair("CF::MiterJoin", AST::CF_MITER_JOIN | AST::CF_JOIN_PRESENT)); FlagNames.insert(std::pair("CF::RoundJoin", AST::CF_ROUND_JOIN | AST::CF_JOIN_PRESENT)); FlagNames.insert(std::pair("CF::BevelJoin", AST::CF_BEVEL_JOIN | AST::CF_JOIN_PRESENT)); FlagNames.insert(std::pair("CF::ButtCap", AST::CF_BUTT_CAP | AST::CF_CAP_PRESENT)); FlagNames.insert(std::pair("CF::RoundCap", AST::CF_ROUND_CAP | AST::CF_CAP_PRESENT)); FlagNames.insert(std::pair("CF::SquareCap", AST::CF_SQUARE_CAP | AST::CF_CAP_PRESENT)); FlagNames.insert(std::pair("CF::ArcCW", AST::CF_ARC_CW)); FlagNames.insert(std::pair("CF::ArcLarge", AST::CF_ARC_LARGE)); FlagNames.insert(std::pair("CF::Continuous", AST::CF_CONTINUOUS)); FlagNames.insert(std::pair("CF::Align", AST::CF_ALIGN)); FlagNames.insert(std::pair("CF::EvenOdd", AST::CF_EVEN_ODD)); FlagNames.insert(std::pair("CF::IsoWidth", AST::CF_ISO_WIDTH)); FlagNames.insert(std::pair("~~CF_FILL~~", AST::CF_FILL)); FlagNames.insert(std::pair("CF::Cyclic", AST::CF_CYCLIC)); FlagNames.insert(std::pair("CF::Dihedral", AST::CF_DIHEDRAL)); FlagNames.insert(std::pair("CF::p11g", AST::CF_P11G)); FlagNames.insert(std::pair("CF::p11m", AST::CF_P11M)); FlagNames.insert(std::pair("CF::p1m1", AST::CF_P1M1)); FlagNames.insert(std::pair("CF::p2", AST::CF_P2)); FlagNames.insert(std::pair("CF::p2mg", AST::CF_P2MG)); FlagNames.insert(std::pair("CF::p2mm", AST::CF_P2MM)); FlagNames.insert(std::pair("CF::pm", AST::CF_PM)); FlagNames.insert(std::pair("CF::pg", AST::CF_PG)); FlagNames.insert(std::pair("CF::cm", AST::CF_CM)); FlagNames.insert(std::pair("CF::pmm", AST::CF_PMM)); FlagNames.insert(std::pair("CF::pmg", AST::CF_PMG)); FlagNames.insert(std::pair("CF::pgg", AST::CF_PGG)); FlagNames.insert(std::pair("CF::cmm", AST::CF_CMM)); FlagNames.insert(std::pair("CF::p4", AST::CF_P4)); FlagNames.insert(std::pair("CF::p4m", AST::CF_P4M)); FlagNames.insert(std::pair("CF::p4g", AST::CF_P4G)); FlagNames.insert(std::pair("CF::p3", AST::CF_P3)); FlagNames.insert(std::pair("CF::p3m1", AST::CF_P3M1)); FlagNames.insert(std::pair("CF::p31m", AST::CF_P31M)); FlagNames.insert(std::pair("CF::p6", AST::CF_P6)); FlagNames.insert(std::pair("CF::p6m", AST::CF_P6M)); } assert(Builder::CurrentBuilder == NULL); // ensure singleton Builder::CurrentBuilder = this; MaxNatural = 1000.0; ASTparameter::Impure = false; mContainerStack.push_back(&(cfdg->mCFDGcontents)); if (ASTrule::PrimitivePaths[primShape::circleType] == 0) { for (unsigned i = 0; i < primShape::numTypes; ++i) { // primShape statics are const because of thread safety issues. // But Builder is a singleton and preceeds any thread's access // to primShape statics. So this const_cast is ok. primShape* map = const_cast(primShape::shapeMap[i]); if (map) { ASTrule* r = new ASTrule(i, CfdgError::Default); ASTrule::PrimitivePaths[i] = r; static const std::string move("MOVETO"); static const std::string line("LINETO"); static const std::string arc("ARCTO"); static const std::string close("CLOSEPOLY"); if (i != primShape::circleType) { map->rewind(0); double x = 0, y = 0; unsigned cmd; while (!agg::is_stop(cmd = map->vertex(&x, &y))) { if (agg::is_vertex(cmd)) { exp_ptr a(new ASTcons(new ASTreal(x, CfdgError::Default), new ASTreal(y, CfdgError::Default))); ASTpathOp* op = new ASTpathOp(agg::is_move_to(cmd) ? move : line, a, CfdgError::Default); r->mRuleBody.mBody.push_back(op); } } } else { exp_ptr a(new ASTcons(new ASTreal(0.5, CfdgError::Default), new ASTreal(0.0, CfdgError::Default))); ASTpathOp* op = new ASTpathOp(move, a, CfdgError::Default); r->mRuleBody.mBody.push_back(op); a.reset(new ASTcons(new ASTreal(-0.5, CfdgError::Default), new ASTreal(0.0, CfdgError::Default))); a.get()->append(new ASTreal(0.5, CfdgError::Default)); op = new ASTpathOp(arc, a, CfdgError::Default); r->mRuleBody.mBody.push_back(op); a.reset(new ASTcons(new ASTreal(0.5, CfdgError::Default), new ASTreal(0.0, CfdgError::Default))); a.get()->append(new ASTreal(0.5, CfdgError::Default)); op = new ASTpathOp(arc, a, CfdgError::Default); r->mRuleBody.mBody.push_back(op); } r->mRuleBody.mBody.push_back(new ASTpathOp(close, exp_ptr(), CfdgError::Default)); r->mRuleBody.mRepType = ASTreplacement::op; r->mRuleBody.mPathOp = AST::MOVETO; } } } } Builder::~Builder() { pop_repContainer(NULL); delete m_CFDG; Builder::CurrentBuilder = 0; while (!m_streamsToLoad.empty()) { delete m_streamsToLoad.top(); m_streamsToLoad.pop(); } } static const char* getUniqueFile(const std::string* base, const std::string* file) { const char* b = base->c_str(); const char* f = file->c_str(); for (; *b && *f; ++b, ++f) { if (*b != *f) return f; } if (*b == '\0' && *f == '\0') return NULL; return file->c_str(); } void Builder::error(const yy::location& l, const std::string& msg) { if (mWant2ndPass) return; mErrorOccured = true; warning(l, msg); } void Builder::warning(const yy::location& l, const std::string& msg) { CfdgError err(l, msg.c_str()); if (l.begin.filename) { const char* fname = getUniqueFile(m_basePath, l.begin.filename); if (fname == 0) { m_CFDG->system()->syntaxError(err); } else { m_CFDG->system()->error(); m_CFDG->system()->message("Error in %s at line %d - %s", fname, err.where.begin.line, msg.c_str()); } } else { m_CFDG->system()->error(); m_CFDG->system()->message("Error - %s", msg.c_str()); } } void Builder::error(int line, const char* msg) { yy::location loc; loc.initialize(m_currentPath); loc.begin.line = line; loc.end.line = line + 1; CfdgError err(loc, msg); const char* fname = getUniqueFile(m_basePath, loc.begin.filename); mErrorOccured = true; if (fname == 0) { m_CFDG->system()->syntaxError(err); } else { m_CFDG->system()->message("Error in %s at line %d - %s", fname, loc.begin.line, msg); } } static bool stringcompare(const char *lhs, const char *rhs) { return std::strcmp(lhs, rhs) < 0; } int Builder::StringToShape(const std::string& name, const yy::location& loc, bool colonsAllowed) { CheckName(name, loc, colonsAllowed); if (mCurrentNameSpace.length() == 0) { return m_CFDG->encodeShapeName(name); } else { static const char* const Globals[] = { "CIRCLE", "FILL", "SQUARE", "TRIANGLE" }; bool maybeGlobal = std::binary_search(Globals, Globals + 4, name.c_str(), stringcompare); std::string n(mCurrentNameSpace); n.append(name); if (maybeGlobal && m_CFDG->tryEncodeShapeName(n) == -1) return m_CFDG->encodeShapeName(name); else return m_CFDG->encodeShapeName(n); } } // Switch parser input to a new file void Builder::IncludeFile(const std::string& fname) { std::string path = m_CFDG->system()->relativeFilePath(*m_currentPath, fname.c_str()); std::istream* input = m_CFDG->system()->openFileForRead(path); if (!input || !input->good()) { delete input; input = 0; m_CFDG->system()->error(); mErrorOccured = true; m_CFDG->system()->message("Couldn't open rules file %s", path.c_str()); return; } m_CFDG->fileNames.push_back(path); m_currentPath = &(m_CFDG->fileNames.back()); m_filesToLoad.push(m_currentPath); m_streamsToLoad.push(input); m_includeNamespace.push(false); ++m_pathCount; ++mIncludeDepth; mCurrentShape = -1; SetShape(NULL); m_CFDG->system()->message("Reading rules file %s", fname.c_str()); lexer->yypush_buffer_state(lexer->yy_create_buffer(input, 16384)); lexer->nextLocAction = yy::Scanner::pushLoc; } // Return parser input to previous file bool Builder::EndInclude() { bool endOfInput = mIncludeDepth == 0; SetShape(NULL); lexer->yypop_buffer_state(); lexer->nextLocAction = yy::Scanner::popLoc; --mIncludeDepth; if (m_streamsToLoad.empty()) return endOfInput; if (m_includeNamespace.top()) PopNameSpace(); delete m_streamsToLoad.top(); m_streamsToLoad.pop(); m_filesToLoad.pop(); m_includeNamespace.pop(); m_currentPath = m_filesToLoad.empty() ? NULL : m_filesToLoad.top(); return endOfInput; } // Store parsed contents of startshape lines void Builder::Initialize(rep_ptr init) { m_CFDG->setInitialShape(init, mIncludeDepth); } void Builder::SetShape(AST::ASTshape* s, bool isPath) { if (s == NULL) { mCurrentShape = -1; return; } if (m_CFDG->findFunction(s->mNameIndex)) CfdgError::Warning(s->mLocation, "There is a function with the same name as this shape"); mCurrentShape = s->mNameIndex; if (s->mShapeSpec.argSize && m_CFDG->getShapeHasNoParams(mCurrentShape)) mWant2ndPass = true; const char* err = m_CFDG->setShapeParams(mCurrentShape, s->mRules, s->mShapeSpec.argSize, isPath); if (err) { mErrorOccured = true; warning(s->mLocation, err); } } void Builder::AddRule(ASTrule* rule) { bool isShapeItem = rule->mNameIndex == -1; if (isShapeItem) rule->mNameIndex = mCurrentShape; else mCurrentShape = -1; if (rule->mNameIndex == -1) { CfdgError::Error(rule->mLocation, "Shape rules/paths must follow a shape declaration"); return; } int type = m_CFDG->getShapeType(rule->mNameIndex); if ((rule->isPath && type == CFDGImpl::ruleType) || (!rule->isPath && type == CFDGImpl::pathType)) CfdgError::Error(rule->mLocation, "Cannot mix rules and shapes with the same name."); if (rule->isPath && type != CFDGImpl::newShape) CfdgError::Error(rule->mLocation, "A given path can only be defined once"); bool matchesShape = m_CFDG->addRule(rule); if (!isShapeItem && matchesShape) CfdgError::Error(rule->mLocation, "Rule/path name matches existing shape name"); } void Builder::NextParameterDecl(const std::string& type, const std::string& name, const yy::location& typeLoc, const yy::location& nameLoc) { int nameIndex = StringToShape(name, nameLoc, false); CheckVariableName(nameIndex, nameLoc, true); mParamDecls.addParameter(type, nameIndex, typeLoc, nameLoc); } void Builder::NextParameter(const std::string& name, exp_ptr e, const yy::location& nameLoc, const yy::location& expLoc) { bool isFunction = false; if (!mContainerStack.empty() && mContainerStack.back() == &mParamDecls) { pop_repContainer(NULL); // pop mParamDecls mParamDecls.mParameters.clear(); mParamDecls.mStackCount = 0; isFunction = true; } if (strncmp(name.c_str(), "CF::", 4) == 0) { if (isFunction) CfdgError::Error(nameLoc, "Configuration parameters cannot be functions"); if (!mContainerStack.back()->isGlobal) CfdgError::Error(nameLoc, "Configuration parameters must be at global scope"); if (name == "CF::Impure") { double v = 0.0; if (!e->isConstant || e->evaluate(&v, 1) != 1) { CfdgError::Error(expLoc, "CF::Impure requires a constant numeric expression"); } else { ASTparameter::Impure = v != 0.0; } return; } if (name == "CF::AllowOverlap") { double v = 0.0; if (!e->isConstant || e->evaluate(&v, 1) != 1) { CfdgError::Error(expLoc, "CF::AllowOverlap requires a constant numeric expression"); } else { mAllowOverlap = v != 0.0; } return; } e.reset(e.release()->simplify()); if (!m_CFDG->addParameter(name, e, mIncludeDepth)) warning(nameLoc, "Unknown configuration parameter"); if (name == "CF::MaxNatural") { const ASTexpression* max = m_CFDG->hasParameter("CF::MaxNatural"); double v = -1.0; if (!max || !max->isConstant || max->mType != ASTexpression::NumericType || max->evaluate(&v, 1) != 1) { CfdgError::Error(max->where, "CF::MaxNatural requires a constant numeric expression"); } else if (v < 1.0 || (v - 1.0) == v) { error(max->where, (v < 1.0) ? "CF::MaxNatural must be >= 1" : "CF::MaxNatural must be < 9007199254740992"); } else { MaxNatural = v; } } return; } int nameIndex = StringToShape(name, nameLoc, false); ASTdefine* def = m_CFDG->findFunction(nameIndex); yy::location defLoc = nameLoc + expLoc; if (isFunction) { assert(def); if (mCompilePhase == 1) return; if (def->mExpression->isNatural && !e->isNatural) { CfdgError::Error(expLoc, "Mismatch between declared natural and defined not-natural type of user function"); } delete def->mExpression; // Replace placeholder with actual expression def->mExpression = mWant2ndPass ? e.release() : e.release()->simplify(); def->isConstant = def->mExpression->isConstant; def->mLocation = defLoc; if (def->mExpression->mType != def->mType) { CfdgError::Error(expLoc, "Mismatch between declared and defined type of user function"); } else { if (def->mType == ASTexpression::NumericType && def->mTuplesize != def->mExpression->evaluate(0, 0)) { CfdgError::Error(expLoc, "Mismatch between declared and defined vector length of user function"); } } return; } else if (def) { CfdgError::Error(nameLoc, "Definition with same name as user function"); CfdgError::Error(def->mLocation, " user function definition is here."); def = 0; } CheckVariableName(nameIndex, nameLoc, false); if (ASTmodification* m = dynamic_cast (e.get())) { mod_ptr mod(m); e.release(); def = new ASTdefine(name, mod, defLoc); } else { def = new ASTdefine(name, e, defLoc); } ASTrepContainer* top = mContainerStack.back(); ASTparameter& b = top->addParameter(nameIndex, def, nameLoc, expLoc); if (!b.mDefinition) { b.mStackIndex = mLocalStackDepth; mContainerStack.back()->mStackCount += b.mTuplesize; mLocalStackDepth += b.mTuplesize; push_rep(def); } } ASTexpression* Builder::MakeVariable(const std::string& name, const yy::location& loc) { std::map::iterator flagItem = FlagNames.find(name); if (flagItem != FlagNames.end()) { ASTreal* flag = new ASTreal((double)(flagItem->second), loc); flag->mType = ASTexpression::FlagType; return flag; } if (strncmp(name.c_str(), "CF::", 4) == 0) CfdgError::Error(loc, "Configuration parameter names are reserved"); int varNum = StringToShape(name, loc, true); bool isGlobal = false; const ASTparameter* bound = findExpression(varNum, isGlobal); if (bound == 0) { return new ASTruleSpecifier(varNum, name, exp_ptr(), loc, m_CFDG->getShapeParams(varNum), m_CFDG->getShapeParams(mCurrentShape)); } if (bound->mStackIndex == -1) { assert(bound->mDefinition); switch (bound->mType) { case ASTexpression::NumericType: { double data[9]; bool natural = bound->isNatural; int valCount = bound->mDefinition->mExpression->evaluate(data, 9); if (valCount != bound->mTuplesize) CfdgError::Error(loc, "Unexpected compile error."); // this also shouldn't happen // Create a new cons-list based on the evaluated variable's expression ASTreal* top = new ASTreal(data[0], bound->mDefinition->mExpression->where); top->text = name; // use variable name for entropy ASTexpression* list = top; for (int i = 1; i < valCount; ++i) { ASTreal* next = new ASTreal(data[i], bound->mDefinition->mExpression->where); list = list->append(next); } list->isNatural = natural; return list; } case ASTexpression::ModType: return new ASTmodification(bound->mDefinition->mChildChange, loc); case ASTexpression::RuleType: { // This must be bound to an ASTruleSpecifier, otherwise it would not be constant if (const ASTruleSpecifier* r = dynamic_cast (bound->mDefinition->mExpression)) { return new ASTruleSpecifier(r->shapeType, name, exp_ptr(), loc, NULL, NULL); } else { CfdgError::Error(loc, "Internal error computing bound rule specifier"); return new ASTruleSpecifier(varNum, name, exp_ptr(), loc, NULL, NULL); } } default: break; } } else { if (bound->mType == ASTexpression::RuleType) { return new ASTruleSpecifier(name, loc, bound->mStackIndex - mLocalStackDepth); } ASTvariable* v = new ASTvariable(varNum, name, loc); v->count = bound->mType == ASTexpression::NumericType ? bound->mTuplesize : 1; v->stackIndex = bound->mStackIndex - (isGlobal ? 0 : mLocalStackDepth); v->mType = bound->mType; v->isNatural = bound->isNatural; v->isLocal = bound->isLocal; v->isParameter = bound->isParameter; return v; } CfdgError::Error(loc, "Cannot determine what to do with this variable."); return new ASTexpression(loc); } ASTexpression* Builder::MakeArray(AST::str_ptr name, AST::exp_ptr args, const yy::location& nameLoc, const yy::location& argsLoc) { if (strncmp(name->c_str(), "CF::", 4) == 0) CfdgError::Error(nameLoc, "Configuration parameter names are reserved"); int varNum = StringToShape(*name, nameLoc, true); bool isGlobal = false; const ASTparameter* bound = findExpression(varNum, isGlobal); if (bound == 0) { CfdgError::Error(nameLoc, "Cannot find variable or parameter with this name"); return args.release(); } else if (bound->mType != ASTexpression::NumericType) { CfdgError::Error(nameLoc, "This is not a numeric vector"); return args.release(); } ASTexpression* ret = new ASTarray(bound, args, isGlobal ? 0 : mLocalStackDepth, nameLoc + argsLoc, *name); return mWant2ndPass ? ret : ret->simplify(); } ASTexpression* Builder::MakeLet(const yy::location& letLoc, exp_ptr exp) { ASTexpression* args = NULL; ASTrepContainer* lastContainer = mContainerStack.back(); for (ASTbody::iterator it = lastContainer->mBody.begin(), eit = lastContainer->mBody.end(); it != eit; ++it) { if (const ASTdefine* cdef = dynamic_cast(*it)) { ASTdefine* def = const_cast(cdef); args = ASTexpression::Append(args, def->mExpression); def->mExpression = 0; } } static const std::string name("let"); yy::location defLoc = exp->where; ASTdefine* def = new ASTdefine(name, exp, defLoc); for (ASTparameters::iterator it = lastContainer->mParameters.begin(), eit = lastContainer->mParameters.end(); it != eit; ++it) { // copy the non-constant definitions if (!(it->mDefinition)) def->mParameters.push_back(*it); } def->mStackCount = lastContainer->mStackCount; def->isFunction = true; pop_repContainer(NULL); return new ASTlet(args, def, letLoc, defLoc); } ASTruleSpecifier* Builder::MakeRuleSpec(const std::string& name, exp_ptr args, const yy::location& loc) { if (name == "if" || name == "let" || name == "select") { if (args->mType != ASTexpression::RuleType) CfdgError::Error(args->where, "Function does not return a shape"); if (name == "select") { yy::location argsLoc = args->where; args.reset(new ASTselect(args, argsLoc, false)); } ASTruleSpecifier* spec = new ASTruleSpecifier(args, loc); return mWant2ndPass ? spec : static_cast(spec->simplify()); } int nameIndex = StringToShape(name, loc, true); bool isGlobal = false; ASTdefine* def = m_CFDG->findFunction(nameIndex); if (def) { if (def->mType != ASTexpression::RuleType) { yy::location nameLoc = loc; if (args.get()) nameLoc.end = args->where.begin; CfdgError::Error(nameLoc, "Function does not return a shape"); } else { args.reset(new ASTuserFunction(args.release(), def, loc)); } ASTruleSpecifier* spec = new ASTruleSpecifier(args, loc); return mWant2ndPass ? spec : static_cast(spec->simplify()); } const ASTparameter* bound = findExpression(nameIndex, isGlobal); if (bound == 0 || bound->mType != ASTexpression::RuleType) { m_CFDG->setShapeHasNoParams(nameIndex, args.get()); ASTruleSpecifier* spec = new ASTruleSpecifier(nameIndex, name, args, loc, m_CFDG->getShapeParams(nameIndex), m_CFDG->getShapeParams(mCurrentShape)); return mWant2ndPass ? spec : static_cast(spec->simplify()); } if (args.get() != NULL) CfdgError::Error(loc, "Cannot bind parameters twice"); if (bound->mStackIndex == -1) { // This must be bound to an ASTruleSpecifier, otherwise it would not be constant if (const ASTruleSpecifier* r = dynamic_cast (bound->mDefinition->mExpression)) { return new ASTruleSpecifier(r, name, loc); } else { CfdgError::Error(loc, "Internal error computing bound rule specifier"); return new ASTruleSpecifier(nameIndex, name, args, loc, NULL, NULL); } } return new ASTruleSpecifier(name, loc, bound->mStackIndex - (isGlobal ? 0 : mLocalStackDepth)); } void Builder::MakeModTerm(ASTtermArray& dest, term_ptr t) { if (t.get() == NULL) return; if (t->modType == ASTmodTerm::time) timeWise(); if (t->modType == ASTmodTerm::sat || t->modType == ASTmodTerm::satTarg) inColor(); if (mCompilePhase == 2 && t->modType >= ASTmodTerm::hueTarg && t->modType <= ASTmodTerm::targAlpha) CfdgError::Error(t->where, "Color target feature unavailable in v3 syntax"); int argcount = 0; if (t->args && t->args->mType == ASTexpression::NumericType) argcount = t->args->evaluate(0, 0); // Try to merge consecutive x and y adjustments if (argcount == 1 && t->modType == ASTmodTerm::y && !dest.empty()) { ASTmodTerm* last = dest.back(); if (last->modType == ASTmodTerm::x && last->args->evaluate(0, 0) == 1) { last->args = last->args->append(t->args); t->args = NULL; return; // delete ASTmodTerm t } } if (argcount != 3 || (t->modType != ASTmodTerm::size && t->modType != ASTmodTerm::x)) { dest.push_back(t.release()); return; } // Try to split the XYZ term into an XY term and a Z term. Drop the XY term // if it is the identity. First try an all-constant route, then try to tease // apart the arguments. double d[3]; if (t->args->isConstant && t->args->evaluate(d, 3) == 3) { delete t->args; t->args = new ASTcons(new ASTreal(d[0], t->where), new ASTreal(d[1], t->where)); ASTmodTerm::modTypeEnum ztype = t->modType == ASTmodTerm::size ? ASTmodTerm::zsize : ASTmodTerm::z; ASTmodTerm* zmod = new ASTmodTerm(ztype, new ASTreal(d[2], t->where), t->where); // Check if xy part is the identity transform and only save it if it is not if (d[0] != 1.0 || d[1] != 1.0) dest.push_back(t.release()); dest.push_back(zmod); return; } if (t->args->size() > 1) { ASTexpression* xyargs = 0; int i = 0; for (; i < t->args->size(); ++i) { xyargs = ASTexpression::Append(xyargs, (*t->args)[i]); if (xyargs->evaluate(0, 0) >= 2) break; } if (xyargs && xyargs->evaluate(0, 0) == 2 && i == t->args->size() - 1) { // We have successfully split the 3-tuple into a 2-tuple and a scalar ASTexpression* zargs = (*t->args)[i]; t->args->release(); delete t->args; t->args = xyargs; ASTmodTerm::modTypeEnum ztype = t->modType == ASTmodTerm::size ? ASTmodTerm::zsize : ASTmodTerm::z; ASTmodTerm* zmod = new ASTmodTerm(ztype, zargs, t->where); double d[2]; if (t->modType != ASTmodTerm::size || !xyargs->isConstant || xyargs->evaluate(d, 2) != 2 || d[0] != 1.0 || d[1] != 1.0) { // Check if xy part is the identity transform and only save it if it is not dest.push_back(t.release()); } dest.push_back(zmod); return; } } t->modType = t->modType == ASTmodTerm::size ? ASTmodTerm::sizexyz : ASTmodTerm::xyz; dest.push_back(t.release()); } rep_ptr Builder::MakeElement(const std::string& s, mod_ptr mods, exp_ptr params, const yy::location& loc, bool subPath) { if (mInPathContainer && !subPath && (s == "FILL" || s == "STROKE")) return rep_ptr(new ASTpathCommand(s, mods, params, loc)); ruleSpec_ptr r(MakeRuleSpec(s, params, loc)); ASTreplacement::repElemListEnum t = ASTreplacement::replacement; if (r->argSource == ASTruleSpecifier::ParentArgs) r->argSource = ASTruleSpecifier::SimpleParentArgs; if (mInPathContainer) { if (!subPath) { error(loc, "Replacements are not allowed in paths"); } else if (r->argSource == ASTruleSpecifier::StackArgs) { // Parameter subpaths must be all ops, but we must check at runtime t = ASTreplacement::op; } else if (m_CFDG->getShapeType(r->shapeType) == CFDGImpl::pathType) { const ASTrule* rule = m_CFDG->findRule(r->shapeType); if (rule) { t = (ASTreplacement::repElemListEnum)rule->mRuleBody.mRepType; } else { error(loc, "Subpath references must be to previously declared paths"); } } else if (primShape::isPrimShape(r->shapeType)){ t = ASTreplacement::op; } else { error(loc, "Subpath references must be to previously declared paths"); } } return rep_ptr(new ASTreplacement(*r, r->entropyVal, mods, loc, t)); } AST::ASTexpression* Builder::MakeFunction(str_ptr name, exp_ptr args, const yy::location& nameLoc, const yy::location& argsLoc, bool consAllowed) { int nameIndex = StringToShape(*name, nameLoc, true); AST::ASTdefine* func = m_CFDG->findFunction(nameIndex); if (func) { return new ASTuserFunction(args.release(), func, nameLoc); } bool dummy; const ASTparameter* bound = findExpression(nameIndex, dummy); if (bound) { if (!consAllowed) error(nameLoc + argsLoc, "Cannot bind expression to variable/parameter"); return MakeVariable(*name, nameLoc)->append(args.release()); } if (*name == "select" || *name == "if") { ASTselect* sel = new ASTselect(args, nameLoc + argsLoc, *name == "if"); return mWant2ndPass ? sel : sel->simplify(); } ASTfunction::FuncType t = ASTfunction::GetFuncType(*name); if (t == ASTfunction::Ftime || t == ASTfunction::Frame) m_CFDG->addParameter(CFDGImpl::FrameTime); if (t != ASTfunction::NotAFunction) return new ASTfunction(*name, args, mSeed, nameLoc, argsLoc); const ASTparameters* p = m_CFDG->getShapeParams(nameIndex); if (p) { if (!(p->empty())) { ASTruleSpecifier* spec = new ASTruleSpecifier(nameIndex, *name, args, nameLoc + argsLoc, p, m_CFDG->getShapeParams(mCurrentShape)); return mWant2ndPass ? spec : static_cast(spec->simplify()); } if (consAllowed) { ASTruleSpecifier* r = new ASTruleSpecifier(nameIndex, *name, exp_ptr(), nameLoc, p, m_CFDG->getShapeParams(mCurrentShape)); ASTexpression* ret = r->append(args.release()); return mWant2ndPass ? ret : ret->simplify(); } error(nameLoc + argsLoc, "Shape takes no arguments"); } // At this point we don't know if this is a typo or a to-be-defined shape or // user function if (mCompilePhase == 1) { mWant2ndPass = true; } else { error(nameLoc + argsLoc, "Doesn't match a known shape or user function"); } // Just return this, it will get dropped eventually return new ASTruleSpecifier(nameIndex, *name, args, nameLoc + argsLoc, p, m_CFDG->getShapeParams(mCurrentShape)); } AST::ASTmodification* Builder::MakeModification(mod_ptr mod, const yy::location& loc, bool canonical) { for (ASTtermArray::iterator it = mod->modExp.begin(), eit = mod->modExp.end(); it != eit; ++it) { std::string ent; (*it)->entropy(ent); mod->addEntropy(ent); if (!mWant2ndPass) *it = static_cast((*it)->simplify()); } if (canonical) mod->makeCanonical(); mod->evalConst(); mod->isConstant = mod->modExp.empty(); mod->where = loc; return mod.release(); } void Builder::push_repContainer(ASTrepContainer& c) { mContainerStack.push_back(&c); process_repContainer(c); } void Builder::push_paramDecls(const std::string& name, const yy::location& defLoc, const std::string& type) { { for (ASTparameters::iterator it = mParamDecls.mParameters.begin(), eit = mParamDecls.mParameters.end(); it != eit; ++it) { it->isLocal = true; } push_repContainer(mParamDecls); if (mCompilePhase != 1) return; // Create the ASTdefine before the expression is known so that the // expression can use recursion. Create a placeholder expression // that will be deleted when the real expression is parsed. int nameIndex = StringToShape(name, defLoc, false); ASTparameter p; p.init(type, nameIndex); exp_ptr r; switch (p.mType) { case ASTexpression::NumericType: { ASTexpression* num = new ASTreal(p.isNatural ? 1.0 : 1.5, defLoc); num->isConstant = false; for (int i = 1; i < p.mTuplesize; ++i) num = num->append(new ASTreal(1.5, defLoc)); r.reset(num); break; } case ASTexpression::ModType: r.reset(new ASTmodification(defLoc)); break; case ASTexpression::NoType: case ASTexpression::FlagType: CfdgError::Warning(defLoc, "Unsupported function type"); // fall through case ASTexpression::RuleType: r.reset(new ASTruleSpecifier()); break; } ASTdefine* def = new ASTdefine(name, r, defLoc); def->mParameters = mParamDecls.mParameters; def->mStackCount = mParamDecls.mStackCount; def->isFunction = true; AST::ASTdefine* prev = m_CFDG->declareFunction(nameIndex, def); if (prev != def) { assert(prev); mErrorOccured = true; warning(defLoc, "Redefinition of user functions is not allowed"); warning(prev->mLocation, "Previous user function definition is here"); delete def; } if (m_CFDG->getShapeParams(nameIndex)) CfdgError::Warning(defLoc, "User function name matches a shape name"); } } void Builder::process_repContainer(ASTrepContainer& c) { for (ASTparameters::iterator it = c.mParameters.begin(), eit= c.mParameters.end(); it != eit; ++it) { if (it->isParameter || !it->mDefinition) { it->mStackIndex = mLocalStackDepth; c.mStackCount += it->mTuplesize; mLocalStackDepth += it->mTuplesize; } } } void Builder::pop_repContainer(ASTreplacement* r) { if (m_CFDG) m_CFDG->reportStackDepth(mLocalStackDepth); assert(!mContainerStack.empty()); ASTrepContainer* lastContainer = mContainerStack.back(); mLocalStackDepth -= lastContainer->mStackCount; if (r) { r->mRepType |= lastContainer->mRepType; if (r->mPathOp == unknownPathop) r->mPathOp = lastContainer->mPathOp; } for (ASTparameters::iterator it = lastContainer->mParameters.begin(), eit = lastContainer->mParameters.end(); it != eit; ++it) { // delete the constant definitions, but not functions if (it->mDefinition && !it->mDefinition->isFunction) { delete it->mDefinition; it->mDefinition = 0; } } mContainerStack.pop_back(); } static bool badContainer(int containerType) { return (containerType & (ASTreplacement::op | ASTreplacement::replacement)) == (ASTreplacement::op | ASTreplacement::replacement); } void Builder::push_rep(ASTreplacement* r, bool global) { if (r == 0) return; ASTrepContainer* container = mContainerStack.back(); container->mBody.push_back(r); if (container->mPathOp == unknownPathop) container->mPathOp = r->mPathOp; int oldType = container->mRepType; container->mRepType = oldType | r->mRepType; if (badContainer(container->mRepType) && !badContainer(oldType) && !global) error(r->mLocation, "Cannot mix path elements and replacements in the same container"); } ASTparameter* Builder::findExpression(int nameIndex, bool& isGlobal) { for (ContainerStack_t::reverse_iterator cit = mContainerStack.rbegin(); cit != mContainerStack.rend(); ++cit) { for (ASTparameters::reverse_iterator pit = (*cit)->mParameters.rbegin(); pit != (*cit)->mParameters.rend(); ++pit) { if (pit->mName == nameIndex) { isGlobal = (*cit)->isGlobal; return &(*pit); } } } return 0; } void Builder::PushNameSpace(AST::str_ptr n, const yy::location& loc) { if (n->compare("CF") == 0) { error(loc, "CF namespace is reserved"); return; } if (n->length() == 0) { error(loc, "zero-length namespace"); return; } CheckName(*n, loc, false); m_includeNamespace.top() = true; mCurrentNameSpace.append(*n); mCurrentNameSpace.append("::"); } // delete n void Builder::PopNameSpace() { mCurrentNameSpace.resize(mCurrentNameSpace.length() - 2); size_t end = mCurrentNameSpace.find_last_of(':'); if (end == std::string::npos) { mCurrentNameSpace.clear(); } else { mCurrentNameSpace.resize(end + 1); } } void Builder::CheckVariableName(int index, const yy::location& loc, bool param) { if (mAllowOverlap && !param) return; const ASTrepContainer* thisLevel = param ? &mParamDecls : mContainerStack.back(); for (ASTparameters::const_reverse_iterator pit = thisLevel->mParameters.rbegin(), epit = thisLevel->mParameters.rend(); pit != epit; ++pit) { if (pit->mName == index) { warning(loc, "Scope of name overlaps variable/parameter with same name"); warning(pit->mLocation, "previous variable/parameter declared here"); } } } void Builder::CheckName(const std::string& name, const yy::location& loc, bool colonsAllowed) { size_t pos = name.find_first_of(':'); if (pos == std::string::npos) return; if (!colonsAllowed) { error(loc, "namespace specification not allowed in this context"); return; } if (pos == 0) { error(loc, "improper namespace specification"); return; } for(;;) { if (pos == name.length() - 1 || name[pos + 1] != ':') break; size_t next = name.find_first_of(':', pos + 2); if (next == std::string::npos) return; if (next == pos + 2) break; pos = next; } error(loc, "improper namespace specification"); } void Builder::inColor() { m_CFDG->addParameter(CFDGImpl::Color); } void Builder::timeWise() { m_CFDG->addParameter(CFDGImpl::Time); } contextfree-3.0.5+dfsg1.orig/src-common/test-main.cpp0000644000175000017500000000206212076364074021123 0ustar brambram// test-main.cpp // this file is part of Context Free // --------------------- // Copyright (C) 2007 Mark Lentczner - markl@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // Mark Lentczner can be contacted at markl@glyphic.com or at // Mark Lentczner, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #include "test.h" int main() { return Test::runAll(false, false) ? 0 : 1; } contextfree-3.0.5+dfsg1.orig/src-common/cfdgimpl.h0000644000175000017500000001314712076364074020462 0ustar brambram// cfdgimpl.h // this file is part of Context Free // --------------------- // Copyright (C) 2006-2008 Mark Lentczner - markl@glyphic.com // Copyright (C) 2006-2012 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // Mark Lentczner can be contacted at markl@glyphic.com or at // Mark Lentczner, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #ifndef INCLUDE_CFDGIMPL_H #define INCLUDE_CFDGIMPL_H #include #include #include #include #include "agg_color_rgba.h" #include "cfdg.h" #include "shape.h" #include "astreplacement.h" class CFDGImpl : public CFDG { public: enum {newShape = 0, ruleType = 1, pathType = 2}; private: Shape m_initialShape; AST::rep_ptr mInitShape; unsigned mInitShapeDepth; agg::rgba m_backgroundColor; int mStackSize; std::vector mRules; std::map mFunctions; static void deleteFunction(std::pair& p); struct ShapeType { std::string name; bool hasRules; bool isShape; int shapeType; AST::ASTparameters* parameters; int argSize; bool shouldHaveNoParams; ShapeType(const std::string& s) : name(s), hasRules(false), isShape(false), shapeType(newShape), parameters(0), argSize(0), shouldHaveNoParams(false) { } }; static void deleteShapeParams(ShapeType& s); std::vector m_shapeTypes; AbstractSystem* m_system; bool m_secondPass; int m_Parameters; typedef std::pair ConfigParam; std::map m_ConfigParameters; static void deleteConfigParam(std::pair& p); double m_minSize; double m_minArea; Modification mTileMod; Modification mSizeMod; Modification mTimeMod; agg::point_d mTileOffset; AST::ASTrule needle; public: CFDGImpl(AbstractSystem*); CFDGImpl(CFDGImpl* c); virtual ~CFDGImpl(); virtual Renderer* renderer( int width, int height, double minSize, int variation, double border = 2.0); bool isTiled(agg::trans_affine* tr = 0, double* x = 0, double* y = 0) const; frieze_t isFrieze(agg::trans_affine* tr = 0, double* x = 0, double* y = 0) const; bool isSized(double* x = 0, double* y = 0) const; bool isTimed(agg::trans_affine_time* t = 0) const; const agg::rgba& getBackgroundColor(Renderer* r); void getSymmetry(AST::SymmList& syms, Renderer* r); const AST::ASTexpression* hasParameter(const char* name) const; bool hasParameter(const char* name, double& value, Renderer* r) const; bool hasParameter(const char* name, Modification& value, Renderer* r) const; bool hasParameter(const char* name, AST::ASTexpression::expType t, yy::location& where) const; public: AbstractSystem* system() { return m_system; } void setInitialShape(AST::rep_ptr init, unsigned depth); const Shape& getInitialShape(Renderer* r); RGBA8 getColor(const HSBColor& hsb); bool addRule(AST::ASTrule* r); void rulesLoaded(); int numRules(); const AST::ASTrule* findRule(int shapetype, double r); const AST::ASTrule* findRule(int shapetype); std::string decodeShapeName(int shapetype); int encodeShapeName(const std::string& s); int tryEncodeShapeName(const std::string& s) const; int getShapeType(const std::string& s); int getShapeType(int shapetype); bool shapeHasRules(int shapetype); const char* setShapeParams(int shapetype, AST::ASTrepContainer& p, int size, bool isPath); void setShapeHasNoParams(int shapetype, const AST::ASTexpression* args); bool getShapeHasNoParams(int shapetype); const AST::ASTparameters* getShapeParams(int shapetype); int getShapeParamSize(int shapetype); int reportStackDepth(int size = 0); void resetCachedPaths(); AST::ASTdefine* declareFunction(int nameIndex, AST::ASTdefine* def); AST::ASTdefine* findFunction(int nameIndex); enum Parameter {Color = 1, Alpha = 2, Time = 4, FrameTime = 8}; void addParameter(Parameter); bool addParameter(std::string name, AST::exp_ptr e, unsigned depth); std::vector mParamList; AST::ASTrepContainer mCFDGcontents; std::list fileNames; }; #endif // INCLUDE_CFDGIMPL_H contextfree-3.0.5+dfsg1.orig/src-common/stacktype.cpp0000644000175000017500000002763012076364074021241 0ustar brambram// stacktype.cpp // this file is part of Context Free // --------------------- // Copyright (C) 2011-2013 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // // Parameter block layout in memory: // param + 0: ruleHeader (shape name, parameter count, reference count) // param + 8: typeinfo pointer // param + 16: 1st parameter // param + 8*n: 2nd parameter // ... // Numeric parameters use one 8-byte block // Numeric vector parameters use n 8-bytes blocks // Modification parameters use 22 8-byte blocks // Rule parameters use one 8-byte block, which contains a pointer to the // ruleHeader of another parameter block // // If the rule header indicates that the parameter count is zero then there // are no typeinfo or parameter blocks, just one block for the rule header. // The parameter count is not the number of parameters, it is the number of // 8-byte blocks required to contain the parameters // Parameter block layout in files: // The parameter block is the root of a tree of parameter blocks. This tree // is traversed depth first. Rule parameters are encoded in the same manner as // the root parameter token (except no zero): rule parameters that are owned by // some other object are written out as memory pointers, otherwise the parameter // block for the rule parameter is interpolated directly into the parent // parameter block as a header token followed by the rest of the child parameter // block. The remainder of the parameters continue after the child parameter block // (which may itself have grandchild parameter blocks). // // Note: only the root parameter token can be zero when there are no parameters. // Non-root parameter token nodes will have be a header token with a parameter // count of zero if they correspond to a rule with no parameters. #include "stacktype.h" #include "cfdg.h" #include #include "astexpression.h" #include #include class const_iterator { public: const StackType* _Ptr; std::vector::const_iterator _Iter; std::vector::const_iterator _End; const_iterator() : _Ptr(0) {} const_iterator(const StackType* s) : _Ptr(s) { if (_Ptr && _Ptr->ruleHeader.mParamCount) { const AST::ASTparameters* p = (s + 1)->typeInfo; _Iter = p->begin(); _End = p->end(); _Ptr += 2; } else { _Ptr = 0; } } const_iterator(const StackType* s, const std::vector* p) : _Ptr(s) { if (_Ptr) { _Iter = p->begin(); _End = p->end(); } } const StackType& operator*() const { return *_Ptr; } const StackType* operator->() const { return _Ptr; } const StackType& operator++() { if (_Ptr) { _Ptr += _Iter->mTuplesize; ++_Iter; if (_Iter == _End) _Ptr = 0; } return *_Ptr; } const StackType& operator++(int) { const StackType* tmp = _Ptr; ++(*this); return *tmp; } bool operator==(const const_iterator& o) const { return _Ptr == o._Ptr; } bool operator!=(const const_iterator& o) const { return _Ptr != o._Ptr; } const AST::ASTparameter& type() const { return *_Iter; } static const_iterator begin(const StackType* s) { return const_iterator(s); } static const_iterator begin(const StackType* s, const std::vector* p) { return const_iterator(s, p); } static const_iterator end() { return const_iterator(); } }; class iterator { public: StackType* _Ptr; AST::ASTparameters::const_iterator _Iter; AST::ASTparameters::const_iterator _End; iterator() : _Ptr(0) {} iterator(StackType* s) : _Ptr(s) { if (_Ptr && _Ptr->ruleHeader.mParamCount) { const AST::ASTparameters* p = (s + 1)->typeInfo; _Iter = p->begin(); _End = p->end(); _Ptr += 2; } else { _Ptr = 0; } } iterator(StackType* s, const std::vector* p) : _Ptr(s) { if (_Ptr) { _Iter = p->begin(); _End = p->end(); } } StackType& operator*() { return *_Ptr; } StackType* operator->() { return _Ptr; } StackType& operator++() { if (_Ptr) { _Ptr += _Iter->mTuplesize; ++_Iter; if (_Iter == _End) _Ptr = 0; } return *_Ptr; } StackType& operator++(int) { StackType* tmp = _Ptr; ++(*this); return *tmp; } bool operator==(const iterator& o) const { return _Ptr == o._Ptr; } bool operator!=(const iterator& o) const { return _Ptr != o._Ptr; } const AST::ASTparameter& type() const { return *_Iter; } static iterator begin(StackType* s) { return iterator(s); } static iterator begin(StackType* s, const std::vector* p) { return iterator(s, p); } static iterator end() { return iterator(); } }; #define assert_static(e) \ do { \ enum { assert_static__ = 1/((int)(e)) }; \ } while (0) StackType* StackType::alloc(int name, int size, const std::vector* ti) { assert_static(sizeof(StackType) == sizeof(double)); StackType* newrule = new StackType[size ? size + 2 : 1]; assert((((size_t)newrule) & 3) == 0); // confirm 32-bit alignment newrule[0].ruleHeader.mRuleName = name; newrule[0].ruleHeader.mRefCount = 0; newrule[0].ruleHeader.mParamCount = size; if (size) newrule[1].typeInfo = ti; return newrule; } // Release arguments on the heap void StackType::release() const { if (ruleHeader.mRefCount == 0) { for (const_iterator it = const_iterator::begin(this), e = const_iterator::end(); it != e; ++it) if (it.type().mType == AST::ASTexpression::RuleType) it->rule->release(); delete[] this; return; } if (ruleHeader.mRefCount < StackRule::MaxRefCount) --(ruleHeader.mRefCount); } // Release arguments on the stack void StackType::release(const std::vector* p) const { for (const_iterator it = const_iterator::begin(this, p), e = const_iterator::end(); it != e; ++it) if (it.type().mType == AST::ASTexpression::RuleType) it->rule->release(); } void StackType::retain(Renderer* r) const { if (ruleHeader.mRefCount == StackRule::MaxRefCount) return; ++(ruleHeader.mRefCount); if (ruleHeader.mRefCount == StackRule::MaxRefCount) { r->storeParams(this); } } bool StackRule::operator==(const StackRule& o) const { if (this == &o) return true; if (mParamCount != o.mParamCount) return false; return std::memcmp((const void*)(this + 2), (const void*)(&o + 2), sizeof(StackType)*(mParamCount)) == 0; } bool StackRule::Equal(const StackRule* a, const StackType* b) { if (a == NULL && b == NULL) return true; if (a == NULL || b == NULL) return false; return (*a) == (b->ruleHeader); } void StackType::read(std::istream& is) { if (ruleHeader.mParamCount == 0) return; is.read((char*)(&((this+1)->typeInfo)), sizeof(AST::ASTparameters*)); for (iterator it = iterator::begin(this), e = iterator::end(); it != e; ++it) { switch (it.type().mType) { case AST::ASTexpression::NumericType: case AST::ASTexpression::ModType: is.read((char*)(&*it), it.type().mTuplesize * sizeof(StackType)); break; case AST::ASTexpression::RuleType: it->rule = readHeader(is); break; default: assert(false); break; } } } void StackType::write(std::ostream& os) const { uint64_t head = ruleHeader.mRuleName << 24 | ruleHeader.mParamCount << 8 | 0xff; os.write((char*)(&head), sizeof(uint64_t)); if (ruleHeader.mParamCount == 0) return; os.write((char*)(&((this+1)->typeInfo)), sizeof(AST::ASTparameters*)); for (const_iterator it = const_iterator::begin(this), e = const_iterator::end(); it != e; ++it) { switch (it.type().mType) { case AST::ASTexpression::NumericType: case AST::ASTexpression::ModType: os.write((char*)(&*it), it.type().mTuplesize * sizeof(StackType)); break; case AST::ASTexpression::RuleType: writeHeader(os, it->rule); break; default: assert(false); break; } } } StackType* StackType::readHeader(std::istream& is) { uint64_t size = 0; is.read((char*)(&size), sizeof(uint64_t)); if (size & 3) { // Don't know the typeInfo yet, get it during read StackType* s = StackType::alloc((size >> 24) & 0xffff, (size >> 8) & 0xffff, NULL); s->read(is); return s; } else { return (StackType*)size; } } void StackType::writeHeader(std::ostream& os, const StackType* s) { if (s == NULL || s->ruleHeader.mRefCount == StackRule::MaxRefCount) { uint64_t p = (uint64_t)(s); os.write((char*)(&p), sizeof(uint64_t)); } else { s->write(os); } } static void EvalArgs(Renderer* rti, const StackType* parent, iterator& dest, iterator& end, const AST::ASTexpression* arguments, bool onStack) { for (int i = 0; i < arguments->size(); ++i, ++dest) { assert(dest != end); if (onStack) rti->mLogicalStackTop = &(*dest); const AST::ASTexpression* arg = (*arguments)[i]; switch (arg->mType) { case AST::ASTexpression::NumericType: { arg->evaluate(&(dest->number), dest.type().mTuplesize, rti); if (dest.type().isNatural && !Renderer::isNatural(rti, dest->number)) throw CfdgError(arg->where, "Expression does not evaluate to a legal natural number"); break; } case AST::ASTexpression::ModType: { int dummy; static const Modification zeroMod; Modification& m = reinterpret_cast (dest->number); m = zeroMod; arg->evaluate(m, 0, 0, false, dummy, false, rti); break; } case AST::ASTexpression::RuleType: { dest->rule = arg->evalArgs(rti, parent); break; } default: break; } } assert(dest == end); } // Evaluate arguments on the heap void StackType::evalArgs(Renderer* rti, const AST::ASTexpression* arguments, const StackType* parent) { iterator dest = iterator::begin(this); iterator end = iterator::end(); EvalArgs(rti, parent, dest, end, arguments, false); } // Evaluate arguments on the stack void StackType::evalArgs(Renderer* rti, const AST::ASTexpression* arguments, const std::vector* p, bool sequential) { iterator dest = iterator::begin(this, p); iterator end = iterator::end(); EvalArgs(rti, NULL, dest, end, arguments, sequential); } contextfree-3.0.5+dfsg1.orig/src-common/bounds.cpp0000644000175000017500000001317012076364074020516 0ustar brambram// bounds.cpp // this file is part of Context Free // --------------------- // Copyright (C) 2006-2007 Mark Lentczner - markl@glyphic.com // Copyright (C) 2006-2012 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // Mark Lentczner can be contacted at markl@glyphic.com or at // Mark Lentczner, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #include "bounds.h" #include "agg_trans_affine.h" #include "primShape.h" #include "shape.h" #include "agg_basics.h" #include "pathIterator.h" #include "ast.h" // This constructor iterates the transformed path and computes the exact bounds. // This can be expensive for curved paths. Bounds::Bounds(const agg::trans_affine& trans, pathIterator& helper, double scale, const AST::CommandInfo& attr, agg::point_d* cent, double* area) { mValid = helper.boundingRect(trans, attr, mMin_X, mMin_Y, mMax_X, mMax_Y, scale, cent, area); } Bounds Bounds::interpolate(const Bounds& other, double alpha) const { double beta = 1.0 - alpha; Bounds r; if (!mValid || !other.mValid) return r; r.mMax_X = beta * mMax_X + alpha * other.mMax_X; r.mMin_X = beta * mMin_X + alpha * other.mMin_X; r.mMax_Y = beta * mMax_Y + alpha * other.mMax_Y; r.mMin_Y = beta * mMin_Y + alpha * other.mMin_Y; r.mValid = true; return r; } Bounds Bounds::dilate(agg::point_d& cent, double dilation) const { Bounds b; b.mMin_X = dilation * (mMin_X - cent.x) + cent.x; b.mMax_X = dilation * (mMax_X - cent.x) + cent.x; b.mMin_Y = dilation * (mMin_Y - cent.y) + cent.y; b.mMax_Y = dilation * (mMax_Y - cent.y) + cent.y; b.mValid = mValid; return b; } Bounds Bounds::dilate(double dilation) const { Bounds b; agg::point_d cent((mMin_X + mMax_X) * 0.5, (mMin_Y + mMax_Y) * 0.5); b.mMin_X = dilation * (mMin_X - cent.x) + cent.x; b.mMax_X = dilation * (mMax_X - cent.x) + cent.x; b.mMin_Y = dilation * (mMin_Y - cent.y) + cent.y; b.mMax_Y = dilation * (mMax_Y - cent.y) + cent.y; b.mValid = mValid; return b; } Bounds Bounds::slewCenter(const Bounds& other, double alpha) const { Bounds r; if (!mValid || !other.mValid) return r; double offsetX = alpha * ((other.mMax_X + other.mMin_X) - (mMax_X + mMin_X)) / 2.0; double offsetY = alpha * ((other.mMax_Y + other.mMin_Y) - (mMax_Y + mMin_Y)) / 2.0; double absX = fabs(offsetX); double absY = fabs(offsetY); r.mMax_X = mMax_X + absX + offsetX; r.mMin_X = mMin_X - absX + offsetX; r.mMax_Y = mMax_Y + absY + offsetY; r.mMin_Y = mMin_Y - absY + offsetY; r.mValid = true; return r; } void Bounds::gather(const Bounds& other, double weight) { if (!other.mValid) return; if (!mValid) { mMax_X = weight * other.mMax_X; mMin_X = weight * other.mMin_X; mMax_Y = weight * other.mMax_Y; mMin_Y = weight * other.mMin_Y; mValid = true; return; } mMax_X += weight * other.mMax_X; mMin_X += weight * other.mMin_X; mMax_Y += weight * other.mMax_Y; mMin_Y += weight * other.mMin_Y; } double Bounds::computeScale(int& width, int& height, double borderX, double borderY, bool modify, agg::trans_affine* trans, bool exact) { double scale; double virtual_width = mMax_X - mMin_X; double virtual_height = mMax_Y - mMin_Y; double target_width = width - 2.0 * borderX; double target_height = height - 2.0 * borderY; if (!mValid) virtual_width = virtual_height = 1.0; int newWidth = width; int newHeight = height; if (virtual_width / target_width > virtual_height / target_height) { scale = target_width / virtual_width; newHeight = (int)floor(scale * virtual_height + 2.0 * borderY + 0.5); if (!exact) newHeight = newHeight + ((newHeight ^ height) & 0x1); if (modify) { height = newHeight; } } else { scale = target_height / virtual_height; newWidth = (int)floor(scale * virtual_width + 2.0 * borderX + 0.5); if (!exact) newWidth = newWidth + ((newWidth ^ width) & 0x1); if (modify) { width = newWidth; } } if (trans) { double offsetX = scale * (mMax_X + mMin_X) / 2.0 - newWidth / 2.0; double offsetY = scale * (mMax_Y + mMin_Y) / 2.0 - newHeight / 2.0; agg::trans_affine_scaling sc(scale); agg::trans_affine_translation tr(-offsetX, -offsetY); *trans = sc; *trans *= tr; } return scale; } void Bounds::update(const agg::trans_affine& trns, pathIterator& helper, double scale, const AST::CommandInfo& attr, agg::point_d* cent, double* area) { Bounds b(trns, helper, scale, attr, cent, area); merge(b); } contextfree-3.0.5+dfsg1.orig/src-common/primShape.h0000644000175000017500000000326312076364074020623 0ustar brambram// primShape.h // Context Free // --------------------- // Copyright (C) 2006-2012 John Horigan // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #ifndef INCLUDE_PRIMSHAPE_H #define INCLUDE_PRIMSHAPE_H #include "agg_path_storage.h" class primShape : public agg::path_storage { public: enum {circleType = 0, squareType = 1, triangleType = 2, fillType = 3, numTypes = 4}; primShape(const agg::point_d* p, unsigned s) { move_to(p[0].x, p[0].y); for (unsigned i = 1; i < s; ++i) line_to(p[i].x, p[i].y); end_poly(agg::path_flags_close); } primShape() {} static const primShape circle; static const primShape square; static const primShape triangle; static const primShape* shapeMap[numTypes]; static bool isPrimShape(unsigned v) { return v < numTypes; } static bool isPrimShape(agg::path_storage* p); }; #endif // INCLUDE_PRIMSHAPE_H contextfree-3.0.5+dfsg1.orig/src-common/renderimpl.h0000644000175000017500000001224412076364074021033 0ustar brambram// renderimpl.h // this file is part of Context Free // --------------------- // Copyright (C) 2006-2008 Mark Lentczner - markl@glyphic.com // Copyright (C) 2006-2013 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // Mark Lentczner can be contacted at markl@glyphic.com or at // Mark Lentczner, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #ifndef INCLUDE_RENDERIMPL_H #define INCLUDE_RENDERIMPL_H #ifdef _WIN32 #pragma warning( disable : 4786 ) #endif #include #include #include "agg_trans_affine.h" #include "agg_trans_affine_time.h" #include "bounds.h" #include "cfdg.h" #include "cfdgimpl.h" #include "shape.h" #include "tempfile.h" #include "shape.h" #include "CmdInfo.h" #include "pathIterator.h" #include "chunk_vector.h" class ShapeOp; namespace AST { class ASTbodyContainer; class ASTrule; class ASTpathCommand; class ASTcompiledPath; } class RendererImpl : public Renderer { public: RendererImpl(CFDGImpl* cfdg, int width, int height, double minSize, int variation, double border); ~RendererImpl(); virtual void storeParams(const StackType* p); void setMaxShapes(int n); void resetBounds(); void resetSize(int x, int y); void initBounds(); double run(Canvas* canvas, bool partialDraw); void draw(Canvas* canvas); void animate(Canvas* canvas, int frames, bool zoom); virtual void processPathCommand(const Shape& s, const AST::CommandInfo* attr); virtual void processShape(const Shape& s); virtual void processPrimShape(const Shape& s, const AST::ASTrule* attr = 0); virtual void processSubpath(const Shape& s, bool tr, int); private: void outputPrep(Canvas*); void rescaleOutput(int& curr_width, int& curr_height, bool final); void forEachShape(bool final, ShapeOp& op); void processPrimShapeSiblings(const Shape& s, const AST::ASTrule* attr); void output(bool final); void outputPartial() { output(false); } void outputFinal() { output(true); } void outputStats(); friend class OutputDraw; friend class OutputMerge; friend class OutputBounds; bool isDone(); void fileIfNecessary(); void moveFinishedToFile(); void moveUnfinishedToTwoFiles(); void getUnfinishedFromFile(); AbstractSystem* system() { return m_cfdg->system(); } void fixupHeap(); bool checkHeap(); void init(); void cleanup(); private: CFDGImpl* m_cfdg; Canvas* m_canvas; pathIterator m_pathIter; bool mColorConflict; int m_maxShapes; bool m_tiled; bool m_sized; bool m_timed; CFDG::frieze_t m_frieze; double m_frieze_size; bool m_drawingMode; std::multiset mFinishedShapes; typedef chunk_vector UnfinishedContainer; UnfinishedContainer mUnfinishedShapes; std::deque< ref_ptr > m_finishedFiles; std::deque< ref_ptr > m_unfinishedFiles; int mFinishedFileCount; int mUnfinishedFileCount; int mVariation; double m_border; double mScaleArea; double mScale; double mFixedBorderX; double mFixedBorderY; double mShapeBorder; double mTotalArea; agg::point_d mCurrentCentroid; double mCurrentArea; Bounds mPathBounds; double m_currScale; double m_currArea; double m_minArea; double m_minSize; Bounds mBounds; agg::trans_affine_time mTimeBounds; agg::trans_affine_time mFrameTimeBounds; agg::trans_affine m_currTrans; unsigned int m_outputSoFar; std::multiset::iterator m_outputPosition; std::vector mSymmetryOps; AbstractSystem::Stats m_stats; int m_unfinishedInFilesCount; std::deque mLongLivedParams; AST::CommandInfo shapeMap[3]; primShape shape0; primShape shape1; primShape shape2; protected: virtual void colorConflict(const yy::location& w); }; #endif // INCLUDE_RENDERIMPL_H contextfree-3.0.5+dfsg1.orig/src-common/makeCFfilename.h0000644000175000017500000000224412076364074021520 0ustar brambram// makeCFfilename.h // Context Free // --------------------- // Copyright (C) 2008 John Horigan // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #ifndef INCLUDE_MAKECFFILENAME_H #define INCLUDE_MAKECFFILENAME_H #include std::string makeCFfilename(const char* fmt, int frame, int frameCount, int variation); #endif //INCLUDE_MAKECFFILENAME_H contextfree-3.0.5+dfsg1.orig/src-common/cfdg.l0000644000175000017500000003766512076364074017617 0ustar brambram/* cfdg.l // this file is part of Context Free // --------------------- // Copyright (C) 2005-2008 Mark Lentczner - markl@glyphic.com // Copyright (C) 2005-2012 John Horigan - john@glyphic.com // Copyright (C) 2005 Chris Coyne - ccoyne77@gmail.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // Mark Lentczner can be contacted at markl@glyphic.com or at // Mark Lentczner, 1209 Villa St., Mountain View, CA 94041-1123, USA // */ %{ #define YY_NO_UNISTD_H #include "builder.h" #include "scanner.h" #include "astexpression.h" #include "cfdg.tab.hpp" /* import the parser's token type into a local typedef */ typedef yy::CfdgParser::token token; typedef yy::CfdgParser::token_type token_type; %} INTEGER [0-9]+%? RATIONAL ([0-9]+\.[0-9]*%?)|(\.[0-9]+%?) RATIONAL2 [0-9]+%?\.\. FLOAT ([0-9]+\.[0-9]*[eE][+-]?[0-9]+%?)|(\.[0-9]+[eE][+-]?[0-9]+%?)|[0-9]+[eE][+-]?[0-9]+%? PATHOP MOVETO|LINETO|ARCTO|CURVETO|MOVEREL|LINEREL|ARCREL|CURVEREL|CLOSEPOLY FILENAME [a-zA-Z\200-\377][a-zA-Z\200-\377_\-0-9\.]*\.cfdg STRING [a-zA-Z\200-\377_]([a-zA-Z:_0-9\200-\377])* /* calling this externally */ /* don't want yywrap to exist.*/ %option noyywrap %option 8bit %option yylineno %option c++ %option prefix="Cfdg" %option batch /* The following paragraph suffices to track locations accurately. Each time * yylex is invoked, the begin position is moved onto the end position. */ %{ #define YY_USER_ACTION yylloc->columns(utf8length(yytext, yyleng)); %} %% /* code to place at the beginning of yylex() */ %{ // reset location setupLoc(yylloc); if (atStartup) { int t = startToken; atStartup = false; return t; } %} /* comment line */ "#"|"//" { int c; while ((c = yyinput()) != EOF) { if (c == '\n') break; } yylloc->lines(1); yylloc->step(); } /* C-style comment */ "/*" { int c; bool lastCharWasAStar = false; // stop when we get to */ or end-of-file while ((c = yyinput()) != EOF) { if (c == '\n') yylloc->lines(1); else yylloc->columns(); if (c == '/' && lastCharWasAStar) break; lastCharWasAStar = c == '*'; } if (c == EOF) { LexerError("end-of-file in block comment"); return token::BADEOF; } yylloc->step(); // move on to next token } /* Quoted string */ \042[^\042\n]*[\042\n] { /* \042 is " in ASCII */ if (yytext[yyleng - 1] != '\042') { LexerError("end-of-line in quoted string"); return token::BADEOF; } else { yylval->string = new std::string(yytext + 1, yyleng - 2); return token::USER_QSTRING; } } "startshape" {return token::STARTSHAPE;} "background" {return token::BACKGROUND;} "include" {return token::INCLUDE;} "import" {return token::IMPORT;} "tile" {return token::TILE;} "rule" {return token::RULE;} "path" {return token::PATH;} "shape" {return token::SHAPE;} "loop" {return token::LOOP;} "clone" {return token::CLONE;} "let" {return token::LET;} "=" {return token::BECOMES;} "finally" {return token::FINALLY;} "if" {return token::IF;} "else" {return token::ELSE;} "switch" {return token::SWITCH;} "case" {return token::CASE;} ".." {return token::RANGEOP;} \xe2\x80\xa6 {return token::RANGEOP;} \xc2\xb1 {return token::PLUSMINUSOP;} "+/-" {return token::PLUSMINUSOP;} \xe2\x88\x9e {return token::CF_INFINITY;} "time" {yylval->modToken = AST::ASTmodTerm::time; return token::MODTYPE;} "timescale" {yylval->modToken = AST::ASTmodTerm::timescale; return token::MODTYPE;} "rotate" {yylval->modToken = AST::ASTmodTerm::rot; return token::MODTYPE;} "r" {yylval->modToken = AST::ASTmodTerm::rot; return token::MODTYPE;} "flip" {yylval->modToken = AST::ASTmodTerm::flip; return token::MODTYPE;} "f" {yylval->modToken = AST::ASTmodTerm::flip; return token::MODTYPE;} "hue" {yylval->modToken = AST::ASTmodTerm::hue; return token::MODTYPE;} "h" {yylval->modToken = AST::ASTmodTerm::hue; return token::MODTYPE;} "saturation" {yylval->modToken = AST::ASTmodTerm::sat; return token::MODTYPE;} "sat" {yylval->modToken = AST::ASTmodTerm::sat; return token::MODTYPE;} "brightness" {yylval->modToken = AST::ASTmodTerm::bright; return token::MODTYPE;} "b" {yylval->modToken = AST::ASTmodTerm::bright; return token::MODTYPE;} "alpha" {yylval->modToken = AST::ASTmodTerm::alpha; return token::MODTYPE;} "a" {yylval->modToken = AST::ASTmodTerm::alpha; return token::MODTYPE;} "transform" {yylval->modToken = AST::ASTmodTerm::transform; return token::MODTYPE;} "trans" {yylval->modToken = AST::ASTmodTerm::transform; return token::MODTYPE;} "x" {yylval->modToken = AST::ASTmodTerm::x; return token::MODTYPE;} "y" {yylval->modToken = AST::ASTmodTerm::y; return token::MODTYPE;} "z" {yylval->modToken = AST::ASTmodTerm::z; return token::MODTYPE;} "size" {yylval->modToken = AST::ASTmodTerm::size; return token::MODTYPE;} "s" {yylval->modToken = AST::ASTmodTerm::size; return token::MODTYPE;} "skew" {yylval->modToken = AST::ASTmodTerm::skew; return token::MODTYPE;} "|hue" {yylval->modToken = AST::ASTmodTerm::targHue; return token::MODTYPE;} "|h" {yylval->modToken = AST::ASTmodTerm::targHue; return token::MODTYPE;} "|saturation" {yylval->modToken = AST::ASTmodTerm::targSat; return token::MODTYPE;} "|sat" {yylval->modToken = AST::ASTmodTerm::targSat; return token::MODTYPE;} "|brightness" {yylval->modToken = AST::ASTmodTerm::targBright; return token::MODTYPE;} "|b" {yylval->modToken = AST::ASTmodTerm::targBright; return token::MODTYPE;} "|alpha" {yylval->modToken = AST::ASTmodTerm::targAlpha; return token::MODTYPE;} "|a" {yylval->modToken = AST::ASTmodTerm::targAlpha; return token::MODTYPE;} "param" { if (startToken == token::CFDG2) { yylval->modToken = AST::ASTmodTerm::param; return token::PARAM; } else { yylval->string = new std::string(yytext); return token::USER_STRING; } } "p" { if (startToken == token::CFDG2) { yylval->modToken = AST::ASTmodTerm::param; return token::PARAM; } else { yylval->string = new std::string(yytext); return token::USER_STRING; } } "width" { if (startToken == token::CFDG2) { yylval->modToken = AST::ASTmodTerm::stroke; return token::MODTYPE; } else { yylval->string = new std::string(yytext); return token::USER_STRING; } } "x1" { if (startToken == token::CFDG2) { yylval->modToken = AST::ASTmodTerm::x1; return token::MODTYPE; } else { yylval->string = new std::string(yytext); return token::USER_STRING; } } "y1" { if (startToken == token::CFDG2) { yylval->modToken = AST::ASTmodTerm::y1; return token::MODTYPE; } else { yylval->string = new std::string(yytext); return token::USER_STRING; } } "x2" { if (startToken == token::CFDG2) { yylval->modToken = AST::ASTmodTerm::x2; return token::MODTYPE; } else { yylval->string = new std::string(yytext); return token::USER_STRING; } } "y2" { if (startToken == token::CFDG2) { yylval->modToken = AST::ASTmodTerm::y2; return token::MODTYPE; } else { yylval->string = new std::string(yytext); return token::USER_STRING; } } "rx" { if (startToken == token::CFDG2) { yylval->modToken = AST::ASTmodTerm::xrad; return token::MODTYPE; } else { yylval->string = new std::string(yytext); return token::USER_STRING; } } "ry" { if (startToken == token::CFDG2) { yylval->modToken = AST::ASTmodTerm::yrad; return token::MODTYPE; } else { yylval->string = new std::string(yytext); return token::USER_STRING; } } "<" { return token::LT; } "<=" { return token::LE; } \xe2\x89\xa4 { return token::LE; } ">" { return token::GT; } ">=" { return token::GE; } \xe2\x89\xa5 { return token::GE; } "==" { return token::EQ; } "<>" { return token::NEQ; } \xe2\x89\xa0 { return token::NEQ; } "!" { return token::NOT; } "&&" { return token::AND; } "||" { return token::OR; } "^^" { return token::XOR; } "--" { return '_'; } {PATHOP} {yylval->string = new std::string(yytext); return token::USER_PATHOP;} {STRING} { // This greedy string regex gobbles up Unicode operators. Find the first one // and chop the string there. yylval->string = new std::string(yytext); size_t pos = std::string::npos; token_type tok = token::USER_STRING; for (tokenMap::iterator it = utf8chars.begin(), eit = utf8chars.end(); it != eit; ++it) { size_t spos = yylval->string->find(it->second); if (spos != std::string::npos && (spos < pos || pos == std::string::npos)) { pos = spos; tok = it->first; } } if (pos == 0) { // Unicode operator found at 1st char, Unread all but the operator and // return the token for the operator. delete yylval->string; yylval->string = 0; size_t len = strlen(utf8chars[tok]); (yylloc->end) = (yylloc->begin); yylloc->columns(1); yyless(len); return tok; } if (pos != std::string::npos) { // Unicode operator found after 1st char. Unread everything from operator to // end of string and truncate string before operator. yylval->string->resize(pos); (yylloc->end) = (yylloc->begin); yylloc->columns(utf8length(yytext, pos)); yyless(pos); return token::USER_STRING; } int c = yyinput(); if (c != EOF) unput(c); return c == '[' ? token::USER_ARRAYNAME : token::USER_STRING; } {RATIONAL} {yylval->string = new std::string(yytext); return token::USER_RATIONAL;} {FLOAT} {yylval->string = new std::string(yytext); return token::USER_RATIONAL;} {RATIONAL2} { yylval->string = new std::string(yytext, yyleng - 2); yyless(yyleng - 2); (yylloc->end) += -2; return token::USER_RATIONAL; } {INTEGER} {yylval->string = new std::string(yytext); return token::USER_RATIONAL;} {FILENAME} {yylval->string = new std::string(yytext); return token::USER_FILENAME;} /* gobble up white-spaces */ [ \t\r]+ { yylloc->step(); } /* gobble up end-of-lines */ \n { yylloc->lines(1); yylloc->step(); } /* pass all other characters up to bison */ . { return static_cast(*yytext); } <> { if (!YY_CURRENT_BUFFER) yyterminate(); if (!mLocationStack.empty()) { *yylloc = mLocationStack.top(); mLocationStack.pop(); } yylloc->step(); return token::GOODEOF; } %% /*** Additional Code ***/ namespace yy { Scanner::Scanner(std::istream* in, std::ostream* out) : yyFlexLexer(in, out), nextLocAction(normalAction), startToken(token::CFDG2), maybeVersion(0), atStartup(true) { utf8chars[token::RANGEOP] = "\xe2\x80\xa6"; utf8chars[token::PLUSMINUSOP] = "\xc2\xb1"; utf8chars[token::LE] = "\xe2\x89\xa4"; utf8chars[token::GE] = "\xe2\x89\xa5"; utf8chars[token::NEQ] = "\xe2\x89\xa0"; utf8chars[token::CF_INFINITY] = "\xe2\x88\x9e"; } Scanner::~Scanner() { } void Scanner::set_debug(bool b) { yy_flex_debug = b; } void Scanner::LexerError(const char* msg) { driver->error(lineno(), msg); } void Scanner::setupLoc(CfdgParser::location_type* yylloc) { switch (nextLocAction) { case normalAction: case popLoc: yylloc->step(); break; case pushLoc: mLocationStack.push(*yylloc); *yylloc = CfdgParser::location_type(); break; } nextLocAction = normalAction; yylloc->begin.filename = yylloc->end.filename = driver->m_currentPath; } // Compute the number of Unicode characters in a block of UTF-8 encoded bytes unsigned int Scanner::utf8length(const char* txt, size_t len) { unsigned int length = 0; for (size_t i = 0; i < len; ++i, ++length) { char c = txt[i]; if (c == '\0') LexerError("Invalid UTF-8 encoding: ASCII null character"); if ((c & 0x80) == 0) continue; size_t j = 0; for (; c & 0x80; ++j) c <<= 1; if (j == 1) { LexerError("Invalid UTF-8 encoding: unexpected continuation byte"); continue; } if (j > 4) // 4 bytes max per RFC 3629 LexerError("Invalid UTF-8 encoding: code point out of range"); if (j && i + j > len) { LexerError("Invalid UTF-8 encoding: sequence extends past end of buffer"); return length; } // Compute the Unicode code point unsigned long code = c >> j; size_t k = 1; for (; k < j; ++k) { if ((txt[i + k] & 0xc0) != 0x80) { LexerError("Invalid UTF-8 encoding: expecting a continuation byte"); break; } code = (code << 6) | (txt[i + k] & 0x3f); } if (k < j) { // malformed code is actually k bytes long, not j bytes long i += k - 1; continue; } // Check for illegal code points if (code >= 0xd800 && code <= 0xdfff) LexerError("Invalid UTF-8 encoding: UTF-16 surrogate halves"); if (code == 0xfffe || code == 0xffff) LexerError("Invalid UTF-8 encoding: illegal code point"); if (code == 0) LexerError("Invalid UTF-8 encoding: encoded null character"); if (code > 0x10ffff) LexerError("Invalid UTF-8 encoding: codepoint above U+10FFFF"); // Check for encodings that are more bytes than they need to be switch (j) { case 2: if (code > 0x7f) break; case 3: if (code > 0x7ff) break; case 4: if (code > 0xffff) break; LexerError("Invalid UTF-8 encoding: overlong sequence"); default: break; } if (j) i += j - 1; } return length; } } /* This implementation of CfdgFlexLexer::yylex() is required to fill the * vtable of the class CfdgFlexLexer. We define the scanner's main yylex * function via YY_DECL to reside in the Scanner class instead. */ #ifdef yylex #undef yylex #endif int yyFlexLexer::yylex() { std::cerr << "in yyFlexLexer::yylex() !" << std::endl; return 0; } contextfree-3.0.5+dfsg1.orig/src-common/aggCanvas.h0000644000175000017500000000574312076364074020572 0ustar brambram// aggCanvas.h // this file is part of Context Free // --------------------- // Copyright (C) 2005-2008 Mark Lentczner - markl@glyphic.com // Copyright (C) 2006-2012 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // Mark Lentczner can be contacted at markl@glyphic.com or at // Mark Lentczner, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #ifndef INCLUDE_AGGCANVAS_H #define INCLUDE_AGGCANVAS_H #include "cfdg.h" #include "agg_trans_affine.h" #include "agg_path_storage.h" class aggCanvas : public Canvas { public: enum PixelFormat { UnknownPixelFormat = 0, Gray8_Blend = 1, RGBA8_Blend = 2, RGB8_Blend = 3, FF_Blend = 4, FF24_Blend = 5, QT_Blend = 6, Has_16bit_Color = 8, Gray16_Blend = Gray8_Blend | Has_16bit_Color, RGBA16_Blend = RGBA8_Blend | Has_16bit_Color, RGB16_Blend = RGB8_Blend | Has_16bit_Color }; static int BytesPerPixel[13]; void start(bool clear, const agg::rgba& bk, int width, int height); void end(); void circle(RGBA8 c, agg::trans_affine tr); void square(RGBA8 c, agg::trans_affine tr); void triangle(RGBA8 c, agg::trans_affine tr); void fill(RGBA8 c); void path(RGBA8 c, agg::trans_affine tr, const AST::CommandInfo& attr); bool colorCount256(); // return whether the aggCanvas can fit in byte pixels static PixelFormat SuggestPixelFormat(CFDG* engine); protected: aggCanvas(PixelFormat); virtual ~aggCanvas(); void attach(void* data, unsigned width, unsigned height, int stride, bool invert = true); // data is int8u grayscale pixels or int32u pixels void copy(void* data, unsigned width, unsigned height, int stride, PixelFormat format); // copy the image from different pixel buffer public: int cropX(); int cropY(); int cropWidth(); int cropHeight(); //private: public: class impl; impl* m; }; #endif // INCLUDE_AGGCANVAS_H contextfree-3.0.5+dfsg1.orig/src-common/SVGCanvas.h0000644000175000017500000000415112076364074020463 0ustar brambram// SVGCanvas.h // this file is part of Context Free // --------------------- // Copyright (C) 2006-2011 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #include #include #include #include "agg_trans_affine.h" #include "agg_color_rgba.h" #include "cfdg.h" #include class SVGCanvas : public Canvas { public: void start(bool clear, const agg::rgba& bk, int width, int height); void end(); void complete(RGBA8 c, agg::trans_affine tr, int padding, const AST::CommandInfo& attr, bool g = false); void circle(RGBA8 c, agg::trans_affine tr); void square(RGBA8 c, agg::trans_affine tr); void triangle(RGBA8 c, agg::trans_affine tr); void fill(RGBA8 c); void path(RGBA8 c, agg::trans_affine tr, const AST::CommandInfo& attr); SVGCanvas(const char* opath, int width, int height, bool crop, const char* desc = 0, int length = -1); private: typedef std::pair uniquePath; int mPadding; char mEndline[82]; std::map mPathIDMap; unsigned mNextPathID; agg::trans_affine mOffset; bool mCropped; std::ofstream mOutputFile; std::ostream& mOutput; const char* mDescription; int mLength; void indent(int); }; contextfree-3.0.5+dfsg1.orig/src-common/abstractPngCanvas.h0000644000175000017500000000370212076364074022275 0ustar brambram// tiledAggCanvas.h // Context Free // --------------------- // Copyright (C) 2012 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #ifndef INCLUDE_ABSTRACTPNGCANVAS_H #define INCLUDE_ABSTRACTPNGCANVAS_H #include "aggCanvas.h" class abstractPngCanvas : public aggCanvas { public: abstractPngCanvas(const char* outfilename, bool quiet, int width, int height, PixelFormat pixfmt, bool crop, int frameCount, int variation, bool wallpaper, Renderer *r, int mx, int my); virtual ~abstractPngCanvas(); virtual void start(bool , const agg::rgba& , int , int ); virtual void end(); protected: const char* mOutputFileName; int mFrameCount; int mCurrentFrame; int mVariation; unsigned char* mData; int mStride; PixelFormat mPixelFormat; bool mCrop; bool mQuiet; bool mWallpaper; Renderer* mRenderer; int mFullWidth; int mFullHeight; int mOriginX; int mOriginY; void copyImageUnscaled(int x, int y); virtual void output(const char * outfilename, int frame = -1) = 0; }; #endif // INCLUDE_ABSTRACTPNGCANVAS_H contextfree-3.0.5+dfsg1.orig/src-common/ffCanvas.cpp0000644000175000017500000001672712076364074020766 0ustar brambram// ffCanvas.cpp // this file is part of Context Free // --------------------- // Copyright (C) 2011-2012 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #define __STDC_CONSTANT_MACROS 1 #include "ffCanvas.h" #include extern "C" { #include #include #undef PixelFormat } class ffCanvas::Impl { public: Impl(const char* name, PixelFormat fmt, int width, int height, int stride, char* bits, int fps); ~Impl(); void addFrame(); int mWidth; int mHeight; int mStride; char* mBuffer; int mFrameRate; const char* mError; AVFormatContext *mOutputCtx; AVFrame *mFrame; static const uint32_t dummyPalette[256]; friend class ffCanvas; }; const uint32_t ffCanvas::Impl::dummyPalette[256] = { 0 }; ffCanvas::Impl::Impl(const char* name, PixelFormat fmt, int width, int height, int stride, char* bits, int fps) : mWidth(width), mHeight(height), mStride(stride), mBuffer(bits), mFrameRate(fps), mError(NULL), mOutputCtx(NULL), mFrame(NULL) { avcodec_register_all(); av_register_all(); int res = avformat_alloc_output_context2(&mOutputCtx, NULL, "mov", name); if (res < 0) { mError = "out of memory"; return; } AVCodec *codec = avcodec_find_encoder(CODEC_ID_QTRLE); if (codec == NULL) { mError = "codec not found"; return; } AVStream* stream = avformat_new_stream(mOutputCtx, codec); if (stream == NULL) { mError = "out of memory"; return; } AVCodecContext *codecCtx = stream->codec; avcodec_get_context_defaults3(codecCtx, codec); /* put sample parameters */ codecCtx->bit_rate = height * stride * fps * 8; /* resolution must be a multiple of two */ assert(((width & 3) | (height & 3)) == 0); codecCtx->width = width; codecCtx->height = height; /* frames per second */ codecCtx->time_base.num = 1; codecCtx->time_base.den = fps; codecCtx->gop_size = 10; /* emit one intra frame every ten frames */ codecCtx->flags |= CODEC_FLAG_GLOBAL_HEADER; switch (fmt) { case aggCanvas::Gray8_Blend: codecCtx->pix_fmt = PIX_FMT_GRAY8; break; case aggCanvas::FF24_Blend: codecCtx->pix_fmt = PIX_FMT_RGB24; break; case aggCanvas::FF_Blend: codecCtx->pix_fmt = PIX_FMT_ARGB; break; default: mError = "unknown pixel format"; return; } if (avcodec_open2(codecCtx, codec, NULL) < 0) { mError = "could not open codec"; return; } mFrame = avcodec_alloc_frame(); if (mFrame == NULL) { mError = "out of memory"; return; } mFrame->data[0] = (uint8_t*)bits; mFrame->data[1] = codecCtx->pix_fmt == PIX_FMT_GRAY8 ? (uint8_t*)dummyPalette : NULL; mFrame->data[2] = mFrame->data[3] = NULL; mFrame->linesize[0] = stride; mFrame->linesize[1] = codecCtx->pix_fmt == PIX_FMT_GRAY8 ? 1024 : 0; mFrame->linesize[2] = mFrame->linesize[3] = 0; if (avio_open(&(mOutputCtx->pb), name, AVIO_FLAG_WRITE) < 0) { mError = "failed to write video file header"; return; } if (avformat_write_header(mOutputCtx, NULL) < 0) { avio_close(mOutputCtx->pb); mError = "failed to write video file header"; return; } } ffCanvas::Impl::~Impl() { if (!mError) { AVStream* stream = mOutputCtx->streams[0]; AVPacket pkt; av_init_packet(&pkt); pkt.data = NULL; // packet data will be allocated by the encoder pkt.size = 0; int ret = 0; for (int got_output = 1; got_output; ) { ret = avcodec_encode_video2(stream->codec, &pkt, NULL, &got_output); if (ret < 0) break; if (got_output) { pkt.stream_index = stream->index; if (stream->codec->coded_frame->key_frame) pkt.flags |= AV_PKT_FLAG_KEY; ret = av_write_frame(mOutputCtx, &pkt); if (ret < 0) av_free_packet(&pkt); //av_free_packet(&pkt); } } ret = av_write_trailer(mOutputCtx); if (ret >= 0) ret = avio_close(mOutputCtx->pb); if (ret < 0) mError = "error closing movie file"; } if (mOutputCtx) { avformat_free_context(mOutputCtx); mOutputCtx = NULL; } if (mFrame) { av_free(mFrame); mFrame = NULL; } delete[] mBuffer; mBuffer = NULL; } void ffCanvas::Impl::addFrame() { AVStream* stream = mOutputCtx->streams[0]; AVPacket pkt; int got_output; av_init_packet(&pkt); pkt.data = NULL; // packet data will be allocated by the encoder pkt.size = 0; int ret = avcodec_encode_video2(stream->codec, &pkt, mFrame, &got_output); if (ret < 0) { mError = "video encoding failed"; return; } if (got_output) { pkt.stream_index = stream->index; if (stream->codec->coded_frame->key_frame) pkt.flags |= AV_PKT_FLAG_KEY; if (av_write_frame(mOutputCtx, &pkt) < 0) { mError = "video frame write error"; av_free_packet(&pkt); return; } //av_free_packet(&pkt); } } static aggCanvas::PixelFormat mapPixFmt(aggCanvas::PixelFormat in) { switch (in) { case aggCanvas::Gray8_Blend: case aggCanvas::Gray16_Blend: return aggCanvas::Gray8_Blend; case aggCanvas::RGB8_Blend: case aggCanvas::RGB16_Blend: return aggCanvas::FF24_Blend; default: return aggCanvas::FF_Blend; } } ffCanvas::ffCanvas(const char* name, PixelFormat fmt, int width, int height, int fps) : aggCanvas(mapPixFmt(fmt)), mError(NULL), impl(NULL) { width &= ~3; height &= ~3; int stride = width * aggCanvas::BytesPerPixel[mapPixFmt(fmt)]; char* bits = new char[stride * height]; aggCanvas::attach((void*)bits, width, height, stride); impl = new Impl(name, mapPixFmt(fmt), width, height, stride, bits, fps); if (impl->mError) { mError = impl->mError; delete impl; impl = NULL; } } ffCanvas::~ffCanvas() { delete impl; } void ffCanvas::end() { aggCanvas::end(); if (impl) { impl->addFrame(); if (impl->mError) { mError = impl->mError; delete impl; impl = NULL; } } } contextfree-3.0.5+dfsg1.orig/src-common/upload.cpp0000644000175000017500000001140212076364074020504 0ustar brambram// upload.cpp // this file is part of Context Free // --------------------- // Copyright (C) 2007 Mark Lentczner - markl@glyphic.com // Copyright (C) 2008-2012 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // Mark Lentczner can be contacted at markl@glyphic.com or at // Mark Lentczner, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #include "upload.h" #include #include "variation.h" namespace { const char mime_boundary[] = "a3c8dfd7-dce4-443c-ae3c-446df50f28c0"; const char mime_endl[] = "\r\n"; void generateMimeBoundary(std::ostream& out) { out << mime_endl << "--" << mime_boundary << mime_endl; } void generateMimeFooter(std::ostream& out) { out << mime_endl << "--" << mime_boundary << "--" << mime_endl; } void generateTextField(std::ostream& out, const char* field, const std::string& value) { generateMimeBoundary(out); out << "Content-Disposition: form-data" << "; name=" << field // shouldn't need quotes << mime_endl << "Content-Type: text/plain; charset=UTF-8" << mime_endl << mime_endl; out << value; } void generateTextField(std::ostream& out, const char* field, char value) { generateMimeBoundary(out); out << "Content-Disposition: form-data" << "; name=" << field // shouldn't need quotes << mime_endl << "Content-Type: text/plain; charset=UTF-8" << mime_endl << mime_endl; out << value; } void generateFileField(std::ostream& out, const char* field, const char* data, size_t length, const std::string& fileName) { generateMimeBoundary(out); out << "Content-Disposition: form-data" << "; name=" << field // shouldn't need quotes << "; filename=\"" << fileName << '"' << mime_endl << "Content-Type: application/octet-stream" << mime_endl << mime_endl; out.write(data, length); } std::string compressionName(Upload::Compression compression) { switch (compression) { default: case Upload::CompressJPEG: return "JPEG"; case Upload::CompressPNG8: return "PNG-8"; } } std::string variationName(int variation) { char buffer[Variation::maxStringLength]; Variation::toString(variation, buffer, false); return buffer; } } std::string Upload::generateHeader() { return std::string("Content-Type: multipart/form-data; boundary=") + mime_boundary; } std::string Upload::generateContentType() { return std::string("multipart/form-data; boundary=") + mime_boundary; } void Upload::generatePayload(std::ostream& out) { generateTextField(out, "screenname", mUserName); generateTextField(out, "password", mPassword); generateTextField(out, "agent", "ContextFree"); generateTextField(out, "title", mTitle); generateFileField(out, "cfdgfile", mText, mTextLen, mFileName); generateFileField(out, "imagefile", mImage, mImageLen, "image.png"); generateTextField(out, "compression", compressionName(mCompression)); generateTextField(out, "cc_js_result_uri", mccLicenseURI); generateTextField(out, "cc_js_result_name", mccLicenseName); generateTextField(out, "cc_js_result_img", mccLicenseImage); if (mccLicenseURI.length()) generateTextField(out, "cc_js_want_cc_license", "sure"); if (mTiled) generateTextField(out, "tiled", "on"); generateTextField(out, "tiledtype", (char)(mTiled + '0')); generateTextField(out, "variation", variationName(mVariation)); generateTextField(out, "notes", mNotes); // generateTextField(out, "submit", "Upload!"); generateMimeFooter(out); } contextfree-3.0.5+dfsg1.orig/src-common/abstractPngCanvas.cpp0000644000175000017500000001041712076364074022631 0ustar brambram// tiledAggCanvas.cpp // Context Free // --------------------- // Copyright (C) 2012 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #include "abstractPngCanvas.h" #include "tiledCanvas.h" #include "makeCFfilename.h" #include #include using namespace std; abstractPngCanvas::abstractPngCanvas(const char* outfilename, bool quiet, int width, int height, aggCanvas::PixelFormat pixfmt, bool crop, int frameCount, int variation, bool wallpaper, Renderer *r, int mx, int my) : aggCanvas(pixfmt), mOutputFileName(outfilename), mFrameCount(frameCount), mCurrentFrame(0), mVariation(variation), mData(0), mPixelFormat(pixfmt), mCrop(crop), mQuiet(quiet), mWallpaper(wallpaper), mRenderer(r), mFullWidth(width), mFullHeight(height), mOriginX(0), mOriginY(0) { if (wallpaper) { mWidth = r->m_width; mHeight = r->m_height; mFullWidth = width; mFullHeight = height; double scalex = (double)width / ( mWidth * mx); double scaley = (double)height / (mHeight * my); double scale = scalex < scaley ? scalex : scaley; mWidth *= scale; mHeight *= scale; } else { mWidth = width; mHeight = height; mFullWidth = mWidth * mx; mFullHeight = mHeight * my; } mOriginX = (mFullWidth - mWidth) / 2; mOriginY = (mFullHeight - mHeight) / 2; mStride = mFullWidth * aggCanvas::BytesPerPixel[mPixelFormat]; #ifdef _WIN32 mStride += ((-mStride) & 3); #endif mData = new unsigned char[mStride * mFullHeight]; attach(mData + mOriginY * mStride + mOriginX * BytesPerPixel[mPixelFormat], mWidth, mHeight, mStride); if (quiet) return; cout << mFullWidth << "w x " << mFullHeight << "h pixel image." << endl; cout << "Generating..." << endl; } abstractPngCanvas::~abstractPngCanvas() { delete[] mData; } void abstractPngCanvas::start(bool clear, const agg::rgba &bk, int width, int height) { if (!mFrameCount && !mQuiet) cout << endl << "Rendering..." << endl; aggCanvas::start(clear, bk, width, height); } void abstractPngCanvas::end() { aggCanvas::end(); if (mRenderer && mRenderer->m_tiledCanvas) { tileList points; mRenderer->m_tiledCanvas->getTesselation(points, mFullWidth, mFullHeight, mOriginX, mOriginY, true); for (tileList::reverse_iterator pt = points.rbegin(), ept = points.rend(); pt != ept; ++pt) { if (pt->x != mOriginX || pt->y != mOriginY) copyImageUnscaled(pt->x, pt->y); } } string name = makeCFfilename(mOutputFileName, mCurrentFrame, mFrameCount, mVariation); if (mFrameCount) { output(name.c_str(), mCurrentFrame++); } else { output(name.c_str()); } } void abstractPngCanvas::copyImageUnscaled(int destx, int desty) { destx *= BytesPerPixel[mPixelFormat]; int srcx = mOriginX * BytesPerPixel[mPixelFormat]; int srcy = mOriginY; for (int y = 0; y < mHeight; ++y) { if (y + desty < 0 || y + desty >= mFullHeight) continue; for (int x = 0; x < mWidth * BytesPerPixel[mPixelFormat]; ++x) { if (destx + x >= 0 && destx + x < mStride) mData[(y + desty) * mStride + destx + x] = mData[(y + srcy) * mStride + srcx + x]; } } } contextfree-3.0.5+dfsg1.orig/src-common/ast.h0000644000175000017500000001145012076364074017457 0ustar brambram// ast.h // this file is part of Context Free // --------------------- // Copyright (C) 2009-2012 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #ifndef INCLUDE_AST_H #define INCLUDE_AST_H #include #include #include #include "agg_math_stroke.h" #include "agg_trans_affine.h" #include "cfdg.h" namespace AST { typedef std::vector SymmList; #ifdef _WIN32 inline double acosh(double x) { return log(x + sqrt(x * x - 1)); } inline double asinh(double x) { return log(x + sqrt(x * x + 1)); } inline double atanh(double x) { return log((1 + x) / (1 - x)) / 2; } inline double fmin(const double& x, const double& y) { return x < y ? x : y; } inline double fmax(const double& x, const double& y) { return x > y ? x : y; } #pragma warning( disable : 4521 ) #endif class ASTpath; class ASTreplacement; typedef std::vector ASTbody; class ASTparameterList; class ASTparameter; class ASTrule; class ASTcompiledPath; class ASTpathOp; class ASTexpression; class ASTmodification; class ASTruleSpecifier; class ASTloop; class ASTif; class ASTswitch; class ASTmodTerm; typedef std::vector ASTexpArray; typedef std::vector ASTtermArray; typedef std::vector ASTparameters; typedef std::auto_ptr str_ptr; typedef std::auto_ptr exp_ptr; typedef std::auto_ptr rep_ptr; typedef std::auto_ptr ruleSpec_ptr; typedef std::auto_ptr rule_ptr; typedef std::auto_ptr loop_ptr; typedef std::auto_ptr if_ptr; typedef std::auto_ptr switch_ptr; typedef std::auto_ptr term_ptr; typedef std::auto_ptr mod_ptr; enum FlagTypes { CF_NONE = 0, CF_MITER_JOIN = agg::miter_join, CF_ROUND_JOIN = agg::round_join, CF_BEVEL_JOIN = agg::bevel_join, CF_JOIN_MASK = 0x7, CF_JOIN_PRESENT = 8, CF_BUTT_CAP = agg::butt_cap << 4, CF_ROUND_CAP = agg::round_cap << 4, CF_SQUARE_CAP = agg::square_cap << 4, CF_CAP_MASK = 0x7 << 4, CF_CAP_PRESENT = 8 << 4, CF_ARC_CW = 1 << 8, CF_ARC_LARGE = 1 << 9, CF_CONTINUOUS = 1 << 10, CF_ALIGN = 1 << 11, CF_EVEN_ODD = 1 << 12, CF_ISO_WIDTH = 1 << 13, CF_FILL = 1 << 14, CF_CYCLIC = 31 << 15, CF_DIHEDRAL = 1 << 15, CF_P11G = 2 << 15, CF_P11M = 3 << 15, CF_P1M1 = 4 << 15, CF_P2 = 30 << 15, CF_P2MG = 6 << 15, CF_P2MM = 7 << 15, CF_PM = 8 << 15, CF_PG = 9 << 15, CF_CM = 10 << 15, CF_PMM = 11 << 15, CF_PMG = 12 << 15, CF_PGG = 13 << 15, CF_CMM = 14 << 15, CF_P4 = 15 << 15, CF_P4M = 16 << 15, CF_P4G = 17 << 15, CF_P3 = 18 << 15, CF_P3M1 = 19 << 15, CF_P31M = 20 << 15, CF_P6 = 21 << 15, CF_P6M = 22 << 15, CF_USES_ALPHA = 1 << 20 }; double CFatof(const char* s); enum pathOpEnum { unknownPathop = -1, MOVETO = 0, MOVEREL, LINETO, LINEREL, ARCTO, ARCREL, CURVETO, CURVEREL, CLOSEPOLY }; void addUnique(SymmList& syms, agg::trans_affine& tr); void processDihedral(SymmList& syms, double order, double x, double y, bool dihedral, double angle, const yy::location& where); void processSymmSpec(SymmList& syms, agg::trans_affine& tile, bool tiled, std::vector& data, const yy::location& where); const ASTexpression* getTransforms(const ASTexpression* e, SymmList& syms, Renderer* r, bool tiled, agg::trans_affine& tile); } #endif // INCLUDE_AST_H contextfree-3.0.5+dfsg1.orig/src-common/astreplacement.h0000644000175000017500000002324412076364074021703 0ustar brambram// astreplacement.h // this file is part of Context Free // --------------------- // Copyright (C) 2011-2012 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #ifndef INCLUDE_ASTREPLACEMENT_H #define INCLUDE_ASTREPLACEMENT_H #include "ast.h" #include "astexpression.h" #include "location.hh" #include "cfdg.h" #include "shape.h" #include "primShape.h" #include #include #include #include "CmdInfo.h" #include "agg_path_storage.h" namespace agg { struct trans_affine; } struct StackRule; namespace AST { class ASTreplacement { public: enum repElemListEnum { rule = 8, replacement = 4, mixed = 3, command = 2, op = 1, empty = 0 }; ASTruleSpecifier mShapeSpec; int mRepType; pathOpEnum mPathOp; ASTmodification mChildChange; yy::location mLocation; void replace(Shape& s, Renderer* r, double* width = NULL) const; void replaceShape(Shape& s, Renderer* r) const; ASTreplacement(ASTruleSpecifier& shapeSpec, const std::string& name, mod_ptr mods, const yy::location& loc = CfdgError::Default, repElemListEnum t = replacement); ASTreplacement(ASTruleSpecifier& shapeSpec, mod_ptr mods, const yy::location& loc = CfdgError::Default, repElemListEnum t = replacement); virtual ~ASTreplacement(); virtual void traverse(const Shape& parent, bool tr, Renderer* r) const; private: ASTreplacement(const ASTreplacement&); }; class ASTrepContainer { public: pathOpEnum mPathOp; int mRepType; ASTbody mBody; ASTparameters mParameters; bool isGlobal; unsigned mStackCount; ASTrepContainer() : mPathOp(unknownPathop), mRepType(ASTreplacement::empty), isGlobal(false), mStackCount(0) {}; ~ASTrepContainer(); void traverse(const Shape& parent, bool tr, Renderer* r, bool getParams = false) const { size_t s = r->mCFstack.size(); if (getParams && parent.mParameters) r->initStack(parent.mParameters); for (AST::ASTbody::const_iterator it = mBody.begin(); it != mBody.end(); ++it) { (*it)->traverse(parent, tr, r); } r->unwindStack(s, mParameters); } void addParameter(const std::string& type, int index, const yy::location& typeLoc, const yy::location& nameLoc); ASTparameter& addParameter(int index, ASTdefine* def, const yy::location& nameLoc, const yy::location& expLoc); void move(ASTrepContainer& to); }; class ASTloop: public ASTreplacement { public: ASTexpression* mLoopArgs; double mLoopData[3]; ASTrepContainer mLoopBody; ASTrepContainer mFinallyBody; static void setupLoop(double& start, double& end, double& step, ASTexpression* e, const yy::location& loc, Renderer* rti = 0); ASTloop(int nameIndex, const std::string& name, const yy::location& nameLoc, exp_ptr args, const yy::location& argsLoc, mod_ptr mods); virtual ~ASTloop(); virtual void traverse(const Shape& parent, bool tr, Renderer* r) const; }; class ASTtransform: public ASTreplacement { public: ASTrepContainer mBody; SymmList mTransforms; const ASTexpression* mModifications; // weak pointer ASTexpression* mExpHolder; // strong pointer bool mClone; ASTtransform(const yy::location& loc, exp_ptr mods); virtual ~ASTtransform(); virtual void traverse(const Shape& parent, bool tr, Renderer* r) const; private: static agg::trans_affine Dummy; }; class ASTif: public ASTreplacement { public: ASTexpression* mCondition; ASTrepContainer mThenBody; ASTrepContainer mElseBody; ASTif(exp_ptr ifCond, const yy::location& condLoc); virtual ~ASTif(); virtual void traverse(const Shape& parent, bool tr, Renderer* r) const; }; class ASTswitch: public ASTreplacement { public: typedef std::map switchMap; ASTexpression* mSwitchExp; switchMap mCaseStatements; ASTrepContainer mElseBody; ASTswitch(exp_ptr switchExp, const yy::location& expLoc); virtual ~ASTswitch(); virtual void traverse(const Shape& parent, bool tr, Renderer* r) const; void unify(); }; class ASTdefine : public ASTreplacement { public: ASTexpression* mExpression; int mTuplesize; ASTexpression::expType mType; bool isConstant; ASTparameters mParameters; unsigned mStackCount; std::string mName; bool isFunction; ASTdefine(const std::string& name, exp_ptr e, const yy::location& loc); ASTdefine(const std::string& name, mod_ptr m, const yy::location& loc); virtual void traverse(const Shape& parent, bool tr, Renderer* r) const; virtual ~ASTdefine() { delete mExpression; } private: ASTdefine& operator=(const ASTdefine&); }; class ASTrule : public ASTreplacement { public: enum WeightTypes { NoWeight = 1, PercentWeight = 2, ExplicitWeight = 4}; ASTrepContainer mRuleBody; mutable ASTcompiledPath* mCachedPath; double mWeight; bool isPath; int mNameIndex; WeightTypes weightType; static const ASTrule* PrimitivePaths[primShape::numTypes]; static bool compareLT(const ASTrule* a, const ASTrule* b); ASTrule(int ruleIndex, double weight, bool percent, const yy::location& loc) : ASTreplacement(ASTruleSpecifier::Zero, mod_ptr(), loc, rule), mCachedPath(NULL), mWeight(weight <= 0.0 ? 1.0 : weight), isPath(false), mNameIndex(ruleIndex), weightType(percent ? PercentWeight : ExplicitWeight) { }; ASTrule(int ruleIndex, const yy::location& loc) : ASTreplacement(ASTruleSpecifier::Zero, mod_ptr(), loc, rule), mCachedPath(NULL), mWeight(1.0), isPath(false), mNameIndex(ruleIndex), weightType(NoWeight) { }; virtual ~ASTrule(); void traversePath(const Shape& parent, Renderer* r) const; virtual void traverse(const Shape& parent, bool tr, Renderer* r) const; }; class ASTshape : public ASTreplacement { public: ASTrepContainer mRules; bool isPath; int mNameIndex; ASTshape(ASTruleSpecifier& r, bool path, const yy::location& loc) : ASTreplacement(r, mod_ptr(), loc, empty), isPath(path), mNameIndex(r.shapeType) { mRules.isGlobal = true; } virtual void traverse(const Shape& parent, bool tr, Renderer* r) const; }; class ASTpathOp : public ASTreplacement { public: ASTexpression* mArguments; int mFlags; int mArgCount; static const char* PathOpNames[9]; ASTpathOp(const std::string& s, mod_ptr a, const yy::location& loc); ASTpathOp(const std::string& s, exp_ptr a, const yy::location& loc); ~ASTpathOp(); virtual void traverse(const Shape& parent, bool tr, Renderer* r) const; private: void pathData(double* data, Renderer* rti) const; void pathDataConst(); void makePositional(mod_ptr a); void checkArguments(exp_ptr a); }; class ASTpathCommand : public ASTreplacement { public: double mMiterLimit; // Empty constructor ASTpathCommand() : ASTreplacement(ASTruleSpecifier::Zero, mod_ptr()), mMiterLimit(4.0) { } ASTpathCommand(const std::string& s, mod_ptr mods, const yy::location& loc); ASTpathCommand(const std::string& s, mod_ptr mods, exp_ptr params, const yy::location& loc); virtual void traverse(const Shape& parent, bool tr, Renderer* r) const; private: mutable CommandInfo mInfoCache; void check4z() const; }; class ASTcompiledPath { public: bool mComplete; agg::path_storage mPath; InfoCache mCommandInfo; ASTpathCommand mTerminalCommand; bool mUseTerminal; const StackRule* mParameters; CommandInfo::UIDtype mPathUID; void finish(bool setAttr, Renderer* r); void addPathOp(const ASTpathOp* pop, double data[6], const Shape& s, bool tr, Renderer* r); ASTcompiledPath(); static CommandInfo::UIDtype NextPathUID(); private: static CommandInfo::UIDtype GlobalPathUID; }; } #endif //INCLUDE_ASTREPLACEMENT_H contextfree-3.0.5+dfsg1.orig/src-common/upload.h0000644000175000017500000000425112076364074020155 0ustar brambram// upload.h // this file is part of Context Free // --------------------- // Copyright (C) 2007 Mark Lentczner - markl@glyphic.com // Copyright (C) 2008-2012 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // Mark Lentczner can be contacted at markl@glyphic.com or at // Mark Lentczner, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #ifndef INCLUDE_UPLOAD_H #define INCLUDE_UPLOAD_H #include #include class Upload { public: Upload() : mVariation(0), mCompression(CompressJPEG), mTiled(false) {} enum Compression { CompressJPEG = 0, CompressPNG8 = 1 }; std::string mUserName; std::string mPassword; std::string mTitle; std::string mNotes; std::string mFileName; // include .cfdg ending here int mVariation; Compression mCompression; int mTiled; std::string mccLicenseURI; std::string mccLicenseName; std::string mccLicenseImage; const char* mText; // cfdg file, utf-8 text size_t mTextLen; const char* mImage; // png data size_t mImageLen; void generatePayload(std::ostream&); static std::string generateHeader(); static std::string generateContentType(); }; #endif // INCLUDE_UPLOAD_H contextfree-3.0.5+dfsg1.orig/src-common/scanner.h0000644000175000017500000000660112076364074020323 0ustar brambram// scanner.h // this file is part of Context Free // --------------------- // Copyright (C) 2009-2012 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #ifndef CFDG_SCANNER_H #define CFDG_SCANNER_H #include // Flex expects the signature of yylex to be defined in the macro YY_DECL, and // the C++ parser expects it to be declared. We can factor both as follows. #ifndef YY_DECL #define YY_DECL \ int \ yy::Scanner::lex( \ yy::CfdgParser::semantic_type* yylval, \ yy::CfdgParser::location_type* yylloc, \ Builder& driver \ ) #endif #ifndef __FLEX_LEXER_H #define yyFlexLexer CfdgFlexLexer #include "FlexLexer.h" //#undef yyFlexLexer #endif #include "cfdg.tab.hpp" #include "builder.h" #include #include namespace yy { /** Scanner is a derived class to add some extra function to the scanner * class. Flex itself creates a class named yyFlexLexer. However we change * the context of the generated yylex() function to be contained within the * Scanner class. This is required because the yylex() defined in yyFlexLexer * has no parameters. */ class Scanner : public CfdgFlexLexer { public: enum LocAction_t { normalAction, pushLoc, popLoc }; typedef std::map tokenMap; /** Create a new scanner object. The streams arg_yyin and arg_yyout default * to cin and cout, but that assignment is only made when initializing in * yylex(). */ Scanner(std::istream* arg_yyin = 0, std::ostream* arg_yyout = 0); /** Required for virtual functions */ virtual ~Scanner(); /** This is the main lexing function. It is generated by flex according to * the macro declaration YY_DECL above. The generated bison parser then * calls this virtual function to fetch new tokens. */ virtual int lex( CfdgParser::semantic_type* yylval, CfdgParser::location_type* yylloc, Builder& driver ); Builder* driver; LocAction_t nextLocAction; int startToken; int maybeVersion; tokenMap utf8chars; /** Enable debug output (via arg_yyout) if compiled into the scanner. */ void set_debug(bool b); virtual void LexerError(const char* msg); private: void setupLoc(CfdgParser::location_type* yylloc); unsigned int utf8length(const char* txt, size_t len); std::stack mLocationStack; bool atStartup; }; } // namespace yy #endif // CFDG_SCANNER_H contextfree-3.0.5+dfsg1.orig/src-common/tiledCanvas.cpp0000644000175000017500000001776512076364074021477 0ustar brambram// tiledCanvas.cpp // this file is part of Context Free // --------------------- // Copyright (C) 2006-2012 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #include "tiledCanvas.h" #include #include "primShape.h" #include "bounds.h" #include #include void tiledCanvas::start(bool clear, const agg::rgba& bk, int w, int h) { mWidth = w; mHeight = h; mTile->start(clear, bk, w, h); } void tiledCanvas::end() { mTile->end(); } void tiledCanvas::circle(RGBA8 c, agg::trans_affine tr) { for (unsigned int i = 0; i < mTileList.size(); ++i) { agg::trans_affine t(tr); t.tx += mTileList[i].x; t.ty += mTileList[i].y; mTile->circle(c, t); } } void tiledCanvas::square(RGBA8 c, agg::trans_affine tr) { for (unsigned int i = 0; i < mTileList.size(); ++i) { agg::trans_affine t(tr); t.tx += mTileList[i].x; t.ty += mTileList[i].y; mTile->square(c, t); } } void tiledCanvas::triangle(RGBA8 c, agg::trans_affine tr) { for (unsigned int i = 0; i < mTileList.size(); ++i) { agg::trans_affine t(tr); t.tx += mTileList[i].x; t.ty += mTileList[i].y; mTile->triangle(c, t); } } void tiledCanvas::fill(RGBA8 c) { mTile->fill(c); } void tiledCanvas::path(RGBA8 c, agg::trans_affine tr, const AST::CommandInfo& attr) { for (unsigned int i = 0; i < mTileList.size(); ++i) { agg::trans_affine t(tr); t.tx += mTileList[i].x; t.ty += mTileList[i].y; mTile->path(c, t, attr); } } static const double tileBuffer = 1.05; void tiledCanvas::tileTransform(const Bounds& b) // Adjust the translation part of the transform so that it falls within the // tile parallelogram at the origin. // // Returns whether the shape is close to the edge of the canvas // (true=not close, false=close/overlapping). { double centx = (b.mMin_X + b.mMax_X) * 0.5; double centy = (b.mMin_Y + b.mMax_Y) * 0.5; mInvert.transform(¢x, ¢y); // transform to unit square tesselation centx = floor(centx + 0.5); // round to nearest integer centy = floor(centy + 0.5); // round to nearest integer mTileList.clear(); double dx = -centx, dy = -centy; mOffset.transform(&dx, &dy); mTileList.push_back(agg::point_d(dx, dy)); agg::rect_d canvas(-5, -5, (double)(mWidth + 9), (double)(mHeight + 9)); if (mFrieze) { centx += centy; for (int offset = 1; ; ++offset) { bool hit = false; for (int side = -1; side <= 1; side += 2) { dx = offset * side - centx; dy = dx; mOffset.transform(&dx, &dy); // If the tile might touch the canvas then record it agg::rect_d shape(b.mMin_X + dx, b.mMin_Y + dy, b.mMax_X + dx, b.mMax_Y + dy); if (shape.overlaps(canvas)) { hit = true; mTileList.push_back(agg::point_d(dx, dy)); } } if (!hit) return; } } for (int ring = 1; ; ring++) { bool hit = false; for (int y = -ring; y <= ring; y++) { for (int x = -ring; x <= ring; x++) { // These loops enumerate all tile units on and within the ring. // Skip tile units that are within (not on) the ring. if (abs(x) < ring && abs(y) < ring) continue; // Find where this tile is on the canvas dx = x - centx; dy = y - centy; mOffset.transform(&dx, &dy); // If the tile might touch the canvas then record it agg::rect_d shape(b.mMin_X + dx, b.mMin_Y + dy, b.mMax_X + dx, b.mMax_Y + dy); if (shape.overlaps(canvas)) { hit = true; mTileList.push_back(agg::point_d(dx, dy)); } } } if (!hit) return; } } tiledCanvas::tiledCanvas(Canvas* tile, const agg::trans_affine& tr, CFDG::frieze_t f) : Canvas(tile->mWidth, tile->mHeight), mTile(tile), mTileTransform(tr), mFrieze(f) { } void tiledCanvas::scale(double scaleFactor) { agg::trans_affine_scaling scale(scaleFactor); // Generate the tiling transform in pixel units mOffset = mTileTransform * scale; // The mInvert transform can transform coordinates from the pixel unit tiling // to the unit square tiling. if (mFrieze) { mInvert.reset(); mInvert.sx = mOffset.sx == 0.0 ? 0.0 : 1/mOffset.sx; mInvert.sy = mOffset.sy == 0.0 ? 0.0 : 1/mOffset.sy; } else { mInvert = ~mOffset; } } void tiledCanvas::getTesselation(tileList& tessPoints, int w, int h, int x, int y, bool flipY) { // Produce an integer version of mOffset that is centered in the w x h screen agg::trans_affine tess(mWidth, floor(mOffset.shy + 0.5), floor(mOffset.shx + 0.5), flipY ? -mHeight : mHeight, x, y); agg::rect_i screen(0, 0, w - 1, h - 1); if (mFrieze == CFDG::frieze_x) tess.sy = 0.0; if (mFrieze == CFDG::frieze_y) tess.sx = 0.0; tessPoints.push_back(agg::point_i(x, y)); // always include the center tile if (mFrieze) { for (int offset = 1; ; ++offset) { bool hit = false; for (int side = -1; side <= 1; side += 2) { double dx = offset * side; double dy = dx; tess.transform(&dx, &dy); int px = (int)floor(dx + 0.5); int py = (int)floor(dy + 0.5); // If the tile is visible then record it agg::rect_i tile(px, py, px + mWidth - 1, py + mHeight - 1); if (tile.overlaps(screen)) { hit = true; tessPoints.push_back(agg::point_i(px, py)); } } if (!hit) return; } } // examine rings of tile units around the center unit until you encounter a // ring that doesn't have any tile units that intersect the screen. Then stop. for (int ring = 1; ; ring++) { bool hit = false; for (int y = -ring; y <= ring; y++) { for (int x = -ring; x <= ring; x++) { // These loops enumerate all tile units on and within the ring. // Skip tile units that are within (not on) the ring. if (abs(x) < ring && abs(y) < ring) continue; // Find where this tile is on the screen double dx = x; double dy = y; tess.transform(&dx, &dy); int px = (int)floor(dx + 0.5); int py = (int)floor(dy + 0.5); // If the tile is visible then record it agg::rect_i tile(px, py, px + mWidth - 1, py + mHeight - 1); if (tile.overlaps(screen)) { hit = true; tessPoints.push_back(agg::point_i(px, py)); } } } if (!hit) break; } } contextfree-3.0.5+dfsg1.orig/src-common/pathIterator.cpp0000644000175000017500000001255612076364074021701 0ustar brambram// pathIterator.cpp // this file is part of Context Free // --------------------- // Copyright (C) 2011-2012 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #include "pathIterator.h" #include "ast.h" #include "CmdInfo.h" #include "primShape.h" static primShape dummy; pathIterator::pathIterator() : curved(dummy), curvedStroked(curved), curvedStrokedTrans(curvedStroked, unitTrans), curvedTrans(curved, unitTrans), curvedTransStroked(curvedTrans), curvedTransCentroid(curvedTrans), curvedStrokedTransCentroid(curvedStrokedTrans), curvedTransStrokedCentroid(curvedTransStroked) { } void pathIterator::apply(const AST::CommandInfo& attr, const agg::trans_affine& tr, double accuracy) { double scale = sqrt(fabs(tr.determinant())); if (attr.mFlags & AST::CF_FILL) { curved.attach(*attr.mPath); curvedTrans.transformer(tr); curved.approximation_scale(accuracy * scale); } else { if (attr.mFlags & AST::CF_ISO_WIDTH) { curved.attach(*attr.mPath); curvedTrans.transformer(tr); curvedTransStroked.width(attr.mStrokeWidth * scale); curvedTransStroked.line_join((agg::line_join_e)(attr.mFlags & 7)); curvedTransStroked.line_cap((agg::line_cap_e)((attr.mFlags >> 4) & 7)); curvedTransStroked.miter_limit(attr.mMiterLimit); curvedTransStroked.inner_join(agg::inner_round); curvedTransStroked.approximation_scale(accuracy); curved.approximation_scale(accuracy * scale); // If the *visual* line width is considerable we // turn on processing of curve cusps. //--------------------- if (attr.mStrokeWidth * scale > 1.0) { curved.angle_tolerance(0.2); } else { curved.angle_tolerance(0.0); } } else { curved.attach(*attr.mPath); curvedStrokedTrans.transformer(tr); curvedStroked.width(attr.mStrokeWidth); curvedStroked.line_join((agg::line_join_e)(attr.mFlags & 7)); curvedStroked.line_cap((agg::line_cap_e)((attr.mFlags >> 4) & 7)); curvedStroked.miter_limit(attr.mMiterLimit); curvedStroked.inner_join(agg::inner_round); curvedStroked.approximation_scale(accuracy * scale); curved.approximation_scale(accuracy * scale); // If the *visual* line width is considerable we // turn on processing of curve cusps. //--------------------- if (attr.mStrokeWidth * scale > 1.0) { curved.angle_tolerance(0.2); } else { curved.angle_tolerance(0.0); } } } } template <> void pathIterator::addPath >(agg::rasterizer_scanline_aa<>& ras, const agg::trans_affine& tr, const AST::CommandInfo& attr) { apply(attr, tr, 1.0); if (attr.mFlags & AST::CF_FILL) { ras.add_path(curvedTrans, attr.mIndex); } else { if (attr.mFlags & AST::CF_ISO_WIDTH) { ras.add_path(curvedTransStroked, attr.mIndex); } else { ras.add_path(curvedStrokedTrans, attr.mIndex); } } } bool pathIterator::boundingRect(const agg::trans_affine& tr, const AST::CommandInfo& attr, double& minx, double& miny, double& maxx, double& maxy, double scale, agg::point_d* cent, double* area) { apply(attr, tr, scale * 0.1); bool ret; if (attr.mFlags & AST::CF_FILL) { ret = agg::bounding_rect_single(curvedTransCentroid, attr.mIndex, &minx, &miny, &maxx, &maxy); if (cent) *cent = curvedTransCentroid.m_centroid; if (area) *area = curvedTransCentroid.m_area; } else { if (attr.mFlags & AST::CF_ISO_WIDTH) { ret = agg::bounding_rect_single(curvedTransStrokedCentroid, attr.mIndex, &minx, &miny, &maxx, &maxy); if (cent) *cent = curvedTransStrokedCentroid.m_centroid; if (area) *area = curvedTransStrokedCentroid.m_area; } else { ret = agg::bounding_rect_single(curvedStrokedTransCentroid, attr.mIndex, &minx, &miny, &maxx, &maxy); if (cent) *cent = curvedStrokedTransCentroid.m_centroid; if (area) *area = curvedStrokedTransCentroid.m_area; } } return ret; } contextfree-3.0.5+dfsg1.orig/src-common/cfdg.h0000644000175000017500000001756012076364074017603 0ustar brambram// cfdg.h // this file is part of Context Free // --------------------- // Copyright (C) 2005-2008 Mark Lentczner - markl@glyphic.com // Copyright (C) 2005-2013 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // Mark Lentczner can be contacted at markl@glyphic.com or at // Mark Lentczner, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #ifndef INCLUDE_CFDG_H #define INCLUDE_CFDG_H #include #include #include #include #include "agg_trans_affine.h" #include "agg_color_rgba.h" #include "agg_path_storage.h" #include "location.hh" #include "CmdInfo.h" #include "stacktype.h" #include "Rand64.h" typedef agg::rgba16 RGBA8; namespace AST { class ASTcompiledPath; class ASTrule; class ASTparameter; typedef std::vector SymmList; } namespace agg { struct trans_affine_time; } class Shape; class tiledCanvas; class DeferUntilRuntime {}; class CfdgError { public: const char* what; yy::location where; static yy::location Default; static void Error(const yy::location& errLoc, const char* msg); static void Warning(const yy::location& errLoc, const char* msg); CfdgError(const yy::location& loc, const char* msg); CfdgError(const char* msg); }; class AbstractSystem { public: virtual void message(const char* fmt, ...) = 0; virtual void syntaxError(const CfdgError& err) = 0; virtual bool error(bool errorOccurred = true) { return errorOccurred; }; virtual std::istream* openFileForRead(const std::string& path) = 0; virtual std::istream* tempFileForRead(const std::string& path) = 0; virtual std::ostream* tempFileForWrite(std::string& prefixInNameOut) = 0; // caller must delete returned streams when done virtual std::string relativeFilePath( const std::string& base, const std::string& rel) = 0; struct Stats { int shapeCount; // finished shapes in image int toDoCount; // unfinished shapes still to expand bool inOutput; // true if we are in the output loop bool fullOutput; // not an incremental output bool finalOutput; // the last output bool showProgress; int outputCount; // number to be output int outputDone; // number output so far clock_t outputTime; bool animating; // inside the animation loop Stats() : shapeCount(0), toDoCount(0), inOutput(false), fullOutput(false), finalOutput(false), showProgress(false), outputCount(0), outputDone(0), outputTime(0), animating(false) {} }; virtual void orphan() = 0; virtual void stats(const Stats&); virtual ~AbstractSystem(); }; class Canvas { public: virtual void start(bool , const agg::rgba& , int , int ) { mTime = clock(); } virtual void end() { mTime = clock() - mTime; } virtual void circle(RGBA8 , agg::trans_affine ) = 0; virtual void square(RGBA8 , agg::trans_affine ) = 0; virtual void triangle(RGBA8 , agg::trans_affine ) = 0; virtual void fill(RGBA8) = 0; virtual void path(RGBA8 , agg::trans_affine, const AST::CommandInfo& ) = 0; Canvas(int width, int height) : mWidth(width), mHeight(height) {} virtual ~Canvas(); int mWidth; int mHeight; clock_t mTime; }; class Renderer; class CFDG { public: enum frieze_t { no_frieze = 0, frieze_x, frieze_y }; static CFDG* ParseFile(const char* fname, AbstractSystem*, int variation); virtual ~CFDG(); virtual Renderer* renderer( int width, int height, double minSize, int variation, double border = 2.0 ) = 0; // caller must delete returned object bool usesColor; bool usesAlpha; bool uses16bitColor; bool usesTime; bool usesFrameTime; virtual bool isTiled(agg::trans_affine* tr = 0, double* x = 0, double* y = 0) const = 0; virtual frieze_t isFrieze(agg::trans_affine* tr = 0, double* x = 0, double* y = 0) const = 0; virtual bool isSized(double* x = 0, double* y = 0) const = 0; virtual bool isTimed(agg::trans_affine_time* t = 0) const = 0; virtual const agg::rgba& getBackgroundColor(Renderer* r) = 0; virtual void getSymmetry(AST::SymmList& syms, Renderer* r) = 0; protected: CFDG() : usesColor(false), usesAlpha(false), uses16bitColor(false), usesTime(false), usesFrameTime(false) { } }; class Renderer { public: // OS interface virtual ~Renderer(); virtual void setMaxShapes(int n) = 0; virtual void resetBounds() = 0; virtual void resetSize(int x, int y) = 0; virtual double run(Canvas* canvas, bool partialDraw) = 0; virtual void draw(Canvas* canvas) = 0; virtual void animate(Canvas* canvas, int frames, bool zoom) = 0; volatile bool requestStop; // stop ASAP volatile bool requestFinishUp; // stop expanding, and do final output volatile bool requestUpdate; // call stats() soon int m_width; int m_height; tiledCanvas* m_tiledCanvas; static double Infinity; static bool AbortEverything; // AST interface std::vector mCFstack; const StackType* mLogicalStackTop; void initStack(const StackType* p); void unwindStack(size_t oldsize, const std::vector& params); Rand64 mCurrentSeed; bool mRandUsed; double mMaxNatural; double mCurrentTime; double mCurrentFrame; agg::point_d mLastPoint; bool mStop; bool mClosed; bool mWantMoveTo; bool mWantCommand; unsigned mIndex; unsigned mNextIndex; AST::ASTcompiledPath* mCurrentPath; AST::InfoCache::iterator mCurrentCommand; void init(); static bool isNatural(Renderer* r, double n); static void ColorConflict(Renderer* r, const yy::location& w); virtual void storeParams(const StackType* p) = 0; virtual void processPathCommand(const Shape& s, const AST::CommandInfo* attr) = 0; virtual void processShape(const Shape& s) = 0; virtual void processPrimShape(const Shape& s, const AST::ASTrule* attr = 0) = 0; virtual void processSubpath(const Shape& s, bool tr, int) = 0; protected: Renderer() : requestStop(false), requestFinishUp(false), requestUpdate(false), m_tiledCanvas(0), mMaxNatural(1000.0), mCurrentTime(0.0), mCurrentFrame(0.0), mCurrentPath(0) { } virtual void colorConflict(const yy::location& w) = 0; }; #endif contextfree-3.0.5+dfsg1.orig/src-common/shape.h0000644000175000017500000001165112076364074017773 0ustar brambram// shape.h // this file is part of Context Free // --------------------- // Copyright (C) 2005-2008 Mark Lentczner - markl@glyphic.com // Copyright (C) 2005-2013 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // Mark Lentczner can be contacted at markl@glyphic.com or at // Mark Lentczner, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #ifndef INCLUDE_SHAPE_H #define INCLUDE_SHAPE_H #include #include #include "agg_math_stroke.h" #include "agg_trans_affine.h" #include "agg_trans_affine_1D.h" #include "agg_trans_affine_time.h" #include "agg_color_rgba.h" #include "HSBColor.h" #include "Rand64.h" #include "bounds.h" #include "stacktype.h" // Contains all of the information about a change to a shape class Modification { public: agg::trans_affine m_transform; agg::trans_affine_1D m_Z; agg::trans_affine_time m_time; HSBColor m_Color; HSBColor m_ColorTarget; int m_ColorAssignment; Rand64 mRand64Seed; Modification() : m_ColorAssignment(0) { } double area() const { return fabs(m_transform.determinant()); } bool isFinite() const; Modification operator*(const Modification& m) const { Modification n = *this; n *= m; return n; } Modification& operator*=(const Modification& m) { m_transform.premultiply(m.m_transform); m_Z.premultiply(m.m_Z); m_time.premultiply(m.m_time); HSBColor::Adjust(m_Color, m_ColorTarget, m.m_Color, m.m_ColorTarget, m.m_ColorAssignment); mRand64Seed ^= m.mRand64Seed; return *this; } bool merge(const Modification& m); }; class ShapeBase { public: int mShapeType; Modification mWorldState; double mAreaCache; double area() const { return mAreaCache; } protected: ShapeBase() : mShapeType(-1) { mAreaCache = mWorldState.area(); } void write(std::ostream& os) const; void read(std::istream& is); }; // Contains all of the information about a shape that is used during parsing // and executing a cfdg file class Shape : public ShapeBase { public: Shape() : ShapeBase(), mParameters(NULL) {} const StackType* mParameters; Shape operator*(const Modification& m) const { Shape s = *this; s.mWorldState *= m; s.mAreaCache = s.mWorldState.area(); return s; } Shape& operator*=(const Modification& m) { mWorldState *= m; mAreaCache = mWorldState.area(); return *this; } void releaseParams() const { if (mParameters) mParameters->release(); } bool operator<(const Shape& b) const { return mAreaCache < b.mAreaCache; } void write(std::ostream& os) const; void read(std::istream& is); protected: void writeParams(std::ostream& os) const; void readParams(std::istream& is); }; class FinishedShape : public Shape { public: Bounds mBounds; FinishedShape() : Shape() {} FinishedShape(const Shape& s, double totalArea, const Bounds& b) { mShapeType = s.mShapeType; mWorldState = s.mWorldState; mAreaCache = totalArea; mParameters = s.mParameters; mBounds = b; }; bool operator<(const Shape& b) const { return (mWorldState.m_Z.tz == b.mWorldState.m_Z.tz) ? (mAreaCache < b.mAreaCache) : (mWorldState.m_Z.tz < b.mWorldState.m_Z.tz); } void write(std::ostream& os) const; void read(std::istream& is); }; inline std::ostream& operator<<(std::ostream& os, const Shape& s) { s.write(os); return os; } inline std::istream& operator>>(std::istream& is, Shape& s) { s.read(is); return is; } inline std::ostream& operator<<(std::ostream& os, const FinishedShape& s) { s.write(os); return os; } inline std::istream& operator>>(std::istream& is, FinishedShape& s) { s.read(is); return is; } const double MY_PI = 3.14159265358979323846; const int ModificationSize = (sizeof(Modification) + 7) >> 3; #endif // INCLUDE_SHAPE_H contextfree-3.0.5+dfsg1.orig/src-common/HSBColor.h0000644000175000017500000001124112076364074020301 0ustar brambram// HSBColor.h // this file is part of Context Free // --------------------- // Copyright (C) 2005-2008 Mark Lentczner - markl@glyphic.com // Copyright (C) 2005-2011 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // Mark Lentczner can be contacted at markl@glyphic.com or at // Mark Lentczner, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #ifndef __HSBCOLOR_H_ #define __HSBCOLOR_H_ namespace agg { struct rgba; }; #define EQUALITY_THRESHOLD 0.00001 #include struct HSBColor { enum AssignmentTypes { ColorTarget = 1, Color2Value = 3, ColorMask = 3, HueTarget = ColorTarget, Hue2Value = Color2Value, HueMask = 3, SaturationTarget = ColorTarget << 2, Saturation2Value = Color2Value << 2, SaturationMask = 3 << 2, BrightnessTarget = ColorTarget << 4, Brightness2Value = Color2Value << 4, BrightnessMask = 3 << 4, AlphaTarget = ColorTarget << 6, Alpha2Value = Color2Value << 6, AlphaMask = 3 << 6 }; HSBColor() : h(0), s(0), b(0), a(0) {}; HSBColor(double hue, double sat, double bri, double alpha) : h(hue), s(sat), b(bri), a(alpha) {}; HSBColor(const agg::rgba&); static void Adjust(HSBColor& dest, HSBColor& destTarget, const HSBColor& adj, const HSBColor& adjTarg, int assign); void getRGBA(agg::rgba& c) const; bool operator!=(const HSBColor& hsb) const { return h != hsb.h || s != hsb.s || b != hsb.b || a != hsb.s; } double h, s, b, a; static inline double adjust(const double& base, const double& adjustment, int useTarget = 0, const double& target = 0.0); static inline double adjustHue(const double& base, const double& adjustment, int useTarget = 0, const double& target = 0.0); static double delta(double to, double from, unsigned int steps = 1); static double deltaHue(double to, double from, unsigned int steps = 1); }; inline double HSBColor::adjust(const double& base, const double& adjustment, int useTarget, const double& target) { if (adjustment == 0.0) return base; if (useTarget) { // If we are really close to the target then don't change, even if // the adjustment is negative (which way would we go?) if (adjustment > 0 && fabs(base - target) < EQUALITY_THRESHOLD) return base; // Otherwise move away from or toward the target double edge = base < target ? 0 : 1; if (adjustment < 0) return base + ( base - edge) * adjustment; else return base + (target - base) * adjustment; } else { // Move toward 0 or toward 1 if (adjustment < 0) return base + base * adjustment; else return base + (1 - base) * adjustment; } } inline double HSBColor::adjustHue(const double& base, const double& adjustment, int useTarget, const double& target) { if (adjustment == 0.0) return base; double h; if (useTarget) { // decrease or increase toward target. If the target hue does not // cooperate by being smaller (or larger) than the current hue then // add/subtract 360 to make it so. This only works if all hues are // within the interval [0,360). double t = target; if (adjustment < 0) { if (t > base) t -= 360; h = base + (base - t) * adjustment; } else { if (t < base) t += 360; h = base + (t - base) * adjustment; } } else { h = base + adjustment; } // Normalize result to the interval [0,360) return h < 0.0 ? fmod(h + 360.0, 360.0) : fmod(h, 360.0); } #endif contextfree-3.0.5+dfsg1.orig/src-common/aggCanvas.cpp0000644000175000017500000003227712076364074021127 0ustar brambram// aggCanvas.cpp // this file is part of Context Free // --------------------- // Copyright (C) 2005-2008 Mark Lentczner - markl@glyphic.com // Copyright (C) 2006-2012 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // Mark Lentczner can be contacted at markl@glyphic.com or at // Mark Lentczner, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #include "aggCanvas.h" #include "agg_rendering_buffer.h" #include "agg_pixfmt_rgba.h" #include "agg_pixfmt_rgb.h" #include "agg_pixfmt_gray.h" #include "agg_renderer_fill.h" #include "agg_renderer_scanline.h" #include "agg_rasterizer_scanline_aa.h" #include "agg_scanline_p.h" #include "agg_fast_ellipse.h" #include "agg_trans_affine.h" #include "agg_copy_rect.h" #include "primShape.h" #include "ast.h" #include "pathIterator.h" #include #include #ifdef _WIN32 typedef agg::pixfmt_bgra64_pre color64_pixel_fmt; typedef agg::pixfmt_bgr48_pre color48_pixel_fmt; typedef agg::pixfmt_bgra32_pre color32_pixel_fmt; typedef agg::pixfmt_bgr24_pre color24_pixel_fmt; #else typedef agg::pixfmt_rgba64_pre color64_pixel_fmt; typedef agg::pixfmt_rgb48_pre color48_pixel_fmt; typedef agg::pixfmt_rgba32_pre color32_pixel_fmt; typedef agg::pixfmt_rgb24_pre color24_pixel_fmt; #endif typedef agg::pixfmt_argb32_pre ff_pixel_fmt; typedef agg::pixfmt_rgb24_pre ff24_pixel_fmt; typedef agg::pixfmt_rgba32_pre qt_pixel_fmt; typedef agg::pixfmt_gray8_pre gray_pixel_fmt; typedef agg::pixfmt_gray16_pre gray16_pixel_fmt; #ifndef M_PI #define M_PI 3.14159265358979323846 #endif #define PNG8Limit 32 #define ADJ_SMALL_SIZE 5.000 #define ADJ_CIRCLE_SIZE 0.30 #define ADJ_SQUARE_SIZE 0.80 #define ADJ_TRIANGLE_SIZE 0.90 int aggCanvas::BytesPerPixel[13] = {4, 1, 4, 3, 4, 3, 4, 0, 0, 2, 8, 6, 0}; namespace { inline double adjustShapeSize(agg::trans_affine& tr, double adjustment) { double origx = 0; double origy = 0; tr.transform(&origx, &origy); double px = 1; double py = 0; tr.transform(&px, &py); double sizex = sqrt((px - origx) * (px - origx) + (py - origy) * (py - origy)); px = 0; py = 1; tr.transform(&px, &py); double sizey = sqrt((px - origx) * (px - origx) + (py - origy) * (py - origy)); double scalex = (sizex < ADJ_SMALL_SIZE) ? ((ADJ_SMALL_SIZE + adjustment) / ADJ_SMALL_SIZE) : ((sizex + adjustment) / sizex); double scaley = (sizey < ADJ_SMALL_SIZE) ? ((ADJ_SMALL_SIZE + adjustment) / ADJ_SMALL_SIZE) : ((sizey + adjustment) / sizey); // Scale the linear part of the affine transform (not the translation) agg::trans_affine_scaling sc(scalex, scaley); tr.premultiply(sc); return (sizex + sizey) / 2; } inline double adjustCircleSize(agg::trans_affine& tr) { return adjustShapeSize(tr, ADJ_CIRCLE_SIZE); } inline double adjustSquareSize(agg::trans_affine& tr) { return adjustShapeSize(tr, ADJ_SQUARE_SIZE); } inline double adjustTriangleSize(agg::trans_affine& tr) { return adjustShapeSize(tr, ADJ_TRIANGLE_SIZE); } }; class aggCanvas::impl { public: typedef agg::conv_transform TransSquare; typedef agg::conv_transform TransTriangle; typedef agg::conv_transform TransEllipse; agg::rendering_buffer buffer; aggCanvas* mCanvas; agg::fast_ellipse unitEllipse; agg::trans_affine unitTrans; primShape unitSquare; TransSquare shapeSquare; TransEllipse shapeEllipse; primShape unitTriangle; TransTriangle shapeTriangle; pathIterator pathSource; agg::rasterizer_scanline_aa<> rasterizer; agg::scanline_p8 scanline; agg::trans_affine offset; int offsetX; int offsetY; int cropWidth; int cropHeight; std::set pixelSet; impl(aggCanvas* canvas) : buffer(), mCanvas(canvas), unitSquare(primShape::square), shapeSquare(unitSquare, unitTrans), shapeEllipse(unitEllipse, unitTrans), unitTriangle(primShape::triangle), shapeTriangle(unitTriangle, unitTrans), cropWidth(0), cropHeight(0) { // rasterizer.gamma(agg::gamma_power(1.0)); } virtual ~impl() {}; virtual void reset() = 0; virtual void clear(const agg::rgba& bk) = 0; virtual void fill(RGBA8 bk) = 0; virtual void draw(RGBA8 c, agg::filling_rule_e fr = agg::fill_non_zero) = 0; virtual bool colorCount256() = 0; virtual void copy(void* data, unsigned width, unsigned height, int stride, PixelFormat format) = 0; }; template class aggPixelPainter : public aggCanvas::impl { public: typedef agg::renderer_fill renderer_base; typedef agg::renderer_scanline_aa_solid renderer_solid; pixel_fmt pixFmt; renderer_base rendBase; renderer_solid rendSolid; aggPixelPainter(aggCanvas* canvas) : aggCanvas::impl(canvas), pixFmt(buffer), rendBase(pixFmt), rendSolid(rendBase) { } ~aggPixelPainter() { } void reset() { rendBase.reset_clipping(true); } void clear(const agg::rgba& bk); void fill(RGBA8 bk); void draw(RGBA8 c, agg::filling_rule_e fr = agg::fill_non_zero); bool colorCount256(); void copy(void* data, unsigned width, unsigned height, int stride, aggCanvas::PixelFormat format); }; template bool aggPixelPainter::colorCount256() { return pixelSet.size() < PNG8Limit; } template void aggPixelPainter::clear(const agg::rgba& bk) { typedef typename pixel_fmt::color_type color_type; agg::rgba bk_pre = bk; bk_pre.premultiply(); rendBase.clear(color_type(bk_pre)); } template void aggPixelPainter::fill(RGBA8 bk) { typedef typename pixel_fmt::color_type color_type; typedef agg::ColorConverter Converter_type; color_type c = Converter_type::f(bk); rendBase.fill(c.premultiply()); } template void aggPixelPainter::draw(RGBA8 col, agg::filling_rule_e fr) { typedef typename pixel_fmt::color_type color_type; typedef agg::ColorConverter Converter_type; if (pixelSet.size() < PNG8Limit) { agg::int64u pixel = (agg::int64u)col.r << 48 | (agg::int64u)col.g << 32 | (agg::int64u)col.b << 16 | (agg::int64u)col.a; pixelSet.insert(pixel); } color_type c = Converter_type::f(col); rendSolid.color(c.premultiply()); rasterizer.filling_rule(fr); agg::render_scanlines(rasterizer, scanline, rendSolid); rasterizer.reset(); } template void aggPixelPainter::copy(void* data, unsigned width, unsigned height, int stride, aggCanvas::PixelFormat format) { agg::rendering_buffer srcBuffer((agg::int8u*)data, width, height, -stride); switch (format) { case aggCanvas::Gray8_Blend: { gray_pixel_fmt srcPixFmt(srcBuffer); agg::copy_rect(srcPixFmt, pixFmt); break; } case aggCanvas::Gray16_Blend: { gray16_pixel_fmt srcPixFmt(srcBuffer); agg::copy_rect(srcPixFmt, pixFmt); break; } case aggCanvas::RGBA8_Blend: { color32_pixel_fmt srcPixFmt(srcBuffer); agg::copy_rect(srcPixFmt, pixFmt); break; } case aggCanvas::RGBA16_Blend: { color64_pixel_fmt srcPixFmt(srcBuffer); agg::copy_rect(srcPixFmt, pixFmt); break; } case aggCanvas::RGB8_Blend: { color24_pixel_fmt srcPixFmt(srcBuffer); agg::copy_rect(srcPixFmt, pixFmt); break; } case aggCanvas::RGB16_Blend: { color48_pixel_fmt srcPixFmt(srcBuffer); agg::copy_rect(srcPixFmt, pixFmt); break; } case aggCanvas::FF_Blend: case aggCanvas::FF24_Blend: case aggCanvas::QT_Blend: assert(false); break; default: break; } } aggCanvas::aggCanvas(PixelFormat pixfmt) : Canvas(0, 0) { switch (pixfmt) { case Gray8_Blend: m = new aggPixelPainter(this); break; case RGBA8_Blend: m = new aggPixelPainter(this); break; case RGB8_Blend: m = new aggPixelPainter(this); break; case Gray16_Blend: m = new aggPixelPainter(this); break; case RGBA16_Blend: m = new aggPixelPainter(this); break; case RGB16_Blend: m = new aggPixelPainter(this); break; case FF_Blend: m = new aggPixelPainter(this); break; case FF24_Blend: m = new aggPixelPainter(this); break; case QT_Blend: m = new aggPixelPainter(this); break; default: m = 0; break; } } aggCanvas::~aggCanvas() { delete m; } void aggCanvas::start(bool clear, const agg::rgba& bk, int width, int height) { Canvas::start(clear, bk, width, height); if (clear) { m->pixelSet.clear(); m->cropWidth = width; m->cropHeight = height; m->offsetX = (mWidth - width) / 2; m->offsetY = (mHeight - height) / 2; agg::trans_affine_translation off(m->offsetX, m->offsetY); m->offset = off; m->clear(bk); } } void aggCanvas::end() { Canvas::end(); } void aggCanvas::circle(RGBA8 c, agg::trans_affine tr) { double size = adjustCircleSize(tr) / 2.0; tr *= m->offset; m->shapeEllipse.transformer(tr); m->unitEllipse.init(0.0, 0.0, 0.5, 0.5, int(size)+8); m->rasterizer.add_path(m->shapeEllipse); m->draw(c); } void aggCanvas::square(RGBA8 c, agg::trans_affine tr) { adjustSquareSize(tr); tr *= m->offset; m->shapeSquare.transformer(tr); m->rasterizer.add_path(m->shapeSquare); m->draw(c); } void aggCanvas::triangle(RGBA8 c, agg::trans_affine tr) { adjustTriangleSize(tr); tr *= m->offset; m->shapeTriangle.transformer(tr); m->rasterizer.add_path(m->shapeTriangle); m->draw(c); } void aggCanvas::fill(RGBA8 c) { m->fill(c); } void aggCanvas::path(RGBA8 c, agg::trans_affine tr, const AST::CommandInfo& attr) { tr *= m->offset; // already multiplied by attr->mTransform agg::filling_rule_e rule = (attr.mFlags & (AST::CF_EVEN_ODD | AST::CF_FILL)) == (AST::CF_EVEN_ODD | AST::CF_FILL) ? agg::fill_even_odd : agg::fill_non_zero; m->pathSource.addPath(m->rasterizer, tr, attr); m->draw(c, rule); } void aggCanvas::attach(void* data, unsigned width, unsigned height, int stride, bool invert) { m->buffer.attach((agg::int8u*)data, width, height, invert ? -stride : stride); m->cropWidth = width; m->cropHeight = height; mWidth = width; mHeight = height; m->offsetX = 0; m->offsetY = 0; m->reset(); } void aggCanvas::copy(void* data, unsigned width, unsigned height, int stride, PixelFormat format) { m->copy(data, width, height, stride, format); } bool aggCanvas::colorCount256() { return m->colorCount256(); } int aggCanvas::cropX() { return m->offsetX; } int aggCanvas::cropY() { return m->offsetY; } int aggCanvas::cropWidth() { return m->cropWidth; } int aggCanvas::cropHeight() { return m->cropHeight; } aggCanvas::PixelFormat aggCanvas::SuggestPixelFormat(CFDG* engine) { if (engine == 0) return RGBA8_Blend; int ret = Gray8_Blend; if (engine->usesAlpha) ret = RGBA8_Blend; else if (engine->usesColor) ret = RGB8_Blend; if (engine->uses16bitColor) ret += Has_16bit_Color; return (PixelFormat)ret; } contextfree-3.0.5+dfsg1.orig/src-common/variation.h0000644000175000017500000000365412076364074020673 0ustar brambram// variation.h // this file is part of Context Free // --------------------- // Copyright (C) 2005-2008 Mark Lentczner - markl@glyphic.com // Copyright (C) 2005-2008 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // Mark Lentczner can be contacted at markl@glyphic.com or at // Mark Lentczner, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #ifndef INCLUDED_VARIATION #define INCLUDED_VARIATION #ifdef VC6 typedef unsigned short WinTcharType; #else typedef wchar_t WinTcharType; #endif class Variation { public: static int fromString(const char* str); static void toString(int var, char* str, bool lowerCase); static int fromString(const WinTcharType* str); static void toString(int var, WinTcharType* str, bool lowerCase); enum Constants { maxStringLength = 9 }; // including null terminator static int recommendedMin(); static int recommendedMax(int letters = 3); // if giving the user an up/down control, cycle between these inclusive static int random(int letters = 3); // return a random variation, in the recommended range }; #endif // INCLUDED_VARIATION contextfree-3.0.5+dfsg1.orig/src-common/test.h0000644000175000017500000000773512076364074017662 0ustar brambram// test.h // this file is part of Context Free // --------------------- // Copyright (C) 2003 Mark Lentczner - markl@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // Mark Lentczner can be contacted at markl@glyphic.com or at // Mark Lentczner, 1209 Villa St., Mountain View, CA 94041-1123, USA // // // A small test framework #ifndef INCLUDED_TEST_H #define INCLUDED_TEST_H #include #include namespace Test { class testlocation { public: testlocation(const char* f, long l, int = 0); testlocation(const char* f, long l, const testlocation& t); testlocation(const testlocation& o); operator std::string() const; void put(std::ostream&) const; private: testlocation& operator=(const testlocation& o); const char* file; int line; const testlocation* from; }; class test { public: test(const char* group, const char* name, const char* built = __DATE__ " " __TIME__); virtual void run() = 0; std::string name; protected: static const int _called_from = 0; }; void pass(const testlocation& loc); void fail(const testlocation& loc, const std::string& message); void failsame(const testlocation& loc, const char* expectExpr, const char* actualExpr); void skip(const testlocation& loc); void failsame(const testlocation& loc, const char* expectExpr, const std::string& expected, const char* actualExpr, const std::string& actual); void fail_contains(const testlocation& loc, const std::string& needle, const std::string& haystack); template std::string tostring(T) { return ""; } std::string tostring(const std::string& s); std::string tostring(int i); std::string tostring(bool b); template void check_same(const testlocation& loc, const char* expectExpr, TE expected, const char* actualExpr, TA actual) { if (actual != (TA)expected) failsame(loc, expectExpr, tostring((TA)expected), actualExpr, tostring(actual)); else pass(loc); } void check_contains(const testlocation& loc, const char* needleExpr, const std::string& needle, const char* haystackExpr, const std::string& haystack); void check(const testlocation& loc, const char* expr, bool actual); bool runAll( bool reportPerGroup = false, bool stopOnFailingGroup = false); // returns true if passes all tests } #define TEST(group, name) \ struct Test_##group##_##name : public ::Test::test { \ Test_##group##_##name() : ::Test::test(#group, #name) { } \ void run(); \ } test_##group##_##name; \ void Test_##group##_##name::run() #define HERE ::Test::testlocation(__FILE__, __LINE__, _called_from) #define WHERE const ::Test::testlocation& _called_from #define THERE _called_from #define PASS() \ ::Test::pass(HERE) #define FAIL(message) \ ::Test::fail(HERE, message) #define SKIP() \ ::Test::skip(HERE) #define CHECK(cond) \ ::Test::check(HERE, #cond, cond) #define CHECK_MSG(cond, message) \ ::Test::check(HERE, message, cond) #define CHECK_SAME(v, e) \ ::Test::check_same(HERE, #v, v, #e, e) #define CHECK_CONTAINS(needle, haystack) \ ::Test::check_contains(HERE, #needle, needle, #haystack, haystack) #define CHECK_VALID(ptr) \ CHECK((ptr) != 0) #endif // INCLUDED_TEST_H contextfree-3.0.5+dfsg1.orig/src-common/builder.h0000644000175000017500000001321012076364074020312 0ustar brambram// builder.h // this file is part of Context Free // --------------------- // Copyright (C) 2005-2008 Mark Lentczner - markl@glyphic.com // Copyright (C) 2005-2012 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // Mark Lentczner can be contacted at markl@glyphic.com or at // Mark Lentczner, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #ifndef INCLUDE_BUILDER_H #define INCLUDE_BUILDER_H #ifdef _WIN32 #pragma warning( disable : 4786 ) #endif #include #include #include #include #include #include "agg_basics.h" #include "Rand64.h" #include "shape.h" #include "cfdg.h" #include "astreplacement.h" class CFDGImpl; namespace yy { class location; } namespace yy { class Scanner; } class Builder { public: static Builder* CurrentBuilder; static double MaxNatural; CFDGImpl* m_CFDG; std::stack m_filesToLoad; std::stack m_streamsToLoad; std::stack m_includeNamespace; std::string* m_currentPath; std::string* m_basePath; int m_pathCount; bool mInPathContainer; std::string mCurrentNameSpace; int mCurrentShape; Rand64 mSeed; bool mWant2ndPass; int mCompilePhase; AST::ASTrepContainer mParamDecls; static std::map FlagNames; int mLocalStackDepth; unsigned mIncludeDepth; bool mAllowOverlap; typedef std::deque ContainerStack_t; ContainerStack_t mContainerStack; void push_repContainer(AST::ASTrepContainer& c); void pop_repContainer(AST::ASTreplacement* r); void push_paramDecls(const std::string& name, const yy::location& defLoc, const std::string & type); void push_rep(AST::ASTreplacement* r, bool global = false); const char* push_param(); AST::ASTparameter* findExpression(int nameIndex, bool& isGlobal); void process_repContainer(AST::ASTrepContainer& c); std::stack switchStack; yy::Scanner* lexer; void warning(const yy::location& errLoc, const std::string& msg); void error(const yy::location& errLoc, const std::string& msg); void error(int line, const char* msg); bool mErrorOccured; Builder(CFDGImpl* cfdg, int variation); ~Builder(); int StringToShape(const std::string& name, const yy::location& loc, bool colonsAllowed); void PushNameSpace(AST::str_ptr n, const yy::location& loc); void CheckName(const std::string& name, const yy::location& loc, bool colonsAllowed); void CheckVariableName(int index, const yy::location& loc, bool param); void PopNameSpace(); void IncludeFile(const std::string& fname); bool EndInclude(); void Initialize(AST::rep_ptr init); void SetShape(AST::ASTshape* s, bool isPath = false); void AddRule(AST::ASTrule* rule); void NextParameterDecl(const std::string& type, const std::string& name, const yy::location& typeLoc, const yy::location& nameLoc); void NextParameter(const std::string& name, AST::exp_ptr e, const yy::location& nameLoc, const yy::location& expLoc); AST::ASTexpression* MakeVariable(const std::string& name, const yy::location& loc); AST::ASTruleSpecifier* MakeRuleSpec(const std::string& name, AST::exp_ptr a, const yy::location& loc); void MakeModTerm(AST::ASTtermArray& dest, AST::term_ptr t); AST::rep_ptr MakeElement(const std::string& s, AST::mod_ptr mods, AST::exp_ptr params, const yy::location& loc, bool subPath); AST::ASTexpression* MakeFunction(AST::str_ptr name, AST::exp_ptr args, const yy::location& nameLoc, const yy::location& argsLoc, bool consAllowed); AST::ASTexpression* MakeArray(AST::str_ptr name, AST::exp_ptr args, const yy::location& nameLoc, const yy::location& argsLoc); AST::ASTexpression* MakeLet(const yy::location& letLoc, AST::exp_ptr exp); AST::ASTmodification* MakeModification(AST::mod_ptr modExp, const yy::location& loc, bool canonical); void inColor(); void timeWise(); }; #endif // INCLUDE_BUILDER_H contextfree-3.0.5+dfsg1.orig/src-common/cfdg.ypp0000644000175000017500000013072212076364074020160 0ustar brambram// cfdg.y // this file is part of Context Free // --------------------- // Copyright (C) 2005-2008 Mark Lentczner - markl@glyphic.com // Copyright (C) 2005-2013 John Horigan - john@glyphic.com // Copyright (C) 2005 Chris Coyne - ccoyne77@gmail.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // Mark Lentczner can be contacted at markl@glyphic.com or at // Mark Lentczner, 1209 Villa St., Mountain View, CA 94041-1123, USA // // %skeleton "lalr1.cc" /* -*- C++ -*- */ %require "2.3" %defines %define "parser_class_name" "CfdgParser" %locations %expect 3 //%debug %parse-param {class Builder& driver} %lex-param {class Builder& driver} %{ #include "builder.h" #include #include namespace AST { class ASTexpression; class ASTmodTerm; class ASTmodification; class ASTpath; class ASTreplacement; class ASTbodyContainer; class ASTshape; class ASTloop; class ASTif; class ASTswitch; class ASTpathBody; class ASTpathLoop; class ASTruleSpecifier; class ASTrule; } %} %union { int modToken; std::string* string; AST::ASTexpression* expression; AST::ASTmodTerm* term; AST::ASTmodification* mod; AST::ASTreplacement* component; AST::ASTshape* shapeObj; AST::ASTloop* loopObj; AST::ASTif* ifObj; AST::ASTswitch* switchObj; AST::ASTruleSpecifier* ruleSpec; AST::ASTrule* ruleObj; AST::ASTrepContainer* bodyObj; }; %{ #include "astreplacement.h" #include "astexpression.h" using namespace AST; %} %token STARTSHAPE %token CFDG2 %token CFDG3 %token SHAPE %token RULE %token PATH %token DEFINE %token BECOMES %token LOOP %token FINALLY %token IF %token ELSE %token SWITCH %token CASE %token CLONE %token LET %token MODTYPE %token PARAM %token BACKGROUND %token BADEOF /* passed when EOF/EOL is unexpected */ %token GOODEOF /* passed at end of include file */ %token RANGEOP %token PLUSMINUSOP %token USER_STRING %token USER_INTEGER %token USER_RATIONAL %token USER_FILENAME %token USER_QSTRING %token USER_ARRAYNAME %token INCLUDE %token IMPORT %token TILE %token PARAMETERS %token USER_PATHOP %token STROKEWIDTH %token LE %token LT %token GE %token GT %token EQ %token NEQ %token NOT %token AND %token OR %token XOR %token CF_INFINITY %right ',' %left XOR %left OR %left AND %left EQ NEQ %left LE LT GE GT %left RANGEOP PLUSMINUSOP %left '-' '+' '_' %left '*' '/' %left NOT NEG POS /* negation--unary minus, unary identity */ %right '^' /* exponentiation */ %type exp exp2 exp3 expfunc exp2func explist arglist parameter_spec letBody %type modification modification_v2 buncha_adjustments %type adjustment %type element element_simple %type pathOp_v2 pathOp_simple_v2 replacement_v2 replacement_simple_v2 /* %type buncha_definitions buncha_parameters parameter_list buncha_global_definitions */ %type statement statement_v2 initialization initialization_v2 background tile size rule path shape_singleton transHeader rule_v2 path_v2 %type loopHeader element_loop loopHeader_v2 %type ifHeader ifElseHeader %type switchHeader %type rule_header path_header rule_header_v2 path_header_v2 shape_singleton_header %type shape %type fileString fileNameSpace definition_header global_definition_header shapeName %type caseHeader %type letHeader %destructor { delete $$; } USER_STRING USER_FILENAME USER_QSTRING USER_PATHOP USER_ARRAYNAME fileString fileNameSpace definition_header global_definition_header shapeName %destructor { delete $$; } exp exp2 exp3 expfunc exp2func explist arglist parameter_spec letBody %destructor { delete $$; } adjustment %destructor { delete $$; } modification modification_v2 buncha_adjustments %destructor { driver.pop_repContainer(NULL); delete $$; } loopHeader_v2 %destructor { if (driver.mCompilePhase == 2) driver.pop_repContainer(NULL); delete $$; } element_loop loopHeader %destructor { delete $$; } statement statement_v2 initialization initialization_v2 background tile size rule path element element_simple shape_singleton %destructor { if (driver.mCompilePhase == 2) driver.pop_repContainer(NULL); delete $$; } shape_singleton_header transHeader %destructor { delete $$; } pathOp_v2 pathOp_simple_v2 replacement_v2 replacement_simple_v2 %destructor { if (driver.mCompilePhase == 2) driver.pop_repContainer(NULL); delete $$; } rule_header path_header %destructor { driver.pop_repContainer(NULL); delete $$; } rule_header_v2 path_header_v2 %destructor { if (driver.mCompilePhase == 2) driver.pop_repContainer(NULL); delete $$; } ifHeader ifElseHeader %destructor { delete $$; } switchHeader %destructor { delete $$; } shape %destructor { if (driver.mCompilePhase == 2) driver.pop_repContainer(NULL); } caseHeader %destructor { driver.pop_repContainer(NULL); delete $$; } letHeader %{ #include "scanner.h" #include "math.h" #include "builder.h" #include #undef yylex #define yylex driver.lexer->lex %} %% choose: CFDG2 cfdg2 | CFDG3 cfdg3; cfdg2: cfdg2 statement_v2 { if ($2) { driver.push_rep($2, true); } } | ; cfdg3: cfdg3 statement { if ($2) { driver.push_rep($2, true); } } | ; statement: initialization | import { $$ = 0; } | eof { $$ = 0; } | rule | path | shape { $$ = $1; } | shape_singleton | global_definition { $$ = 0; } | v2stuff { error(@1, "Illegal mixture of old and new elements"); $$ = 0; } ; statement_v2: initialization_v2 | background | inclusion { $$ = 0; } | eof { $$ = 0; } | tile | size | rule_v2 | path_v2 | v3clues { if (driver.lexer->maybeVersion == token::CFDG2) { error(@1, "Illegal mixture of old and new elements"); } else { driver.lexer->maybeVersion = token::CFDG3; } $$ = 0; YYABORT; } ; v3clues: USER_STRING BECOMES { delete $1; } | MODTYPE BECOMES {} | PARAM BECOMES {} | USER_STRING '(' { delete $1; } | USER_STRING USER_STRING '(' { delete $1; delete $2; } | IMPORT | SHAPE | PATH USER_STRING '(' { delete $2; } | STARTSHAPE USER_STRING '(' { delete $2; } | STARTSHAPE USER_STRING '[' { delete $2; } | STARTSHAPE USER_ARRAYNAME '[' { delete $2; } ; v2stuff: BACKGROUND modification_v2 { delete $2; } | TILE modification_v2 { delete $2; } | MODTYPE modification_v2 { delete $2; } | INCLUDE fileString { delete $2; } | rule_header_v2 { delete $1; } ; inclusion: INCLUDE fileString { str_ptr file($2); $2 = 0; driver.lexer->maybeVersion = token::CFDG2; driver.SetShape(NULL); driver.IncludeFile(*file); } ; import: IMPORT fileNameSpace fileString { str_ptr file($3); $3 = 0; str_ptr nm($2); $2 = 0; driver.SetShape(NULL); driver.IncludeFile(*file); if (nm.get()) driver.PushNameSpace(nm, @2); } ; eof: GOODEOF { if (driver.EndInclude()) YYACCEPT; } ; fileString: USER_FILENAME | USER_QSTRING; fileNameSpace: '@' USER_STRING { $$ = $2; } | { $$ = NULL; } ; initialization: STARTSHAPE USER_STRING parameter_spec modification { str_ptr name($2); $2 = 0; exp_ptr p($3); $3 = 0; mod_ptr mod($4); $4 = 0; driver.SetShape(NULL); if (driver.mCompilePhase == 2) { ruleSpec_ptr r(driver.MakeRuleSpec(*name, p, @2)); rep_ptr start(new ASTreplacement(*r, *name, mod, @$)); driver.Initialize(start); } $$ = 0; } | STARTSHAPE USER_ARRAYNAME modification { str_ptr name($2); $2 = 0; mod_ptr mod($3); $3 = 0; driver.SetShape(NULL); if (driver.mCompilePhase == 2) { ruleSpec_ptr r(driver.MakeRuleSpec(*name, exp_ptr(), @2)); rep_ptr start(new ASTreplacement(*r, *name, mod, @$)); driver.Initialize(start); } $$ = 0; } | STARTSHAPE USER_STRING parameter_spec { str_ptr name($2); $2 = 0; exp_ptr p($3); $3 = 0; driver.SetShape(NULL); if (driver.mCompilePhase == 2) { ruleSpec_ptr r(driver.MakeRuleSpec(*name, p, @2)); rep_ptr start(new ASTreplacement(*r, *name, mod_ptr(), @$)); driver.Initialize(start); } $$ = 0; } ; initialization_v2: STARTSHAPE USER_STRING { str_ptr name($2); $2 = 0; driver.SetShape(NULL); ruleSpec_ptr r(driver.MakeRuleSpec(*name, exp_ptr(), @2)); rep_ptr start(new ASTreplacement(*r, *name, mod_ptr(), @$)); driver.Initialize(start); $$ = 0; } ; background: BACKGROUND modification_v2 { exp_ptr mod($2); $2 = 0; static const std::string backVar("CF::Background"); driver.lexer->maybeVersion = token::CFDG2; driver.NextParameter(backVar, mod, @1, @2); $$ = 0; } ; tile: TILE modification_v2 { exp_ptr mod($2); $2 = 0; static const std::string tileVar("CF::Tile"); driver.lexer->maybeVersion = token::CFDG2; driver.NextParameter(tileVar, mod, @1, @2); $$ = 0; } ; size: MODTYPE modification_v2 { exp_ptr mod($2); $2 = 0; driver.lexer->maybeVersion = token::CFDG2; if ($1 != ASTmodTerm::size && $1 != ASTmodTerm::time) { error(@1, "Syntax error"); } else { static const std::string sizeVar("CF::Size"); static const std::string timeVar("CF::Time"); driver.NextParameter($1 == ASTmodTerm::size ? sizeVar : timeVar, mod, @1, @2); } $$ = 0; } ; global_definition: global_definition_header exp2 { str_ptr var($1); $1 = 0; exp_ptr exp($2); $2 = 0; if (var.get()) driver.NextParameter(*var, exp, @1, @2); } ; global_definition_header: SHAPE USER_STRING function_parameter_list BECOMES { static const std::string numtype("shape"); driver.push_paramDecls(*$2, @$, numtype); $$ = $2; } | USER_STRING function_parameter_list BECOMES { static const std::string numtype("number"); driver.push_paramDecls(*$1, @$, numtype); $$ = $1; } | USER_STRING USER_STRING function_parameter_list BECOMES { str_ptr type($1); $1 = 0; driver.push_paramDecls(*$2, @$, *type); $$ = $2; } | USER_STRING BECOMES { $$ = $1; } | SHAPE MODTYPE function_parameter_list BECOMES { error(@2, "Reserved keyword: adjustment"); $$ = 0; } | MODTYPE function_parameter_list BECOMES { error(@1, "Reserved keyword: adjustment"); $$ = 0; } | USER_STRING MODTYPE parameter_list BECOMES { str_ptr type($1); $1 = 0; error(@2, "Reserved keyword: adjustment"); $$ = 0; } | MODTYPE BECOMES { error(@1, "Reserved keyword: adjustment"); $$ = 0; } ; definition_header: USER_STRING BECOMES { $$ = $1; } | MODTYPE BECOMES { error(@1, "Reserved keyword: adjustment"); $$ = 0; } ; definition: definition_header exp2 { str_ptr var($1); $1 = 0; exp_ptr exp($2); $2 = 0; if (var.get() && driver.mCompilePhase == 2) driver.NextParameter(*var, exp, @1, @2); } ; shape: SHAPE USER_STRING parameter_list { str_ptr name($2); $2 = 0; bool hasParams = !driver.mParamDecls.mParameters.empty(); exp_ptr dummy(hasParams ? new ASTexpression(@2) : NULL); ASTruleSpecifier r(driver.StringToShape(*name, @2, false), *name, dummy, @$, &(driver.mParamDecls.mParameters), &(driver.mParamDecls.mParameters)); ASTshape* s = new ASTshape(r, false, @1 + @2); s->mRules.mParameters.swap(driver.mParamDecls.mParameters); driver.SetShape(s); s->mShapeSpec.typeSignature = hasParams ? &(s->mRules.mParameters) : NULL; $$ = s; } ; shape_singleton_header: shape '{' { driver.push_rep($1, true); if (driver.mCompilePhase == 2) { driver.mInPathContainer = false; rule_ptr rule(new ASTrule(-1, @1)); driver.AddRule(rule.get()); driver.push_repContainer(rule->mRuleBody); $$ = rule.release(); } else { $$ = 0; } } shape_singleton: shape_singleton_header buncha_elements '}' { $$ = $1; if (driver.mCompilePhase == 2) driver.pop_repContainer($1); driver.mInPathContainer = false; } ; rule_header_v2: RULE USER_STRING { str_ptr name($2); $2 = 0; driver.SetShape(NULL); rule_ptr rule(new ASTrule(driver.StringToShape(*name, @2, false), @$)); driver.AddRule(rule.get()); driver.push_repContainer(rule->mRuleBody); $$ = rule.release(); } | RULE USER_STRING USER_RATIONAL { str_ptr name($2); $2 = 0; str_ptr weight($3); $3 = 0; driver.SetShape(NULL); rule_ptr rule(new ASTrule(driver.StringToShape(*name, @2, false), CFatof(weight->c_str()), weight->find_first_of('%') != std::string::npos, @$)); driver.AddRule(rule.get()); driver.push_repContainer(rule->mRuleBody); $$ = rule.release(); } ; rule_v2: rule_header_v2 '{' buncha_replacements_v2 '}' { driver.lexer->maybeVersion = token::CFDG2; $$ = $1; driver.pop_repContainer($1); } ; rule_header: RULE { driver.mInPathContainer = false; if (driver.mCompilePhase == 2) { rule_ptr rule(new ASTrule(-1, @1)); driver.AddRule(rule.get()); driver.push_repContainer(rule->mRuleBody); $$ = rule.release(); } else { $$ = 0; } } | RULE USER_RATIONAL { driver.mInPathContainer = false; str_ptr weight($2); $2 = 0; if (driver.mCompilePhase == 2) { rule_ptr rule(new ASTrule(-1, CFatof(weight->c_str()), weight->find_first_of('%') != std::string::npos, @$)); driver.AddRule(rule.get()); driver.push_repContainer(rule->mRuleBody); $$ = rule.release(); } else { $$ = 0; } } ; path_header: PATH USER_STRING parameter_list { str_ptr name($2); $2 = 0; bool hasParams = !driver.mParamDecls.mParameters.empty(); exp_ptr dummy(hasParams ? new ASTexpression(@2) : NULL); ASTruleSpecifier r(driver.StringToShape(*name, @2, false), *name, dummy, @$, &(driver.mParamDecls.mParameters), &(driver.mParamDecls.mParameters)); ASTshape* s = new ASTshape(r, false, @1 + @2); s->mRules.mParameters.swap(driver.mParamDecls.mParameters); driver.SetShape(s, true); s->mShapeSpec.typeSignature = hasParams ? &(s->mRules.mParameters) : NULL; driver.mInPathContainer = true; if (driver.mCompilePhase == 2) { rule_ptr newPath(new ASTrule(-1, @$)); newPath->isPath = true; driver.AddRule(newPath.get()); driver.push_repContainer(newPath->mRuleBody); $$ = newPath.release(); } else { $$ = 0; } } ; rule: rule_header '{' buncha_elements '}' { $$ = $1; if (driver.mCompilePhase == 2) driver.pop_repContainer($1); driver.mInPathContainer = false; } ; path: path_header '{' buncha_elements '}' { $$ = $1; if (driver.mCompilePhase == 2) driver.pop_repContainer($1); driver.mInPathContainer = false; driver.SetShape(NULL); } ; path_header_v2: PATH USER_STRING { str_ptr name($2); $2 = 0; driver.SetShape(NULL); rule_ptr newPath(new ASTrule(driver.StringToShape(*name, @2, false), @$)); newPath->isPath = true; driver.AddRule(newPath.get()); driver.push_repContainer(newPath->mRuleBody); driver.mInPathContainer = true; $$ = newPath.release(); } ; path_v2: path_header_v2 '{' buncha_pathOps_v2 '}' { $$ = $1; driver.pop_repContainer($1); } ; parameter: USER_STRING USER_STRING { str_ptr type($1); $1 = 0; str_ptr var($2); $2 = 0; driver.NextParameterDecl(*type, *var, @1, @2); } | SHAPE USER_STRING { static std::string shapeStr("shape"); str_ptr var($2); $2 = 0; driver.NextParameterDecl(shapeStr, *var, @1, @2); } | USER_STRING MODTYPE { delete $1; error(@2, "Reserved keyword: adjustment"); } | SHAPE MODTYPE { error(@2, "Reserved keyword: adjustment"); } | USER_STRING { static const std::string numtype("number"); str_ptr var($1); $1 = 0; driver.NextParameterDecl(numtype, *var, @1, @1); } | MODTYPE { error(@1, "Reserved keyword: adjustment"); } ; buncha_parameters: buncha_parameters ',' parameter | parameter ; parameter_list: '(' buncha_parameters ')' | ; function_parameter_list: '(' buncha_parameters ')' | '(' ')' ; parameter_spec: '(' arglist ')' { $$ = $2;} | '(' BECOMES ')' { $$ = new ASTexpression(@$); } | '(' ')' { $$ = 0; } | { $$ = 0; } ; buncha_elements: buncha_elements element { if (driver.mCompilePhase == 1) assert ($2 == 0); driver.push_rep($2); } | ; buncha_pathOps_v2: buncha_pathOps_v2 pathOp_v2 { driver.push_rep($2); } | ; pathOp_simple_v2: USER_PATHOP '{' buncha_adjustments '}' { str_ptr pop($1); $1 = 0; mod_ptr mod($3); $3 = 0; driver.lexer->maybeVersion = token::CFDG2; $$ = new ASTpathOp(*pop, mod, @$); } | shapeName modification_v2 { str_ptr cmd($1); $1 = 0; mod_ptr mod($2); $2 = 0; driver.lexer->maybeVersion = token::CFDG2; rep_ptr item(new ASTpathCommand(*cmd, mod, @$)); $$ = item.release(); } ; element_simple: USER_PATHOP '(' exp2 ')' { str_ptr pop($1); $1 = 0; exp_ptr mod($3); $3 = 0; if (driver.mCompilePhase == 2) $$ = new ASTpathOp(*pop, mod, @$); else $$ = 0; } | USER_PATHOP '(' ')' { str_ptr pop($1); $1 = 0; exp_ptr mod; if (driver.mCompilePhase == 2) $$ = new ASTpathOp(*pop, mod, @$); else $$ = 0; } | shapeName parameter_spec modification { str_ptr cmd($1); $1 = 0; exp_ptr p($2); $2 = 0; mod_ptr mod($3); $3 = 0; if (driver.mCompilePhase == 2) { rep_ptr item = driver.MakeElement(*cmd, mod, p, @$, false); $$ = item.release(); } else { $$ = 0; } } | IF '(' exp2 ')' modification { exp_ptr args($3); $3 = 0; mod_ptr mod($5); $5 = 0; if (driver.mCompilePhase == 2) { str_ptr func(new std::string("if")); args.reset(driver.MakeFunction(func, args, @1, @3, false)); static const std::string ifstr("if"); rep_ptr item = driver.MakeElement(ifstr, mod, args, @$, false); $$ = item.release(); } else { $$ = 0; } } | letHeader letBody modification { std::auto_ptr vars($1); exp_ptr exp($2); $2 = 0; mod_ptr mod($3); $3 = 0; exp.reset(driver.MakeLet(@1, exp)); // must do unconditionally if (driver.mCompilePhase == 2) { static const std::string letstr("let"); rep_ptr item = driver.MakeElement(letstr, mod, exp, @$, false); $$ = item.release(); } else { $$ = 0; } } | PATH shapeName parameter_spec modification { str_ptr cmd($2); $2 = 0; exp_ptr p($3); $3 = 0; mod_ptr mod($4); $4 = 0; if (driver.mCompilePhase == 2) { rep_ptr item = driver.MakeElement(*cmd, mod, p, @$, true); $$ = item.release(); } else { $$ = 0; } } ; one_or_more_elements: '{' buncha_elements '}' { } | element { if (driver.mCompilePhase == 1) assert($1 == 0); driver.push_rep($1); } ; one_or_more_pathOp_v2: '{' buncha_pathOps_v2 '}' { } | pathOp_simple_v2 { driver.push_rep($1); } ; caseBody: caseBody caseBody_element { if (driver.mCompilePhase == 2) driver.pop_repContainer(driver.switchStack.top()); } | ; caseBody_element: caseHeader one_or_more_elements ; element: element_simple { $$ = $1; } | definition { $$ = 0; } | element_loop { $$ = $1; if (driver.mCompilePhase == 2) { driver.pop_repContainer($1); if ($1->mRepType == 0) { delete $1; $$ = 0; } } } | element_loop FINALLY { if (driver.mCompilePhase == 2) { driver.pop_repContainer($1); driver.push_repContainer($1->mFinallyBody); } } one_or_more_elements { if (driver.mCompilePhase == 2) { driver.pop_repContainer($1); $$ = $1; if ($1->mRepType == 0) { delete $1; $$ = 0; } } else { $$ = 0; } } | ifHeader one_or_more_elements { $$ = $1; if (driver.mCompilePhase == 2) { driver.pop_repContainer($1); if ($1->mRepType == 0) { delete $1; $$ = 0; } } } | ifElseHeader one_or_more_elements { $$ = $1; if (driver.mCompilePhase == 2) { driver.pop_repContainer($1); if ($1->mRepType == 0) { delete $1; $$ = 0; } } } | transHeader one_or_more_elements { $$ = $1; if (driver.mCompilePhase == 2) { driver.pop_repContainer($1); if ($1->mRepType == 0) { delete $1; $$ = 0; } } } | switchHeader '{' caseBody '}' { $$ = $1; if (driver.mCompilePhase == 2) { $1->unify(); driver.switchStack.pop(); } } | element_v2clue { error(@1, "Illegal mixture of old and new elements"); $$ = 0; } ; element_v2clue: USER_RATIONAL '*' { delete $1; } | USER_STRING '{' { delete $1; } | USER_PATHOP '{' { delete $1; } ; pathOp_v2: pathOp_simple_v2 { $$ = $1; } | loopHeader_v2 one_or_more_pathOp_v2 { $$ = $1; driver.pop_repContainer($1); if ($1->mRepType == 0) { delete $1; $$ = 0; } } | pathOp_v3clues { if (driver.lexer->maybeVersion == token::CFDG2) { error(@1, "Illegal mixture of old and new elements"); } else { driver.lexer->maybeVersion = token::CFDG3; } $$ = 0; YYABORT; } ; pathOp_v3clues: USER_PATHOP '(' { delete $1; } | USER_STRING '(' { delete $1; } | PATH | LOOP | USER_STRING BECOMES { delete $1; } | MODTYPE BECOMES | IF | MODTYPE | SWITCH ; element_loop: loopHeader modification one_or_more_elements { // parse loop mod and loop body with loop index in scope mod_ptr loopmod($2); $2 = 0; if (driver.mCompilePhase == 2) $1->mChildChange.grab(loopmod.get()); $$ = $1; // loopmod gets deleted } ; buncha_replacements_v2: buncha_replacements_v2 replacement_v2 { driver.push_rep($2); } | ; one_or_more_replacements_v2: '{' buncha_replacements_v2 '}' { } | replacement_simple_v2 { driver.push_rep($1); } ; replacement_simple_v2: shapeName modification_v2 { str_ptr name($1); $1 = 0; mod_ptr mod($2); $2 = 0; ruleSpec_ptr r(driver.MakeRuleSpec(*name, exp_ptr(), @1)); $$ = new ASTreplacement(*r, r->entropyVal, mod, @$); } ; replacement_v2: replacement_simple_v2 { $$ = $1; } | loopHeader_v2 one_or_more_replacements_v2 { $$ = $1; driver.pop_repContainer($1); if ($1->mRepType == 0) { delete $1; $$ = 0; } } ; loopHeader_v2: USER_RATIONAL '*' { ++driver.mLocalStackDepth; } modification_v2 { str_ptr cstr($1); $1 = 0; exp_ptr count(new ASTreal(*cstr, @1)); mod_ptr mod($4); $4 = 0; static const std::string dummyvar("~~inaccessiblevar~~"); --driver.mLocalStackDepth; driver.lexer->maybeVersion = token::CFDG2; loop_ptr loop(new ASTloop(driver.StringToShape(dummyvar, @2, false), dummyvar, @2, count, @$, mod)); driver.push_repContainer(loop->mLoopBody); $$ = loop.release(); } ; loopHeader: LOOP USER_STRING BECOMES exp2 { str_ptr var($2); $2 = 0; exp_ptr index($4); $4 = 0; if (driver.mCompilePhase == 2) { int nameIndex = driver.StringToShape(*var, @2, false); loop_ptr loop(new ASTloop(nameIndex, *var, @2, index, @4, mod_ptr())); driver.push_repContainer(loop->mLoopBody); $$ = loop.release(); } else { $$ = 0; } } | LOOP MODTYPE BECOMES exp2 { exp_ptr index($4); $4 = 0; if (driver.mCompilePhase == 2) { static const std::string dummyvar("~~inaccessiblevar~~"); loop_ptr loop(new ASTloop(driver.StringToShape(dummyvar, @1, false), dummyvar, @2, index, @4, mod_ptr())); driver.push_repContainer(loop->mLoopBody); $$ = loop.release(); } else { $$ = 0; } error(@2, "Reserved keyword: adjustment"); } | LOOP exp2 { exp_ptr count($2); $2 = 0; if (driver.mCompilePhase == 2) { static const std::string dummyvar("~~inaccessiblevar~~"); loop_ptr loop(new ASTloop(driver.StringToShape(dummyvar, @1, false), dummyvar, @1, count, @2, mod_ptr())); driver.push_repContainer(loop->mLoopBody); $$ = loop.release(); } else { $$ = 0; } } ; ifHeader: IF '(' exp2 ')' { exp_ptr cond($3); $3 = 0; if (driver.mCompilePhase == 2) { if_ptr ifHeader(new ASTif(cond, @3)); driver.push_repContainer(ifHeader->mThenBody); $$ = ifHeader.release(); } else { $$ = 0; } } ; ifElseHeader: ifHeader one_or_more_elements ELSE { if (driver.mCompilePhase == 2) { driver.pop_repContainer($1); driver.push_repContainer($1->mElseBody); } $$ = $1; } ; transHeader: MODTYPE exp2 { exp_ptr mods($2); $2 = 0; if ($1 != ASTmodTerm::transform) error(@1, "Syntax error"); if (driver.mCompilePhase == 2) { ASTtransform* trans = new ASTtransform(@$, mods); driver.push_repContainer(trans->mBody); $$ = trans; } else { $$ = 0; } } | CLONE exp2 { exp_ptr mods($2); $2 = 0; if (!ASTparameter::Impure) error(@1, "shape cloning only permitted in impure mode"); if (driver.mCompilePhase == 2) { ASTtransform* trans = new ASTtransform(@$, mods); trans->mClone = true; driver.push_repContainer(trans->mBody); $$ = trans; } else { $$ = 0; } } ; switchHeader: SWITCH '(' exp2 ')' { exp_ptr caseVal($3); $3 = 0; if (driver.mCompilePhase == 2) { switch_ptr switchHeader(new ASTswitch(caseVal, @3)); driver.switchStack.push(switchHeader.get()); $$ = switchHeader.release(); } else { $$ = 0; } } ; caseHeader: CASE exp2 ':' { exp_ptr valExp($2); $2 = 0; if (driver.mCompilePhase == 2) { double val = 0.0; try { if (valExp->evaluate(&val, 1) != 1) { driver.error(@2, "Case expression is not a single, numeric expression"); } else { int intval = (int)floor(val); ASTswitch::switchMap& caseMap = driver.switchStack.top()->mCaseStatements; if (caseMap.count(intval)) { driver.error(@2, "Case value already in use"); driver.push_repContainer(*(caseMap[intval])); } else { ASTrepContainer* caseBody = new ASTrepContainer(); caseMap[intval] = caseBody; driver.push_repContainer(*caseBody); } } } catch (DeferUntilRuntime) { driver.error(@2, "Case expression is not constant"); } } $$ = 0; } | ELSE ':' { if (driver.mCompilePhase == 2) { if (!driver.switchStack.top()->mElseBody.mBody.empty()) { driver.error(@$, "There can only be one 'else:' clause"); } else { driver.push_repContainer(driver.switchStack.top()->mElseBody); } } $$ = 0; } ; modification_v2: '{' buncha_adjustments '}' { mod_ptr mod($2); $2 = 0; $$ = driver.MakeModification(mod, @$, true); } | '[' buncha_adjustments ']' { mod_ptr mod($2); $2 = 0; $$ = driver.MakeModification(mod, @$, false); } ; modification: '[' buncha_adjustments ']' { mod_ptr mod($2); $2 = 0; $$ = driver.MakeModification(mod, @$, true); } | '[' '[' buncha_adjustments ']' ']' { mod_ptr mod($3); $3 = 0; $$ = driver.MakeModification(mod, @$, false); } ; buncha_adjustments: buncha_adjustments adjustment { term_ptr mod($2); $2 = 0; driver.MakeModTerm($1->modExp, mod); $$ = $1; } | { static const yy::location def; ASTmodification* m = new ASTmodification(def); m->flags = 0; $$ = m; } ; adjustment: MODTYPE explist { exp_ptr mod($2); $2 = 0; $$ = new ASTmodTerm((ASTmodTerm::modTypeEnum)($1), mod.release(), @$); } | MODTYPE exp '|' { exp_ptr mod($2); $2 = 0; if ($1 < ASTmodTerm::hue || $1 > ASTmodTerm::alpha) { error(@$, "The target operator can only be applied to color adjustments"); $$ = 0; } else { $$ = new ASTmodTerm((ASTmodTerm::modTypeEnum)($1 + 4), mod.release(), @$); } } | PARAM USER_STRING { str_ptr p($2); $2 = 0; $$ = new ASTmodTerm(ASTmodTerm::param, *p, @$); } | PARAM USER_QSTRING { str_ptr p($2); $2 = 0; $$ = new ASTmodTerm(ASTmodTerm::param, *p, @$); } ; letHeader: LET { ASTrepContainer* tempHolder = new ASTrepContainer(); driver.push_repContainer(*tempHolder); $$ = tempHolder; } ; letBody: '(' letVariables ';' exp2 ')' { $$ = $4; } ; letVariables: letVariables ';' letVariable | letVariable ; letVariable: USER_STRING BECOMES exp2 { str_ptr var($1); $1 = 0; exp_ptr exp($3); $3 = 0; driver.NextParameter(*var, exp, @1, @3); } | MODTYPE BECOMES exp2 { exp_ptr exp($3); $3 = 0; error(@1, "Reserved keyword: adjustment"); } ; explist: explist exp { $$ = ASTexpression::Append($1, $2); } | exp { $$ = $1; } ; arglist: arglist ',' exp3 { $$ = $1->append(new ASTparen($3)); } | exp3 { $$ = new ASTcons(new ASTparen($1), 0); } ; exp: USER_RATIONAL { $$ = new ASTreal(*$1, @$); delete $1; } | CF_INFINITY { $$ = new ASTreal(Renderer::Infinity, @$); } | '(' exp2 ')' { $$ = new ASTparen($2); } | expfunc { $$ = $1; } | '-' exp { $$ = new ASToperator('N', $2, NULL);; } | '+' exp { $$ = new ASToperator('P', $2, NULL);; } | exp RANGEOP exp { exp_ptr pair($1->append($3)); $1 = 0; $3 = 0; $$ = new ASTfunction("rand", pair, driver.mSeed, @1, @$); } | exp PLUSMINUSOP exp { exp_ptr pair($1->append($3)); $1 = 0; $3 = 0; $$ = new ASTfunction("rand+/-", pair, driver.mSeed, @1, @$); } ; exp2: USER_RATIONAL { $$ = new ASTreal(*$1, @$); delete $1; } | CF_INFINITY { $$ = new ASTreal(Renderer::Infinity, @$); } | exp2func { $$ = $1; } | exp2 RANGEOP exp2 { exp_ptr pair($1->append($3)); $1 = 0; $3 = 0; $$ = new ASTfunction("rand", pair, driver.mSeed, @1, @$); } | exp2 PLUSMINUSOP exp2 { exp_ptr pair($1->append($3)); $1 = 0; $3 = 0; $$ = new ASTfunction("rand+/-", pair, driver.mSeed, @1, @$); } | exp2 ',' exp2 { $$ = $1->append($3); } | exp2 '+' exp2 { $$ = new ASToperator('+', $1, $3); } | exp2 '-' exp2 { $$ = new ASToperator('-', $1, $3); } | exp2 '_' exp2 { $$ = new ASToperator('_', $1, $3); } | exp2 '*' exp2 { $$ = new ASToperator('*', $1, $3); } | exp2 '/' exp2 { $$ = new ASToperator('/', $1, $3); } | '-' exp2 %prec NEG { $$ = new ASToperator('N', $2, NULL); } | '+' exp2 %prec POS { $$ = new ASToperator('P', $2, NULL); } | NOT exp2 { $$ = new ASToperator('!', $2, NULL); } | exp2 '^' exp2 { $$ = new ASToperator('^', $1, $3); } | exp2 LT exp2 { $$ = new ASToperator('<', $1, $3); } | exp2 LE exp2 { $$ = new ASToperator('L', $1, $3); } | exp2 GT exp2 { $$ = new ASToperator('>', $1, $3); } | exp2 GE exp2 { $$ = new ASToperator('G', $1, $3); } | exp2 EQ exp2 { $$ = new ASToperator('=', $1, $3); } | exp2 NEQ exp2 { $$ = new ASToperator('n', $1, $3); } | exp2 AND exp2 { $$ = new ASToperator('&', $1, $3); } | exp2 OR exp2 { $$ = new ASToperator('|', $1, $3); } | exp2 XOR exp2 { $$ = new ASToperator('X', $1, $3); } | '(' exp2 ')' { $$ = new ASTparen($2); } | modification { $$ = $1; } ; exp3: USER_RATIONAL { $$ = new ASTreal(*$1, @$); delete $1; } | CF_INFINITY { $$ = new ASTreal(Renderer::Infinity, @$); } | exp2func { $$ = $1; } | exp3 RANGEOP exp3 { exp_ptr pair($1->append($3)); $1 = 0; $3 = 0; $$ = new ASTfunction("rand", pair, driver.mSeed, @1, @$); } | exp3 PLUSMINUSOP exp3 { exp_ptr pair($1->append($3)); $1 = 0; $3 = 0; $$ = new ASTfunction("rand+/-", pair, driver.mSeed, @1, @$); } | exp3 '+' exp3 { $$ = new ASToperator('+', $1, $3); } | exp3 '-' exp3 { $$ = new ASToperator('-', $1, $3); } | exp3 '_' exp3 { $$ = new ASToperator('_', $1, $3); } | exp3 '*' exp3 { $$ = new ASToperator('*', $1, $3); } | exp3 '/' exp3 { $$ = new ASToperator('/', $1, $3); } | '-' exp3 %prec NEG { $$ = new ASToperator('N', $2, NULL); } | '+' exp3 %prec POS { $$ = new ASToperator('P', $2, NULL); } | NOT exp3 { $$ = new ASToperator('!', $2, NULL); } | exp3 '^' exp3 { $$ = new ASToperator('^', $1, $3); } | exp3 LT exp3 { $$ = new ASToperator('<', $1, $3); } | exp3 LE exp3 { $$ = new ASToperator('L', $1, $3); } | exp3 GT exp3 { $$ = new ASToperator('>', $1, $3); } | exp3 GE exp3 { $$ = new ASToperator('G', $1, $3); } | exp3 EQ exp3 { $$ = new ASToperator('=', $1, $3); } | exp3 NEQ exp3 { $$ = new ASToperator('n', $1, $3); } | exp3 AND exp3 { $$ = new ASToperator('&', $1, $3); } | exp3 OR exp3 { $$ = new ASToperator('|', $1, $3); } | exp3 XOR exp3 { $$ = new ASToperator('X', $1, $3); } | '(' exp2 ')' { $$ = new ASTparen($2); } | modification { $$ = $1; } ; expfunc: USER_STRING '(' ')' { str_ptr func($1); $1 = 0; $$ = driver.MakeFunction(func, exp_ptr(), @1, @2 + @3, false); } | USER_STRING '(' arglist ')' { str_ptr func($1); $1 = 0; exp_ptr args($3); $3 = 0; $$ = driver.MakeFunction(func, args, @1, @3, true); } | USER_ARRAYNAME '[' exp2 ']' { str_ptr func($1); $1 = 0; exp_ptr args($3); $3 = 0; $$ = driver.MakeArray(func, args, @1, @3); } | IF '(' exp2 ')' { str_ptr func(new std::string("if")); exp_ptr args($3); $3 = 0; $$ = driver.MakeFunction(func, args, @1, @3, false); } | letHeader letBody { exp_ptr exp($2); $2 = 0; std::auto_ptr vars($1); $$ = driver.MakeLet(@1, exp); } | USER_STRING { str_ptr var($1); $1 = 0; $$ = driver.MakeVariable(*var, @1); } ; exp2func: USER_STRING '(' ')' { str_ptr func($1); $1 = 0; $$ = driver.MakeFunction(func, exp_ptr(), @1, @2 + @3, false); } | USER_STRING '(' arglist ')' { str_ptr func($1); $1 = 0; exp_ptr args($3); $3 = 0; $$ = driver.MakeFunction(func, args, @1, @3, false); } | USER_ARRAYNAME '[' exp2 ']' { str_ptr func($1); $1 = 0; exp_ptr args($3); $3 = 0; $$ = driver.MakeArray(func, args, @1, @3); } | IF '(' exp2 ')' { str_ptr func(new std::string("if")); exp_ptr args($3); $3 = 0; $$ = driver.MakeFunction(func, args, @1, @3, false); } | USER_STRING '(' BECOMES ')' { str_ptr func($1); $1 = 0; exp_ptr args(new ASTexpression(@1 + @4)); $$ = driver.MakeFunction(func, args, @1, @3, false); } | letHeader letBody { exp_ptr exp($2); $2 = 0; std::auto_ptr vars($1); $$ = driver.MakeLet(@1, exp); } | USER_STRING { str_ptr var($1); $1 = 0; $$ = driver.MakeVariable(*var, @1); } ; shapeName: USER_STRING { $$ = $1; } | USER_ARRAYNAME { $$ = $1; } ; %% void yy::CfdgParser::error(const CfdgParser::location_type& l, const std::string& m) { driver.mWant2ndPass = false; driver.error(l, m); } contextfree-3.0.5+dfsg1.orig/src-common/CmdInfo.cpp0000644000175000017500000000562712076364074020553 0ustar brambram// CmdInfo.cpp // this file is part of Context Free // --------------------- // Copyright (C) 2011-2012 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #include "CmdInfo.h" #include "astreplacement.h" #include "primShape.h" #ifdef _MSC_VER #include #pragma intrinsic(_InterlockedCompareExchange64) #endif namespace AST { const CommandInfo CommandInfo::Default(0, 0); CommandInfo::CommandInfo(unsigned i, ASTcompiledPath* path, double w, const ASTpathCommand* c) : mIndex(0), mPathUID(std::numeric_limits::max()) { init(i, path, w, c); } CommandInfo::CommandInfo(unsigned i, agg::path_storage* path) : mFlags(CF_MITER_JOIN + CF_BUTT_CAP + CF_FILL), mMiterLimit(4.0), mStrokeWidth(0.1), mIndex(i), mPath(path), mPathUID(0) { } void CommandInfo::tryInit(unsigned i, ASTcompiledPath* path, double w, const ASTpathCommand* c) { // Try to change the path UID from the default value to a value that is // guaranteed to not be in use. If successful then perform initialization #ifdef _MSC_VER if (_InterlockedCompareExchange64((__int64*)(&mPathUID), (__int64)(std::numeric_limits::max()), (__int64)0) == (__int64)(std::numeric_limits::max())) #else if (__sync_bool_compare_and_swap(&mPathUID, std::numeric_limits::max(), (UIDtype)0)) #endif init(i, path, w, c); } void CommandInfo::init(unsigned i, ASTcompiledPath* path, double w, const ASTpathCommand* c) { if (mPathUID != path->mPathUID || mIndex != i) { if (c) { mFlags = c->mChildChange.flags; mMiterLimit = c->mMiterLimit; } else { mFlags = CF_MITER_JOIN + CF_BUTT_CAP + CF_FILL; mMiterLimit = 4.0; } mIndex = i; mPath = &(path->mPath); mPathUID = path->mPathUID; // this step must be last mStrokeWidth = w; } } } contextfree-3.0.5+dfsg1.orig/src-common/tempfile.cpp0000644000175000017500000000420712076364074021032 0ustar brambram// tempfile.cpp // this file is part of Context Free // --------------------- // Copyright (C) 2006-2008 Mark Lentczner - markl@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // Mark Lentczner can be contacted at markl@glyphic.com or at // Mark Lentczner, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #include "tempfile.h" #include #ifndef _WIN32 #include #endif #include using namespace std; ref_ptr TempFile::build(AbstractSystem* system, const char* prefix, const char* type, int num) { return Countable::build(new TempFile(system, prefix, type, num)); } std::ostream* TempFile::forWrite() { if (mWritten) { cerr << "TempFile::forWrite already wrote to " << mPath << endl; } mWritten = true; mSystem->message("Writing %s temp file %d", mType.c_str(), mNum); return mSystem->tempFileForWrite(mPath); } std::istream* TempFile::forRead() { if (!mWritten) { cerr << "TempFile::forRead temp file never written, " << mPath << endl; } mSystem->message("Reading %s temp file %d", mType.c_str(), mNum); return mSystem->tempFileForRead(mPath); } TempFile::TempFile(AbstractSystem* system, const char* prefix, const char* type, int num) : mSystem(system), mPath(prefix), mType(type), mNum(num), mWritten(false) { } TempFile::~TempFile() { if (mWritten) { mSystem->message("Deleting %s temp file %d", mType.c_str(), mNum); unlink(mPath.c_str()); } } contextfree-3.0.5+dfsg1.orig/src-common/cfdgimpl.cpp0000644000175000017500000005274512076364074021024 0ustar brambram// cfdgimpl.cpp // this file is part of Context Free // --------------------- // Copyright (C) 2006-2008 Mark Lentczner - markl@glyphic.com // Copyright (C) 2006-2013 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // Mark Lentczner can be contacted at markl@glyphic.com or at // Mark Lentczner, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #define _USE_MATH_DEFINES 1 #include "cfdgimpl.h" #include "builder.h" #include "renderimpl.h" #include "primShape.h" #include #include #include "astreplacement.h" #include #include #include "agg_trans_affine_time.h" #ifdef _WIN32 #pragma warning( disable : 4800 4189 ) #endif #ifdef _WIN32 #include #define isfinite _finite #endif #include using namespace std; using namespace AST; CFDGImpl::CFDGImpl(AbstractSystem* m) : mInitShape(0), mInitShapeDepth(std::numeric_limits::max()), m_backgroundColor(1, 1, 1, 1), mStackSize(0), m_system(m), m_secondPass(false), m_Parameters(0), mTileOffset(0, 0), needle(0, CfdgError::Default) { // These have to be encoded first so that their type number will fit // within an unsigned char string circle_name = "CIRCLE"; string square_name = "SQUARE"; string triangle_name = "TRIANGLE"; string fill_name = "FILL"; // ensure these four get the first four shape numbers int circle_num = encodeShapeName(circle_name); int square_num = encodeShapeName(square_name); int triangle_num = encodeShapeName(triangle_name); int fill_num = encodeShapeName(fill_name); // Make sure that the shape numbers correspond to the order of primShape::shapeMap[] assert(circle_num == primShape::circleType); assert(square_num == primShape::squareType); assert(triangle_num == primShape::triangleType); assert(fill_num == primShape::fillType); mCFDGcontents.isGlobal = true; } CFDGImpl::CFDGImpl(CFDGImpl* c) : mInitShape(0), mInitShapeDepth(std::numeric_limits::max()), m_backgroundColor(1, 1, 1, 1), mStackSize(0), m_system(c->m_system), m_secondPass(true), m_Parameters(0), mTileOffset(0, 0), needle(0, CfdgError::Default) { m_shapeTypes.swap(c->m_shapeTypes); mFunctions.swap(c->mFunctions); fileNames.swap(c->fileNames); for (std::vector::iterator it = m_shapeTypes.begin(), eit = m_shapeTypes.end(); it != eit; ++it) it->shapeType = newShape; mCFDGcontents.isGlobal = true; } void CFDGImpl::deleteConfigParam(pair& p) { delete p.second->second; delete p.second; } void CFDGImpl::deleteFunction(pair& p) { delete p.second; } void CFDGImpl::deleteShapeParams(ShapeType& s) { delete s.parameters; } CFDGImpl::~CFDGImpl() { for_each(m_ConfigParameters.begin(), m_ConfigParameters.end(), deleteConfigParam); for_each(mFunctions.begin(), mFunctions.end(), deleteFunction); for_each(m_shapeTypes.begin(), m_shapeTypes.end(), deleteShapeParams); } void CFDGImpl::setInitialShape(rep_ptr init, unsigned depth) { if (depth < mInitShapeDepth) { mInitShape = init; m_initialShape.mShapeType = mInitShape->mShapeSpec.shapeType; mInitShapeDepth = depth; } } const Shape& CFDGImpl::getInitialShape(Renderer* r) { if (mInitShape->mShapeSpec.argSize == 0 && getShapeParamSize(mInitShape->mShapeSpec.shapeType)) { throw CfdgError(mInitShape->mLocation, "This shape takes parameters"); } Shape init; init.mWorldState.m_Color = HSBColor(0.0, 0.0, 0.0, 1.0); init.mWorldState.m_ColorTarget = HSBColor(0.0, 0.0, 0.0, 1.0); init.mWorldState.m_time.tend = 1.0; mInitShape->replace(init, r); init.mWorldState.m_transform.tx += mTileOffset.x; init.mWorldState.m_transform.ty += mTileOffset.y; m_initialShape = init; return m_initialShape; } const agg::rgba& CFDGImpl::getBackgroundColor(Renderer* r) { Modification white; white.m_Color = HSBColor(0.0, 0.0, 1.0, 1.0); if (r && hasParameter("CF::Background", white, r)) { white.m_Color.getRGBA(m_backgroundColor); if (!usesAlpha) m_backgroundColor.a = 1.0; } return m_backgroundColor; } const ASTrule* CFDGImpl::findRule(int shapetype, double r) { needle.mNameIndex = shapetype; needle.mWeight = r; vector::iterator first = lower_bound(mRules.begin(), mRules.end(), &needle, ASTrule::compareLT); if (first == mRules.end() || (*first)->mNameIndex != shapetype) throw CfdgError("Cannot find a rule for a shape (very helpful I know)."); return *first; } // Search for a rule in the mRules list even before it is sorted const ASTrule* CFDGImpl::findRule(int shapetype) { for (vector::iterator i = mRules.begin(); i != mRules.end(); ++i) if ((*i)->mNameIndex == shapetype) return *i; return NULL; } // Adds a new rule/path to the rule container. Updates information about the rule // in the m_shapeTypes[] vector. If the rule is known to have parameters then // they are copied into the new rule. bool CFDGImpl::addRule(ASTrule* r) { mRules.push_back(r); ShapeType& shapeItem = m_shapeTypes[r->mNameIndex]; if (shapeItem.shapeType == newShape) shapeItem.shapeType = (r->isPath) ? pathType : ruleType; if (shapeItem.parameters && !shapeItem.parameters->empty()) r->mRuleBody.mParameters = *(shapeItem.parameters); shapeItem.hasRules = true; return shapeItem.isShape; } void CFDGImpl::addParameter(Parameter p) { m_Parameters |= p; usesColor = m_Parameters & Color; usesTime = m_Parameters & Time; usesFrameTime = m_Parameters & FrameTime; } RGBA8 CFDGImpl::getColor(const HSBColor& hsb) { agg::rgba c; hsb.getRGBA(c); if (uses16bitColor) { return RGBA8(c); } else { agg::rgba8 c8 = agg::rgba8(c); return RGBA8(c8); } } bool CFDGImpl::isTiled(agg::trans_affine* tr, double* x, double* y) const { yy::location loc; if (!hasParameter("CF::Tile", ASTexpression::ModType, loc)) return false; if (mTileMod.m_transform.sx == 0.0 || mTileMod.m_transform.sy == 0.0) return false; if (tr) { *tr = mTileMod.m_transform; tr->tx = tr->ty = 0.0; } if (x && y) { double o_x = 0.0; double o_y = 0.0; double u_x = 1.0; double u_y = 0.0; double v_x = 0.0; double v_y = 1.0; mTileMod.m_transform.transform(&o_x, &o_y); mTileMod.m_transform.transform(&u_x, &u_y); mTileMod.m_transform.transform(&v_x, &v_y); if (fabs(u_y - o_y) >= 0.0001 && fabs(v_x - o_x) >= 0.0001) CfdgError::Error(loc, "Tile must be aligned with the X or Y axis."); if ((u_x - o_x) < 0.0 || (v_y - o_y) < 0.0) CfdgError::Error(loc, "Tile must be in the positive X/Y quadrant."); *x = u_x - o_x; *y = v_y - o_y; } return true; } CFDG::frieze_t CFDGImpl::isFrieze(agg::trans_affine* tr, double* x, double* y) const { yy::location loc; if (!hasParameter("CF::Tile", ASTexpression::ModType, loc)) return no_frieze; if (mTileMod.m_transform.sx != 0.0 && mTileMod.m_transform.sy != 0.0) return no_frieze; if (mTileMod.m_transform.sx == 0.0 && mTileMod.m_transform.sy == 0.0) return no_frieze; if (tr) { *tr = mTileMod.m_transform; tr->tx = tr->ty = 0.0; } if (x && y) { double o_x = 0.0; double o_y = 0.0; double u_x = 1.0; double u_y = 0.0; double v_x = 0.0; double v_y = 1.0; mTileMod.m_transform.transform(&o_x, &o_y); mTileMod.m_transform.transform(&u_x, &u_y); mTileMod.m_transform.transform(&v_x, &v_y); if (fabs(u_y - o_y) >= 0.0001 || fabs(v_x - o_x) >= 0.0001) CfdgError::Error(loc, "Frieze must be aligned with the X and Y axis."); if ((u_x - o_x) < 0.0 || (v_y - o_y) < 0.0) CfdgError::Error(loc, "Frieze must be in the positive X/Y quadrant."); *x = u_x - o_x; *y = v_y - o_y; } return mTileMod.m_transform.sx == 0.0 ? frieze_y : frieze_x; } bool CFDGImpl::isSized(double* x, double* y) const { yy::location loc; if (!hasParameter("CF::Size", ASTexpression::ModType, loc)) return false; if (x) *x = mSizeMod.m_transform.sx; if (y) *y = mSizeMod.m_transform.sy; if (mSizeMod.m_transform.shx != 0.0 || mSizeMod.m_transform.shy != 0.0) CfdgError::Error(loc, "Size specification must not be rotated or skewed."); return true; } bool CFDGImpl::isTimed(agg::trans_affine_time* t) const { yy::location loc; if (!hasParameter("CF::Time", ASTexpression::ModType, loc)) return false; if (t) *t = mTimeMod.m_time; if (mTimeMod.m_time.tbegin >= mTimeMod.m_time.tend) CfdgError::Error(loc, "Time specification must have positive duration."); return true; } void CFDGImpl::getSymmetry(SymmList& syms, Renderer* r) { syms.clear(); const ASTexpression* e = hasParameter("CF::Symmetry"); const ASTexpression* left = getTransforms(e, syms, r, isTiled(), mTileMod.m_transform); if (left) { CfdgError((*left)[0]->where, "At least one term was invalid"); } } bool CFDGImpl::hasParameter(const char* name, double& value, Renderer* r) const { string n = name; int varNum = tryEncodeShapeName(n); if (varNum < 0) return false; std::map::const_iterator elem = m_ConfigParameters.find(varNum); if (elem == m_ConfigParameters.end() || elem->second->second->mType != ASTexpression::NumericType) return false; if (!elem->second->second->isConstant && !r) { CfdgError::Error(elem->second->second->where, "This expression must be constant"); } else { elem->second->second->evaluate(&value, 1, r); } return true; } bool CFDGImpl::hasParameter(const char* name, Modification& value, Renderer* r) const { string n = name; int varNum = tryEncodeShapeName(n); if (varNum < 0) return false; std::map::const_iterator elem = m_ConfigParameters.find(varNum); if (elem == m_ConfigParameters.end() || elem->second->second->mType != ASTexpression::ModType) return false; if (!elem->second->second->isConstant && !r) { CfdgError::Error(elem->second->second->where, "This expression must be constant"); } else { elem->second->second->evaluate(value, 0, 0, false, varNum, true, r); } return true; } bool CFDGImpl::hasParameter(const char* name, ASTexpression::expType t, yy::location& where) const { string n = name; int varNum = tryEncodeShapeName(n); if (varNum < 0) return false; std::map::const_iterator elem = m_ConfigParameters.find(varNum); if (elem == m_ConfigParameters.end() || elem->second->second->mType != t) return false; where = elem->second->second->where; return true; } const ASTexpression* CFDGImpl::hasParameter(const char* name) const { string n = name; int varNum = tryEncodeShapeName(n); if (varNum < 0) return NULL; std::map::const_iterator elem = m_ConfigParameters.find(varNum); if (elem == m_ConfigParameters.end()) return NULL; return elem->second->second; } static bool stringcompare(const char *lhs, const char *rhs) { return std::strcmp(lhs, rhs) < 0; } bool CFDGImpl::addParameter(std::string name, exp_ptr e, unsigned depth) { static const char* const KnownParams[] = { "CF::AllowOverlap", "CF::Alpha", "CF::Background", "CF::BorderDynamic", "CF::BorderFixed", "CF::Color", "CF::ColorDepth", "CF::Frame", "CF::FrameTime", "CF::Impure", "CF::MaxNatural", "CF::MinimumSize", "CF::Size", "CF::Symmetry", "CF::Tile", "CF::Time" }; if (!std::binary_search(KnownParams, KnownParams + sizeof(KnownParams)/sizeof(KnownParams[0]), name.c_str(), stringcompare)) return false; ASTmodification* m = dynamic_cast (e.get()); int varNum = encodeShapeName(name); std::map::iterator elem = m_ConfigParameters.find(varNum); if (elem == m_ConfigParameters.end()) { m_ConfigParameters.insert(make_pair(varNum, new ConfigParam(depth, e.release()->simplify()))); } else { if (depth < elem->second->first) { elem->second->first = depth; elem->second->second = e.release()->simplify(); } else { return true; } } if (name == "CF::Background" && m) usesAlpha = m->flags & CF_USES_ALPHA; return true; } void CFDGImpl::rulesLoaded() { // thanks to by Brent Yorgey vector weightsums( m_shapeTypes.size(), 0.0 ); vector percentweightsums( m_shapeTypes.size(), 0.0 ); vector unitweightsums( m_shapeTypes.size(), 0.0 ); vector rulecounts( m_shapeTypes.size(), 0 ); vector weightTypes( m_shapeTypes.size(), 0 ); unsigned int i; // first pass: sum all the weights for each shape type for ( i = 0; i < mRules.size(); i++ ) { ASTrule* r = mRules[i]; if (r->weightType == ASTrule::PercentWeight) { percentweightsums[ r->mNameIndex ] += r->mWeight; if (percentweightsums[ r->mNameIndex ] > 1.0001) CfdgError::Error(r->mLocation, "Percentages exceed 100%"); } else { weightsums[ r->mNameIndex ] += r->mWeight; } rulecounts[ r->mNameIndex ]++; weightTypes[r->mNameIndex ] |= (int)(r->weightType); } // second pass: normalize each weight by dividing by the // total weight for that shape type for ( i = 0; i < mRules.size(); i++ ) { ASTrule* r = mRules[i]; double weight = r->mWeight / weightsums[ r->mNameIndex ]; // may be infinity or NaN if (weightTypes[r->mNameIndex ] & (int)ASTrule::PercentWeight) { if (r->weightType == ASTrule::PercentWeight) weight = r->mWeight; else { weight *= 1.0 - percentweightsums[ r->mNameIndex ]; if (percentweightsums[ r->mNameIndex ] > 0.9999) CfdgError::Warning(r->mLocation, "Percentages sum to 100%, this rule has no weight"); } } if (weightTypes[r->mNameIndex] == (int)ASTrule::PercentWeight && fabs(percentweightsums[ r->mNameIndex ] - 1.0) > 0.0001) { CfdgError::Warning(r->mLocation, "Percentages do not sum to 100%"); } if (!isfinite(weight)) weight = 0.0; unitweightsums[ r->mNameIndex ] += weight; if (--rulecounts[ r->mNameIndex ]) { r->mWeight = unitweightsums[ r->mNameIndex ]; } else { // make sure that last rule of a type has a weightsum > 1.0 r->mWeight = 1.1; } } // third pass: sort the rules by shape type, preserving the rule order // with respect to rules of the same shape type sort(mRules.begin(), mRules.end(), ASTrule::compareLT); // Wait until done and then update these members double value; uses16bitColor = hasParameter("CF::ColorDepth", value, NULL) && floor(value) == 16.0; if (hasParameter("CF::Color", value, NULL)) usesColor = value != 0.0; if (hasParameter("CF::Alpha", value, NULL)) usesAlpha = value != 0.0; } int CFDGImpl::numRules() { return (int)mRules.size(); } string CFDGImpl::decodeShapeName(int shapetype) { if (shapetype < int(m_shapeTypes.size())) return m_shapeTypes[shapetype].name; else return ("**unnamed shape**"); } int CFDGImpl::tryEncodeShapeName(const string& s) const { for (unsigned int i = 0; i < m_shapeTypes.size(); i++) { if (s == m_shapeTypes[i].name) { return i; } } return -1; } int CFDGImpl::encodeShapeName(const string& s) { int i = tryEncodeShapeName(s); if (i >= 0) return i; m_shapeTypes.push_back(ShapeType(s)); return (int)m_shapeTypes.size() - 1; } int CFDGImpl::getShapeType(const string& s) { for (unsigned int i = 0; i < m_shapeTypes.size(); i++) { if (s == m_shapeTypes[i].name) { return m_shapeTypes[i].shapeType; } } return newShape; } int CFDGImpl::getShapeType(int shapetype) { return m_shapeTypes[shapetype].shapeType; } bool CFDGImpl::shapeHasRules(int shapetype) { if (shapetype < int(m_shapeTypes.size())) return m_shapeTypes[shapetype].hasRules; else return false; } void CFDGImpl::setShapeHasNoParams(int shapetype, const ASTexpression* args) { if (shapetype < int(m_shapeTypes.size()) && args == NULL) m_shapeTypes[shapetype].shouldHaveNoParams = true; } bool CFDGImpl::getShapeHasNoParams(int shapetype) { if (shapetype < int(m_shapeTypes.size())) return m_shapeTypes[shapetype].shouldHaveNoParams; return false; } const char* CFDGImpl::setShapeParams(int shapetype, AST::ASTrepContainer& p, int argSize, bool isPath) { if (m_secondPass) return 0; ShapeType& shape = m_shapeTypes[shapetype]; if (shape.isShape) { // There has been a forward declaration, so this shape declaration // just introduces the shape elements if (!(p.mParameters.empty())) return "Shape has already been declared. " "Parameter declaration must be on the first shape declaration only."; if (shape.shapeType != newShape) return "Shape name already in use by another rule or path"; if (isPath) return "Path name already in use by another rule or path"; return 0; } if (shape.shapeType != newShape) return "Shape name already in use by another rule or path"; shape.parameters = new AST::ASTparameters(p.mParameters); shape.isShape = true; shape.argSize = argSize; shape.shapeType = isPath ? pathType : newShape; return 0; } const AST::ASTparameters* CFDGImpl::getShapeParams(int shapetype) { if (shapetype < 0 || shapetype >= int(m_shapeTypes.size()) || !m_shapeTypes[shapetype].isShape) return 0; return m_shapeTypes[shapetype].parameters; } int CFDGImpl::getShapeParamSize(int shapetype) { if (shapetype < 0 || shapetype >= int(m_shapeTypes.size())) return 0; return m_shapeTypes[shapetype].argSize; } int CFDGImpl::reportStackDepth(int size) { if (size > mStackSize) mStackSize = size; return mStackSize; } void CFDGImpl::resetCachedPaths() { for (vector::iterator it = mRules.begin(), eit = mRules.end(); it != eit; ++it) { delete (*it)->mCachedPath; (*it)->mCachedPath = 0; } } AST::ASTdefine* CFDGImpl::declareFunction(int nameIndex, AST::ASTdefine* def) { AST::ASTdefine* prev = findFunction(nameIndex); if (prev) return prev; mFunctions[nameIndex] = def; return def; // I could write // return findFunction(nameIndex) || (mFunctions[nameIndex] = def); // But I'm not gonna } AST::ASTdefine* CFDGImpl::findFunction(int nameIndex) { map::iterator fi = mFunctions.find(nameIndex); if (fi != mFunctions.end()) return fi->second; return 0; } Renderer* CFDGImpl::renderer(int width, int height, double minSize, int variation, double border) { if (mInitShape.get()) { if (mInitShape->mShapeSpec.argSize == 0 && getShapeParamSize(mInitShape->mShapeSpec.shapeType)) { CfdgError e(mInitShape->mLocation, "This shape takes parameters"); m_system->syntaxError(e); return 0; } } else { m_system->message("No startshape found"); m_system->error(); return 0; } RendererImpl* r = NULL; try { r = new RendererImpl(this, width, height, minSize, variation, border); Modification tiled; Modification sized; Modification timed; if (hasParameter("CF::Tile", tiled, NULL)) { mTileMod = tiled; mTileOffset.x = mTileMod.m_transform.tx; mTileOffset.y = mTileMod.m_transform.ty; mTileMod.m_transform.tx = mTileMod.m_transform.ty = 0.0; } if (hasParameter("CF::Size", sized, NULL)) { mSizeMod = sized; mTileOffset.x = mSizeMod.m_transform.tx; mTileOffset.y = mSizeMod.m_transform.ty; mSizeMod.m_transform.tx = mSizeMod.m_transform.ty = 0.0; } if (hasParameter("CF::Time", timed, NULL)) { mTimeMod = timed; } r->initBounds(); } catch (CfdgError e) { m_system->syntaxError(e); delete r; // deletes this return 0; } return r; } contextfree-3.0.5+dfsg1.orig/src-common/renderimpl.cpp0000644000175000017500000010750712076364074021375 0ustar brambram// renderimpl.cpp // this file is part of Context Free // --------------------- // Copyright (C) 2006-2008 Mark Lentczner - markl@glyphic.com // Copyright (C) 2006-2013 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // Mark Lentczner can be contacted at markl@glyphic.com or at // Mark Lentczner, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #include "renderimpl.h" #include #include #include #include #include #ifdef _WIN32 #include #include #define isfinite _finite #else #include #endif #include "shapeSTL.h" #include "primShape.h" #include "builder.h" #include "astreplacement.h" #include "CmdInfo.h" #include "tiledCanvas.h" using namespace std; using namespace AST; //#define DEBUG_SIZES #ifndef DEBUG_SIZES #if defined(_WIN64) || defined(__x86_64__) const unsigned int MOVE_FINISHED_AT = 10000000; // when this many, move to file const unsigned int MOVE_UNFINISHED_AT = 10000000; // when this many, move to files #else const unsigned int MOVE_FINISHED_AT = 2000000; // when this many, move to file const unsigned int MOVE_UNFINISHED_AT = 2000000; // when this many, move to files #endif const unsigned int MAX_MERGE_FILES = 200; // maximum number of files to merge at once #else const unsigned int MOVE_FINISHED_AT = 1000; // when this many, move to file const unsigned int MOVE_UNFINISHED_AT = 200; // when this many, move to files const unsigned int MAX_MERGE_FILES = 2; // maximum number of files to merge at once #endif const double SHAPE_BORDER = 1.0; // multiplier of shape size when calculating bounding box const double FIXED_BORDER = 8.0; // fixed extra border, in pixels RendererImpl::RendererImpl(CFDGImpl* cfdg, int width, int height, double minSize, int variation, double border) : m_cfdg(cfdg), mVariation(variation), m_border(border), m_minSize(minSize), shape0(*primShape::shapeMap[0]), shape1(*primShape::shapeMap[1]), shape2(*primShape::shapeMap[2]) { m_width = width; m_height = height; mCFstack.reserve(8000); mFrameTimeBounds.load_from(1.0, -Renderer::Infinity, Renderer::Infinity); m_canvas = 0; mColorConflict = false; m_maxShapes = 500000000; m_currScale = m_currArea = 0.0; mScaleArea = mScale = 0.0; shapeMap[0].mFlags = shapeMap[1].mFlags = shapeMap[2].mFlags = CF_MITER_JOIN + CF_BUTT_CAP + CF_FILL; shapeMap[0].mPathUID = shapeMap[1].mPathUID = shapeMap[2].mPathUID = 0; shapeMap[0].mPath = &shape0; shapeMap[1].mPath = &shape1; shapeMap[2].mPath = &shape2; m_cfdg->hasParameter("CF::FrameTime", mCurrentTime, 0); m_cfdg->hasParameter("CF::Frame", mCurrentFrame, 0); } void RendererImpl::colorConflict(const yy::location& w) { if (mColorConflict) return; CfdgError err(w, "Conflicting color change"); system()->syntaxError(err); mColorConflict = true; } void RendererImpl::init() { mCurrentSeed.seed((unsigned long long)mVariation); mCurrentSeed.bump(); mFinishedFileCount = 0; mUnfinishedFileCount = 0; mFixedBorderX = mFixedBorderY = 0.0; mShapeBorder = 1.0; mTotalArea = 0.0; m_minArea = 0.3; m_outputSoFar = m_stats.shapeCount = m_stats.toDoCount = 0; double minSize = m_minSize; m_cfdg->hasParameter("CF::MinimumSize", minSize, this); minSize = (minSize <= 0.0) ? 0.3 : minSize; m_minArea = minSize * minSize; mFixedBorderX = FIXED_BORDER * ((m_border <= 1.0) ? m_border : 1.0); mShapeBorder = SHAPE_BORDER * ((m_border <= 1.0) ? 1.0 : m_border); m_cfdg->hasParameter("CF::BorderFixed", mFixedBorderX, this); m_cfdg->hasParameter("CF::BorderDynamic", mShapeBorder, this); if (2 * (int)fabs(mFixedBorderX) >= min(m_width, m_height)) mFixedBorderX = 0.0; if (mShapeBorder <= 0.0) mShapeBorder = 1.0; if (m_cfdg->hasParameter("CF::MaxNatural", mMaxNatural, this) && (mMaxNatural < 1.0 || (mMaxNatural - 1.0) == mMaxNatural)) { const ASTexpression* max = m_cfdg->hasParameter("CF::MaxNatural"); throw CfdgError(max->where, (mMaxNatural < 1.0) ? "CF::MaxNatural must be >= 1" : "CF::MaxNatural must be < 9007199254740992"); } mCurrentPath = new AST::ASTcompiledPath(); m_cfdg->getSymmetry(mSymmetryOps, this); m_cfdg->getBackgroundColor(this); } void RendererImpl::initBounds() { init(); double tile_x, tile_y; m_tiled = m_cfdg->isTiled(0, &tile_x, &tile_y); m_frieze = m_cfdg->isFrieze(0, &tile_x, &tile_y); m_sized = m_cfdg->isSized(&tile_x, &tile_y); m_timed = m_cfdg->isTimed(&mTimeBounds); if (m_tiled || m_sized) { mFixedBorderX = mShapeBorder = 0.0; mBounds.mMin_X = -(mBounds.mMax_X = tile_x / 2.0); mBounds.mMin_Y = -(mBounds.mMax_Y = tile_y / 2.0); mBounds.mValid = true; rescaleOutput(m_width, m_height, true); mScaleArea = m_currArea; } if (m_frieze == CFDG::frieze_x) m_frieze_size = tile_x / 2.0; if (m_frieze == CFDG::frieze_y) m_frieze_size = tile_y / 2.0; if (m_frieze != CFDG::frieze_y) mFixedBorderY = mFixedBorderX; if (m_frieze == CFDG::frieze_x) mFixedBorderX = 0.0; } void RendererImpl::resetSize(int x, int y) { m_width = x; m_height = y; if (m_tiled || m_sized) { m_currScale = m_currArea = 0.0; rescaleOutput(m_width, m_height, true); mScaleArea = m_currArea; } } class Stopped { }; static void releaser(const Shape& s) { if (Renderer::AbortEverything) throw Stopped(); s.releaseParams(); } RendererImpl::~RendererImpl() { cleanup(); delete m_cfdg; } void RendererImpl::cleanup() { // delete temp files before checking for abort m_finishedFiles.clear(); m_unfinishedFiles.clear(); try { for_each(mUnfinishedShapes.begin(), mUnfinishedShapes.end(), releaser); for_each(mFinishedShapes.begin(), mFinishedShapes.end(), releaser); } catch (Stopped) { return; } for (std::deque::const_iterator cit = mLongLivedParams.begin(); cit != mLongLivedParams.end(); ++cit) { delete[] *cit; if (AbortEverything) return; } mUnfinishedShapes.clear(); mFinishedShapes.clear(); mLongLivedParams.clear(); unsigned i = 0; for (ASTbody::const_iterator cit = m_cfdg->mCFDGcontents.mBody.begin(), endit = m_cfdg->mCFDGcontents.mBody.end(); cit != endit; ++cit) { if (AbortEverything) return; const ASTreplacement* rep = *cit; if (const ASTdefine* def = dynamic_cast (rep)) { if (def->mType == ASTexpression::RuleType) mCFstack[i].rule->release(); i += def->mTuplesize; } } mCFstack.clear(); delete mCurrentPath; mCurrentPath = 0; m_cfdg->resetCachedPaths(); } void RendererImpl::setMaxShapes(int n) { m_maxShapes = n ? n : 400000000; } void RendererImpl::resetBounds() { mBounds = Bounds(); } void RendererImpl::outputPrep(Canvas* canvas) { m_canvas = canvas; if (canvas) { m_width = canvas->mWidth; m_height = canvas->mHeight; if (m_tiled || m_frieze) { agg::trans_affine tr; m_cfdg->isTiled(&tr); m_cfdg->isFrieze(&tr); delete m_tiledCanvas; m_tiledCanvas = new tiledCanvas(canvas, tr, m_frieze); m_tiledCanvas->scale(m_currScale); m_canvas = m_tiledCanvas; } mFrameTimeBounds.load_from(1.0, -Renderer::Infinity, Renderer::Infinity); } requestStop = false; requestFinishUp = false; requestUpdate = false; m_stats.inOutput = false; m_stats.animating = false; } double RendererImpl::run(Canvas * canvas, bool partialDraw) { if (!m_stats.animating) outputPrep(canvas); int reportAt = 250; Shape dummy; for (ASTbody::const_iterator cit = m_cfdg->mCFDGcontents.mBody.begin(), endit = m_cfdg->mCFDGcontents.mBody.end(); cit != endit; ++cit) { const ASTreplacement* rep = *cit; if (const ASTdefine* def = dynamic_cast (rep)) def->traverse(dummy, false, this); } Shape initShape = m_cfdg->getInitialShape(this); initShape.mWorldState.mRand64Seed = mCurrentSeed; if (!m_timed) mTimeBounds = initShape.mWorldState.m_time; try { processShape(initShape); } catch (CfdgError e) { requestStop = true; system()->syntaxError(e); } for (;;) { fileIfNecessary(); if (requestStop) break; if (requestFinishUp) break; if (mUnfinishedShapes.empty()) break; if ((m_stats.shapeCount + m_stats.toDoCount) > m_maxShapes) break; // Get the largest unfinished shape Shape s = mUnfinishedShapes.front(); pop_heap(mUnfinishedShapes.begin(), mUnfinishedShapes.end()); mUnfinishedShapes.pop_back(); m_stats.toDoCount--; const ASTrule* rule = m_cfdg->findRule(s.mShapeType, s.mWorldState.mRand64Seed.getDouble()); try { m_drawingMode = false; // shouldn't matter rule->traverse(s, false, this); } catch (CfdgError e) { requestStop = true; system()->syntaxError(e); break; } if (requestUpdate || (m_stats.shapeCount > reportAt)) { if (partialDraw) outputPartial(); outputStats(); reportAt = 2 * m_stats.shapeCount; } } if (!m_cfdg->usesTime && !m_timed) mTimeBounds.load_from(1.0, 0.0, mTotalArea); if (!requestStop) { outputFinal(); } if (!requestStop) { outputStats(); } if (!m_canvas && m_frieze) rescaleOutput(m_width, m_height, true); return m_currScale; } void RendererImpl::draw(Canvas* canvas) { mFrameTimeBounds.load_from(1.0, -Renderer::Infinity, Renderer::Infinity); outputPrep(canvas); outputFinal(); outputStats(); } class OutputBounds : public ShapeOp { public: OutputBounds(int frames, const agg::trans_affine_time& timeBounds, double shapeBorder, int width, int height, double fixedBorderX, double fixedBorderY, RendererImpl& renderer); void apply(const FinishedShape&); const Bounds& frameBounds(int frame) { return mFrameBounds[frame]; } int frameCount(int frame) { return mFrameCounts[frame]; } void finalAccumulate(); // call after all the frames to compute the bounds at each frame void backwardFilter(double framesToHalf); void smooth(int window); class Stopped { }; private: agg::trans_affine_time mTimeBounds; double mFrameScale; double mShapeBorder; vector mFrameBounds; vector mFrameCounts; double mScale; int mWidth; int mHeight; int mFrames; double mFixedBorderX; double mFixedBorderY; RendererImpl& mRenderer; }; OutputBounds::OutputBounds(int frames, const agg::trans_affine_time& timeBounds, double shapeBorder, int width, int height, double fixedBorderX, double fixedBorderY, RendererImpl& renderer) : mTimeBounds(timeBounds), mShapeBorder(shapeBorder), mScale(0.0), mWidth(width), mHeight(height), mFrames(frames), mFixedBorderX(fixedBorderX), mFixedBorderY(fixedBorderY), mRenderer(renderer) { mFrameScale = (double)frames / (timeBounds.tend - timeBounds.tbegin); mFrameBounds.resize(frames); mFrameCounts.resize(frames, 0); } void OutputBounds::apply(const FinishedShape& s) { if (mRenderer.requestStop || mRenderer.requestFinishUp) throw Stopped(); if (mScale == 0.0) { // If we don't know the approximate scale yet then just // make an educated guess. mScale = (mWidth + mHeight) / sqrt(fabs(s.mWorldState.m_transform.determinant())); } agg::trans_affine_time frameTime(s.mWorldState.m_time); frameTime.translate(-mTimeBounds.tbegin); frameTime.scale(mFrameScale); int begin = (frameTime.tbegin < mFrames) ? (int)floor(frameTime.tbegin) : (mFrames - 1); int end = (frameTime.tend < mFrames) ? (int)floor(frameTime.tend) : (mFrames - 1); if (begin < 0) begin = 0; if (end < 0) end = 0; for (int frame = begin; frame <= end; ++frame) { mFrameBounds[frame] += s.mBounds; } mFrameCounts[begin] += 1; } void OutputBounds::finalAccumulate() { return; // Accumulation is done in the apply method #if 0 vector::iterator prev, curr, end; prev = mFrameBounds.begin(); end = mFrameBounds.end(); if (prev == end) return; for (curr = prev + 1; curr != end; prev = curr, ++curr) { *curr += *prev; } #endif } void OutputBounds::backwardFilter(double framesToHalf) { double alpha = pow(0.5, 1.0 / framesToHalf); vector::reverse_iterator prev, curr, end; prev = mFrameBounds.rbegin(); end = mFrameBounds.rend(); if (prev == end) return; for (curr = prev + 1; curr != end; prev = curr, ++curr) { *curr = curr->interpolate(*prev, alpha); } } void OutputBounds::smooth(int window) { int frames = (int)mFrameBounds.size(); if (frames == 0) return; mFrameBounds.resize(frames + window - 1, mFrameBounds.back()); vector::iterator write, read, end; read = mFrameBounds.begin(); double factor = 1.0 / window; Bounds accum; for (int i = 0; i < window; ++i) accum.gather(*read++, factor); write = mFrameBounds.begin(); end = mFrameBounds.end(); for (;;) { Bounds old = *write; *write++ = accum; accum.gather(old, -factor); if (read == end) break; accum.gather(*read++, factor); } mFrameBounds.resize(frames, Bounds()); } void RendererImpl::animate(Canvas* canvas, int frames, bool zoom) { outputPrep(canvas); const bool ftime = m_cfdg->usesFrameTime; zoom = zoom && !ftime; if (ftime) cleanup(); // start with a blank frame int curr_width = m_width; int curr_height = m_height; rescaleOutput(curr_width, curr_height, true); m_canvas->start(true, m_cfdg->getBackgroundColor(0), curr_width, curr_height); m_canvas->end(); double frameInc = (mTimeBounds.tend - mTimeBounds.tbegin) / frames; OutputBounds outputBounds(frames, mTimeBounds, mShapeBorder, curr_width, curr_height, mFixedBorderX, mFixedBorderY, *this); if (zoom) { system()->message("Computing zoom"); try { forEachShape(true, outputBounds); //outputBounds.finalAccumulate(); outputBounds.backwardFilter(10.0); //outputBounds.smooth(3); } catch (OutputBounds::Stopped) { m_stats.animating = false; return; } } m_stats.shapeCount = 0; m_stats.animating = true; mFrameTimeBounds.tend = mTimeBounds.tbegin; Bounds saveBounds = mBounds; for (int frameCount = 1; frameCount <= frames; ++frameCount) { system()->message("Generating frame %d of %d", frameCount, frames); if (zoom) mBounds = outputBounds.frameBounds(frameCount - 1); m_stats.shapeCount += outputBounds.frameCount(frameCount - 1); mFrameTimeBounds.tbegin = mFrameTimeBounds.tend; mFrameTimeBounds.tend = mTimeBounds.tbegin + frameInc * frameCount; if (ftime) { mCurrentTime = (mFrameTimeBounds.tbegin + mFrameTimeBounds.tend) * 0.5; mCurrentFrame = (frameCount - 1.0)/(frames - 1.0); try { init(); } catch (CfdgError err) { system()->syntaxError(err); cleanup(); mBounds = saveBounds; m_stats.animating = false; outputStats(); return; } run(canvas, false); m_canvas = canvas; } else { outputFinal(); outputStats(); } if (ftime) cleanup(); if (requestStop || requestFinishUp) break; } mBounds = saveBounds; m_stats.animating = false; outputStats(); system()->message("Animation of %d frames complete", frames); } void RendererImpl::processShape(const Shape& s) { double area = s.area(); if (!isfinite(area)) { requestStop = true; system()->error(); system()->message("A shape got too big."); s.releaseParams(); return; } if (s.mWorldState.m_time.tbegin > s.mWorldState.m_time.tend) { s.releaseParams(); return; } if (m_cfdg->getShapeType(s.mShapeType) == CFDGImpl::ruleType && m_cfdg->shapeHasRules(s.mShapeType)) { // only add it if it's big enough (or if there are no finished shapes yet) if (!mBounds.valid() || (area * mScaleArea >= m_minArea)) { m_stats.toDoCount++; mUnfinishedShapes.push_back(s); push_heap(mUnfinishedShapes.begin(), mUnfinishedShapes.end()); } else { s.releaseParams(); } } else if (m_cfdg->getShapeType(s.mShapeType) == CFDGImpl::pathType) { const ASTrule* rule = m_cfdg->findRule(s.mShapeType, 0.0); processPrimShape(s, rule); } else if (primShape::isPrimShape(s.mShapeType)) { processPrimShape(s); } else { requestStop = true; s.releaseParams(); system()->error(); system()->message("Shape with no rules encountered: %s.", m_cfdg->decodeShapeName(s.mShapeType).c_str()); } } void RendererImpl::processPrimShape(const Shape& s, const ASTrule* path) { int num = (int)mSymmetryOps.size(); if (num == 0 || s.mShapeType == primShape::fillType) { processPrimShapeSiblings(s, path); } else { for (int i = 0; i < num; ++i) { Shape sym(s); sym.mWorldState.m_transform.multiply(mSymmetryOps[i]); processPrimShapeSiblings(sym, path); } } } void RendererImpl::processPrimShapeSiblings(const Shape& s, const ASTrule* path) { m_stats.shapeCount++; if (mScale == 0.0) { // If we don't know the approximate scale yet then just // make an educated guess. mScale = (m_width + m_height) / sqrt(fabs(s.mWorldState.m_transform.determinant())); } double oldArea = mTotalArea; if (path || s.mShapeType != primShape::fillType) { mCurrentCentroid.x = mCurrentCentroid.y = mCurrentArea = 0.0; mPathBounds.mValid = false; m_drawingMode = false; if (path) { path->traversePath(s, this); } else { CommandInfo* attr = 0; if (s.mShapeType < 3) attr = &(shapeMap[s.mShapeType]); processPathCommand(s, attr); } mTotalArea += mCurrentArea; if (!m_tiled && !m_sized) { mBounds.merge(mPathBounds.dilate(mShapeBorder)); if (m_frieze == CFDG::frieze_x) mBounds.mMin_X = -(mBounds.mMax_X = m_frieze_size); if (m_frieze == CFDG::frieze_y) mBounds.mMin_Y = -(mBounds.mMax_Y = m_frieze_size); mScale = mBounds.computeScale(m_width, m_height, mFixedBorderX, mFixedBorderY, false); mScaleArea = mScale * mScale; } } else { mCurrentArea = Renderer::Infinity; } if (oldArea == mTotalArea) #ifdef _WIN32 mTotalArea = _nextafter(mTotalArea, DBL_MAX); #else mTotalArea = nextafter(mTotalArea, DBL_MAX); #endif FinishedShape fs(s, mTotalArea, mPathBounds); fs.mWorldState.m_ColorTarget.a = mCurrentArea; if (!m_cfdg->usesTime) { fs.mWorldState.m_time.tbegin = mTotalArea; fs.mWorldState.m_time.tend = Renderer::Infinity; } if (fs.mWorldState.m_time.tbegin < mTimeBounds.tbegin && isfinite(fs.mWorldState.m_time.tbegin) && !m_timed) { mTimeBounds.tbegin = fs.mWorldState.m_time.tbegin; } if (fs.mWorldState.m_time.tbegin > mTimeBounds.tend && isfinite(fs.mWorldState.m_time.tbegin) && !m_timed) { mTimeBounds.tend = fs.mWorldState.m_time.tbegin; } if (fs.mWorldState.m_time.tend > mTimeBounds.tend && isfinite(fs.mWorldState.m_time.tend) && !m_timed) { mTimeBounds.tend = fs.mWorldState.m_time.tend; } if (fs.mWorldState.m_time.tend < mTimeBounds.tbegin && isfinite(fs.mWorldState.m_time.tend) && !m_timed) { mTimeBounds.tbegin = fs.mWorldState.m_time.tend; } if (!fs.mWorldState.isFinite()) { requestStop = true; system()->error(); system()->message("A shape got too big."); return; } mFinishedShapes.insert(fs); if (fs.mParameters) fs.mParameters->retain(this); } void RendererImpl::processSubpath(const Shape& s, bool tr, int expectedType) { const ASTrule* rule = 0; if (m_cfdg->getShapeType(s.mShapeType) != CFDGImpl::pathType && primShape::isPrimShape(s.mShapeType) && expectedType == ASTreplacement::op) { rule = ASTrule::PrimitivePaths[s.mShapeType]; } else { rule = m_cfdg->findRule(s.mShapeType, 0.0); } if ((int)(rule->mRuleBody.mRepType) != expectedType) throw CfdgError(rule->mLocation, "Subpath is not of the expected type (path ops/commands)"); rule->mRuleBody.traverse(s, tr, this, true); } //-------------------------------------------------------------------------//// void RendererImpl::fileIfNecessary() { if (mFinishedShapes.size() > MOVE_FINISHED_AT) moveFinishedToFile(); if (mUnfinishedShapes.size() > MOVE_UNFINISHED_AT) moveUnfinishedToTwoFiles(); else if (mUnfinishedShapes.empty()) getUnfinishedFromFile(); } void RendererImpl::moveUnfinishedToTwoFiles() { ref_ptr t1 = TempFile::build(system(), "cfdg-temp-unfin-", "expansion", ++mUnfinishedFileCount); ref_ptr t2 = TempFile::build(system(), "cfdg-temp-unfin-", "expansion", ++mUnfinishedFileCount); m_unfinishedFiles.push_back(t1); m_unfinishedFiles.push_back(t2); auto_ptr f1(t1->forWrite()); auto_ptr f2(t2->forWrite()); system()->message("Writing %s temp files %d & %d", t1->type().c_str(), t1->number(), t2->number()); int count = (int)mUnfinishedShapes.size() / 3; UnfinishedContainer::iterator usi = mUnfinishedShapes.begin(), use = mUnfinishedShapes.end(); usi += count; if (f1->good() && f2->good()) { AbstractSystem::Stats outStats = m_stats; outStats.outputCount = count; outStats.outputDone = 0; *f1 << outStats.outputCount; *f2 << outStats.outputCount; outStats.outputCount = count * 2; outStats.showProgress = true; // Split the bottom 2/3 of the heap between the two files while (usi != use) { usi->write(*((m_unfinishedInFilesCount & 1) ? f1 : f2)); ++usi; ++m_unfinishedInFilesCount; ++outStats.outputDone; if (requestUpdate) { system()->stats(outStats); requestUpdate = false; } if (requestStop) return; } } else { system()->message("Cannot open temporary file for expansions"); requestStop = true; return; } // Remove the written shapes, heap property remains intact static const Shape neverActuallyUsed; mUnfinishedShapes.resize(count, neverActuallyUsed); assert(checkHeap()); } void RendererImpl::getUnfinishedFromFile() { if (m_unfinishedFiles.empty()) return; ref_ptr t = m_unfinishedFiles.front(); auto_ptr f(t->forRead()); if (f->good()) { AbstractSystem::Stats outStats = m_stats; *f >> outStats.outputCount; outStats.outputDone = 0; outStats.showProgress = true; istream_iterator it(*f); istream_iterator eit; back_insert_iterator< UnfinishedContainer > sendto(mUnfinishedShapes); while (it != eit) { *sendto = *it; ++it; ++outStats.outputDone; if (requestUpdate) { system()->stats(outStats); requestUpdate = false; } if (requestStop) return; } } else { system()->message("Cannot open temporary file for expansions"); requestStop = true; return; } system()->message("Resorting expansions"); fixupHeap(); m_unfinishedFiles.pop_front(); } bool RendererImpl::checkHeap() { // Confirm that mUnfinishedShapes still has the heap property size_t parent = 0; size_t num = mUnfinishedShapes.size(); for (size_t child = 1; child < num; ++child) { if (mUnfinishedShapes[parent] < mUnfinishedShapes[child]) return false; if ((child & 1) == 0) ++parent; } return true; } void RendererImpl::fixupHeap() { // Restore heap property to mUnfinishedShapes size_t size = mUnfinishedShapes.size(); if (size < 2) return; // Add a dummy entry to the end to guarantee that all nodes have two children Shape s; s.mAreaCache = DBL_MIN; s.mShapeType = -1; mUnfinishedShapes.push_back(s); size_t top = (size - 1) / 2; AbstractSystem::Stats outStats = m_stats; outStats.outputCount = (int)top; outStats.outputDone = 0; outStats.showProgress = true; for (;;--top) { s = mUnfinishedShapes[top]; size_t child = top * 2; size_t hole = top; // Bubble up children until we find a place for the current node while (s < mUnfinishedShapes[child] || s < mUnfinishedShapes[child + 1]) { // Bubble up the largest child if (mUnfinishedShapes[child] < mUnfinishedShapes[child + 1]) ++child; mUnfinishedShapes[hole] = mUnfinishedShapes[child]; hole = child; if (child * 2 >= size) break; child = child * 2; } // Copy down the node only if at least one child bubbled up if (hole > top) mUnfinishedShapes[hole] = s; if (top == 0) break; ++outStats.outputDone; if (requestUpdate) { system()->stats(outStats); requestUpdate = false; } if (requestStop) return; } // Dummy entry should still be at end, remove it assert(mUnfinishedShapes.back().mAreaCache == DBL_MIN); assert(mUnfinishedShapes.back().mShapeType == -1); mUnfinishedShapes.pop_back(); assert(checkHeap()); } //-------------------------------------------------------------------------//// void RendererImpl::moveFinishedToFile() { ref_ptr t = TempFile::build(system(), "cfdg-temp-fin-", "shapes", ++mFinishedFileCount); m_finishedFiles.push_back(t); auto_ptr f(t->forWrite()); if (f->good()) { AbstractSystem::Stats outStats = m_stats; outStats.outputCount = (int)mFinishedShapes.size(); outStats.outputDone = 0; outStats.showProgress = true; for (multiset::iterator it = mFinishedShapes.begin(), eit = mFinishedShapes.end(); it != eit; ++it) { *f << *it; ++outStats.outputDone; if (requestUpdate) { system()->stats(outStats); requestUpdate = false; } if (requestStop) return; } } else { system()->message("Cannot open temporary file for shapes"); requestStop = true; return; } mFinishedShapes.clear(); } //-------------------------------------------------------------------------//// void RendererImpl::rescaleOutput(int& curr_width, int& curr_height, bool final) { agg::trans_affine trans; double scale; if (!mBounds.mValid) return; scale = mBounds.computeScale(curr_width, curr_height, mFixedBorderX, mFixedBorderY, true, &trans, m_tiled || m_sized || m_frieze); if (final // if final output || m_currScale == 0.0 // if first time, use this scale || (m_currScale * 0.90) > scale)// if grew by more than 10% { m_currScale = scale; m_currArea = scale * scale; if (m_tiledCanvas) m_tiledCanvas->scale(scale); m_currTrans = trans; m_outputSoFar = 0; m_stats.fullOutput = true; } } void RendererImpl::forEachShape(bool final, ShapeOp& op) { if (!final) { if (m_outputSoFar) m_outputPosition = ++m_outputPosition; else m_outputPosition = mFinishedShapes.begin(); for_each(m_outputPosition, mFinishedShapes.end(), op.outputFunction()); m_outputSoFar = (int)mFinishedShapes.size(); if (m_outputSoFar) m_outputPosition = --(mFinishedShapes.end()); } else if (m_finishedFiles.empty()) { for_each(mFinishedShapes.begin(), mFinishedShapes.end(), op.outputFunction()); } else { deque< ref_ptr >::iterator begin, last, end; while (m_finishedFiles.size() > MAX_MERGE_FILES) { OutputMerge merger(*system()); begin = m_finishedFiles.begin(); last = begin + (MAX_MERGE_FILES - 1); end = last + 1; for_each(begin, end, merger.tempFileAdder()); ref_ptr t = TempFile::build(system(), "cfdg-temp-mrg-", "merge", ++mFinishedFileCount); ostream* f = t->forWrite(); system()->message("Merging temp files %d through %d", (*begin)->number(), (*last)->number()); merger.merge(ostream_iterator(*f)); delete f; m_finishedFiles.erase(begin, end); m_finishedFiles.push_back(t); } OutputMerge merger(*system()); begin = m_finishedFiles.begin(); end = m_finishedFiles.end(); for_each(begin, end, merger.tempFileAdder()); merger.addShapes(mFinishedShapes.begin(), mFinishedShapes.end()); merger.merge(op.outputIterator()); } } class OutputDraw : public ShapeOp { public: OutputDraw(RendererImpl& renderer, bool final); void apply(const FinishedShape&); class Stopped { }; private: RendererImpl& mRenderer; bool mFinal; tiledCanvas* tiler; }; OutputDraw::OutputDraw(RendererImpl& renderer, bool final) : mRenderer(renderer), mFinal(final), tiler(renderer.m_tiledCanvas) { } void OutputDraw::apply(const FinishedShape& s) { if (mRenderer.requestStop) throw Stopped(); if (!mFinal && mRenderer.requestFinishUp) throw Stopped(); if (mRenderer.requestUpdate) mRenderer.outputStats(); if (!s.mWorldState.m_time.overlaps(mRenderer.mFrameTimeBounds)) return; mRenderer.m_stats.outputDone += 1; agg::trans_affine tr = s.mWorldState.m_transform; tr *= mRenderer.m_currTrans; double a = s.mWorldState.m_ColorTarget.a * mRenderer.m_currArea; //fabs(tr.determinant()); if ((!isfinite(a) && s.mShapeType != primShape::fillType) || a < mRenderer.m_minArea) return; if (tiler) { Bounds b = s.mBounds; mRenderer.m_currTrans.transform(&b.mMin_X, &b.mMin_Y); mRenderer.m_currTrans.transform(&b.mMax_X, &b.mMax_Y); tiler->tileTransform(b); } if (mRenderer.m_cfdg->getShapeType(s.mShapeType) == CFDGImpl::pathType) { //mRenderer.m_canvas->path(s.mColor, tr, *s.mAttributes); const ASTrule* rule = mRenderer.m_cfdg->findRule(s.mShapeType, 0.0); rule->traversePath(s, &mRenderer); } else { RGBA8 color = mRenderer.m_cfdg->getColor(s.mWorldState.m_Color); switch(s.mShapeType) { case primShape::circleType: mRenderer.m_canvas->circle(color, tr); break; case primShape::squareType: mRenderer.m_canvas->square(color, tr); break; case primShape::triangleType: mRenderer.m_canvas->triangle(color, tr); break; case primShape::fillType: mRenderer.m_canvas->fill(color); break; default: mRenderer.system()->error(); mRenderer.system()->message("Non drawable shape with no rules: %s", mRenderer.m_cfdg->decodeShapeName(s.mShapeType).c_str()); mRenderer.requestStop = true; throw Stopped(); } } } void RendererImpl::output(bool final) { if (!m_canvas) return; if (!final && !m_finishedFiles.empty()) return; // don't do updates once we have temp files m_stats.inOutput = true; m_stats.fullOutput = final; m_stats.finalOutput = final; m_stats.outputCount = m_stats.shapeCount; int curr_width = m_width; int curr_height = m_height; rescaleOutput(curr_width, curr_height, final); m_stats.outputDone = m_outputSoFar; m_canvas->start(m_outputSoFar == 0, m_cfdg->getBackgroundColor(0), curr_width, curr_height); m_drawingMode = true; OutputDraw draw(*this, final); try { forEachShape(final, draw); } catch (OutputDraw::Stopped) { } m_canvas->end(); m_stats.inOutput = false; m_stats.outputTime = m_canvas->mTime; } void RendererImpl::outputStats() { system()->stats(m_stats); requestUpdate = false; } void RendererImpl::processPathCommand(const Shape& s, const AST::CommandInfo* attr) { if (m_drawingMode) { if (m_canvas && attr) { RGBA8 color = m_cfdg->getColor(s.mWorldState.m_Color); agg::trans_affine tr = s.mWorldState.m_transform; tr *= m_currTrans; m_canvas->path(color, tr, *attr); } } else { if (attr) { double area = 0.0; agg::point_d cent(0.0, 0.0); mPathBounds.update(s.mWorldState.m_transform, m_pathIter, mScale, *attr, ¢, &area); mCurrentCentroid.x = (mCurrentCentroid.x * mCurrentArea + cent.x * area) / (mCurrentArea + area); mCurrentCentroid.y = (mCurrentCentroid.x * mCurrentArea + cent.y * area) / (mCurrentArea + area); mCurrentArea = mCurrentArea + area; } } } void RendererImpl::storeParams(const StackType* p) { mLongLivedParams.push_back(p); } contextfree-3.0.5+dfsg1.orig/src-common/chunk_vector.h0000644000175000017500000002337312076364074021371 0ustar brambram// chunk_vector.h // this file is part of Context Free // --------------------- // Copyright (C) 2012 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #ifndef INCLUDE_CHUNK_VECTOR_H #define INCLUDE_CHUNK_VECTOR_H #include #include #include #include template struct chunk_vector_iterator { enum consts_e { _chunk_size = 1 << _power2, _chunk_mask = _chunk_size - 1 }; typedef std::random_access_iterator_tag iterator_category; typedef _valType value_type; typedef _valType* pointer; typedef _valType& reference; typedef size_t size_type; typedef ptrdiff_t difference_type; pointer* _chunksPtr; pointer _current; size_type _size; size_type _index; chunk_vector_iterator(_valType** vals, size_t size, bool begin) : _chunksPtr(vals), _size(size), _index(begin ? 0 : size) { if (_index < size) _current = _chunksPtr[_index >> _power2] + (_index & _chunk_mask); } chunk_vector_iterator(const chunk_vector_iterator& cvi) : _chunksPtr(cvi._chunksPtr), _current(cvi._current), _size(cvi._size), _index(cvi._index) { } chunk_vector_iterator() : _chunksPtr(0), _current(0), _size(0), _index(0) { } reference operator*() const { return *_current; } pointer operator->() const { return _current; } chunk_vector_iterator& operator++() { ++_index; if (_index < _size) _current = _chunksPtr[_index >> _power2] + (_index & _chunk_mask); return *this; } chunk_vector_iterator operator++(int) { chunk_vector_iterator tmp = *this; ++*this; return tmp; } chunk_vector_iterator& operator--() { if (_index) { --_index; _current = _chunksPtr[_index >> _power2] + (_index & _chunk_mask); } return *this; } chunk_vector_iterator operator--(int) { chunk_vector_iterator tmp = *this; --*this; return tmp; } chunk_vector_iterator& operator+=(difference_type n) { _index += n; if (_index < _size) _current = _chunksPtr[_index >> _power2] + (_index & _chunk_mask); return *this; } chunk_vector_iterator operator+(difference_type n) const { chunk_vector_iterator tmp = *this; tmp += n; return tmp; } chunk_vector_iterator& operator-=(difference_type n) { _index -= n; if (_index < _size) _current = _chunksPtr[_index >> _power2] + (_index & _chunk_mask); return *this; } chunk_vector_iterator operator-(difference_type n) const { chunk_vector_iterator tmp = *this; tmp -= n; return tmp; } difference_type operator-(const chunk_vector_iterator& cvi) const { return _index - cvi._index; } reference operator[](difference_type n) const { size_t i = _index + n; if (i < _size) { _valType* val = _chunksPtr[i >> _power2] + (i & _chunk_mask); return *val; } return *_current; } }; template inline bool operator==(chunk_vector_iterator<_valType, _power2>& __x, chunk_vector_iterator<_valType, _power2>& __y) { return __x._chunksPtr == __y._chunksPtr && __x._index == __y._index; } template inline bool operator!=(chunk_vector_iterator<_valType, _power2>& __x, chunk_vector_iterator<_valType, _power2>& __y) { return __x._chunksPtr != __y._chunksPtr || __x._index != __y._index; } template inline bool operator<(chunk_vector_iterator<_valType, _power2>& __x, chunk_vector_iterator<_valType, _power2>& __y) { return __x._index < __y._index; } template inline bool operator>(chunk_vector_iterator<_valType, _power2>& __x, chunk_vector_iterator<_valType, _power2>& __y) { return __x._index > __y._index; } template inline bool operator<=(chunk_vector_iterator<_valType, _power2>& __x, chunk_vector_iterator<_valType, _power2>& __y) { return __x._index <= __y._index; } template inline bool operator>=(chunk_vector_iterator<_valType, _power2>& __x, chunk_vector_iterator<_valType, _power2>& __y) { return __x._index >= __y._index; } template inline chunk_vector_iterator<_valType, _power2> operator+(ptrdiff_t __n, chunk_vector_iterator<_valType, _power2>& __x) { return __x + __n; } template > class chunk_vector { private: size_t _size; std::vector<_valType*> _chunks; _Alloc _valAlloc; enum consts_e { _chunk_size = 1 << _power2, _chunk_mask = _chunk_size - 1 }; public: typedef _valType value_type; typedef typename _Alloc::pointer pointer; typedef typename _Alloc::const_pointer const_pointer; typedef typename _Alloc::reference reference; typedef typename _Alloc::const_reference const_reference; typedef chunk_vector_iterator<_valType, _power2> iterator; typedef chunk_vector_iterator const_iterator; typedef std::reverse_iterator const_reverse_iterator; typedef std::reverse_iterator reverse_iterator; typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _Alloc allocator_type; chunk_vector() : _size(0) { assert(_valAlloc.max_size() >= _chunk_size); } ~chunk_vector() { clear(); } void push_back(const_reference x) { size_t chunkNum = _size >> _power2; if (_chunks.size() <= chunkNum) _chunks.push_back(_valAlloc.allocate(_chunk_size)); _valType* endVal = _chunks[chunkNum] + (_size & _chunk_mask); _valAlloc.construct(endVal, x); ++_size; } void pop_back() { if (_size == 0) return; --_size; _valType* endVal = _chunks[_size >> _power2] + (_size & _chunk_mask); _valAlloc.destroy(endVal); } size_type size() const { return _size; } bool empty() const { return _size == 0; } void clear() { for (size_t chunkNum = 0, num2delete = _size; num2delete; ++chunkNum) { size_t valCount = num2delete > _chunk_size ? _chunk_size : num2delete; _valType* chunk = _chunks[chunkNum]; for (size_t valNum = 0; valNum < valCount; ++valNum) _valAlloc.destroy(chunk + valNum); _valAlloc.deallocate(chunk, _chunk_size); num2delete -= valCount; } _chunks.clear(); _size = 0; } void resize(size_type newSize, const_reference x) { while (newSize > _size) push_back(x); while (newSize < _size) pop_back(); } reference operator[](size_t i) { _valType* chunk = _chunks[i >> _power2]; return chunk[i & _chunk_mask]; } const_reference operator[](size_t i) const { _valType* chunk = _chunks[i >> _power2]; return chunk[i & _chunk_mask]; } reference front() { return (*this)[0]; } const_reference front() const { return (*this)[0]; } reference back() { return (*this)[_size - 1]; } const_reference back() const { return (*this)[_size - 1]; } iterator begin() { return iterator(&(_chunks[0]), _size, true); } iterator end() { return iterator(&(_chunks[0]), _size, false); } const_iterator begin() const { return const_iterator(&(_chunks[0]), _size, true); } const_iterator end() const { return const_iterator(&(_chunks[0]), _size, false); } reverse_iterator rbegin() { return reverse_iterator(&(_chunks[0]), _size, false); } reverse_iterator rend() { return reverse_iterator(&(_chunks[0]), _size, true); } const_reverse_iterator rbegin() const { return const_reverse_iterator(&(_chunks[0]), _size, false); } const_reverse_iterator rend() const { return const_reverse_iterator(&(_chunks[0]), _size, true); } }; #endif // INCLUDE_CHUNK_VECTOR_H contextfree-3.0.5+dfsg1.orig/src-common/variation.cpp0000644000175000017500000001225412076364074021222 0ustar brambram// variation.cpp // this file is part of Context Free // --------------------- // Copyright (C) 2005-2008 Mark Lentczner - markl@glyphic.com // Copyright (C) 2005-2012 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // Mark Lentczner can be contacted at markl@glyphic.com or at // Mark Lentczner, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #include "variation.h" #include #include #include #include "Rand64.h" #ifdef _WIN32 #include #include #endif template static int fromString(T* str) { int value = 0; int offset = 0; int range = 1; while (T c = *str++) { offset += range; value *= 26; if ((T)'A' <= c && c <= (T)'Z') { value += c - (T)'A'; } else if ((T)'a' <= c && c <= (T)'z') { value += c - (T)'a'; } else return -1; range *= 26; } return offset + value; } template static void toString(int var, T* str, bool lowerCase) { int length = 0; int range = 1; while (var >= range) { length += 1; var -= range; range *= 26; } str[length--] = (T)'\0'; while (length >= 0) { T v = (T)(var % 26); var = (var - v) / 26; str[length--] = (T)(lowerCase ? 'a' : 'A') + v; } } int Variation::fromString(const char* str) { return ::fromString(str); } int Variation::fromString(const WinTcharType* str) { return ::fromString(str); } void Variation::toString(int var, char* str, bool lowerCase) { ::toString(var, str, lowerCase); } void Variation::toString(int var, WinTcharType* str, bool lowerCase) { ::toString(var, str, lowerCase); } int Variation::recommendedMin() { return 1; } int Variation::recommendedMax(int letters) { int range = 0; int value = 26; for (int i = 0; i < letters; i++) { range += value; value *= 26; } return range; } int Variation::random(int letters) { static bool seeded = false; if (!seeded) { unsigned long long randomSeed = (unsigned long long)time(0); #ifdef WIN32 HMODULE hLib = LoadLibrary(TEXT("ADVAPI32.DLL")); if (hLib) { BOOLEAN (APIENTRY *pfn)(void*, ULONG) = (BOOLEAN (APIENTRY *)(void*, ULONG))GetProcAddress(hLib, "SystemFunction036"); if (pfn) pfn(&randomSeed, (ULONG)sizeof(randomSeed)); FreeLibrary(hLib); } #else /* [AMS] 2/13/2007 -- Added seeding from /dev/urandom */ std::ifstream urand("/dev/urandom", std::ios::in | std::ios::binary); if (urand.is_open()) { urand.read((char*)(&randomSeed), sizeof(randomSeed)); urand.close(); } #endif Rand64::Common.seed(randomSeed); seeded = true; } int min = recommendedMin(); int max = recommendedMax(letters); for (;;) { unsigned long rnd = Rand64::Common.getUnsigned(); if (rnd + max > rnd) return min + rnd % (max - min + 1); } } #ifdef TEST_MAIN #include using namespace std; int main(int argc, char* argv[]) { cout << "Variation recommended range: " << Variation::recommendedMin() << "," << Variation::recommendedMax() << endl; char buf[100]; while (!cin.bad()) { cin.getline(buf, sizeof(buf)/sizeof(buf[0])); char c = buf[0]; if (c == '.') { int v = Variation::random(); char codeUpper[Variation::maxStringLength]; char codeLower[Variation::maxStringLength]; Variation::toString(v, codeUpper, false); Variation::toString(v, codeLower, true); cout << "random picked " << v << endl; cout << " or >" << codeUpper << "<" << endl; cout << " or >" << codeLower << "<" << endl; } else if ('0' <= c && c <= '9') { int v = atoi(buf); char code[Variation::maxStringLength]; Variation::toString(v, code, false); int v2 = Variation::fromString(code); cout << v << " converted to >" << code << "<" << endl; cout << " which converted back to " << v2 << endl; } else { int v = Variation::fromString(buf); char code[Variation::maxStringLength]; Variation::toString(v, code, false); cout << ">" << buf << "< converted to " << v << endl; cout << " which converted back to >" << code << "<" << endl; } } return 0; } #endif contextfree-3.0.5+dfsg1.orig/src-common/ast.cpp0000644000175000017500000010515212076364074020015 0ustar brambram// ast.cpp // this file is part of Context Free // --------------------- // Copyright (C) 2012-2013 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #define _USE_MATH_DEFINES 1 #include "ast.h" #include "astexpression.h" #include namespace AST { double CFatof(const char* s) { double ret = atof(s); return strchr(s, '%') ? ret / 100.0 : ret; } void addUnique(SymmList& syms, agg::trans_affine& tr) { for (SymmList::iterator it = syms.begin(), eit = syms.end(); it != eit; ++it) { if (*it == tr) return; } syms.push_back(tr); } void processDihedral(SymmList& syms, double order, double x, double y, bool dihedral, double angle, const yy::location& where) { if (order < 1.0) CfdgError::Error(where, "Rotational symmetry order must be one or larger"); agg::trans_affine reg; agg::trans_affine_reflection mirror(angle); reg.translate(-x, -y); int num = (int)order; order = 2.0 * M_PI / order; for (int i = 0; i < num; ++i) { agg::trans_affine tr(reg); if (i) tr.rotate(i * order); agg::trans_affine tr2(tr); tr2 *= mirror; tr.translate(x, y); tr2.translate(x, y); addUnique(syms, tr); if (dihedral) addUnique(syms, tr2); } } // Analyze the symmetry spec accumulated in the data vector and add the // appropriate affine transforms to the SymmList. Avoid adding the identity // transform if it is already present in the SymmList. void processSymmSpec(SymmList& syms, agg::trans_affine& tile, bool tiled, std::vector& data, const yy::location& where) { if (data.empty()) return; AST::FlagTypes t = (AST::FlagTypes)((int)data[0]); bool frieze = (tile.sx != 0.0 || tile.sy != 0.0) && (tile.sx * tile.sy == 0.0); bool rhombic = tiled && ((fabs(tile.shy) <= 0.0000001 && fabs(tile.shx/tile.sx - 0.5) < 0.0000001) || (fabs(tile.shx) <= 0.0000001 && fabs(tile.shy/tile.sy - 0.5) < 0.0000001)); bool rectangular = tiled && tile.shx == 0.0 && tile.shy == 0.0; bool square = rectangular && tile.sx == tile.sy; bool hexagonal = false; bool square45 = false; double size45 = tile.sx; if (rhombic) { double x1 = 1.0, y1 = 0.0; tile.transform(&x1, &y1); double dist10 = sqrt(x1 * x1 + y1 * y1); double x2 = 0.0, y2 = 1.0; tile.transform(&x2, &y2); double dist01 = sqrt(x2 * x2 + y2 * y2); hexagonal = fabs(dist10/dist01 - 1.0) < 0.0000001; square45 = fabs(dist01/dist10 - M_SQRT2) < 0.0000001 || fabs(dist10/dist01 - M_SQRT2) < 0.0000001; size45 = fmin(dist01, dist10); } static const agg::trans_affine_reflection ref45(M_PI_4); static const agg::trans_affine_reflection ref135(-M_PI_4); if (t >= AST::CF_P11G && t <= AST::CF_P2MM && !frieze) CfdgError::Error(where, "Frieze symmetry only works in frieze designs"); if (t >= AST::CF_PM && t <= AST::CF_P6M && !tiled) CfdgError::Error(where, "Wallpaper symmetry only works in tiled designs"); if (t == AST::CF_P2 && !frieze && !tiled) CfdgError::Error(where, "p2 symmetry only works in frieze or tiled designs"); switch (t) { case AST::CF_CYCLIC: { double order, x = 0.0, y = 0.0; switch (data.size()) { case 4: x = data[2]; y = data[3]; case 2: order = data[1]; break; default: CfdgError::Error(where, "Cyclic symmetry requires an order argument and an optional center of rotation"); order = 1.0; // suppress warning, never executed break; // never gets here } processDihedral(syms, order, x, y, false, 0.0, where); break; } case AST::CF_DIHEDRAL: { double order, angle = 0.0, x = 0.0, y = 0.0; switch (data.size()) { case 5: x = data[3]; y = data[4]; case 3: order = data[1]; angle = data[2] * M_PI / 180.0; break; case 4: x = data[2]; y = data[3]; case 2: order = data[1]; break; default: CfdgError::Error(where, "Dihedral symmetry requires an order argument, an optional mirror angle, and an optional center of rotation"); order = 1.0; // suppress warning, never executed break; // never gets here } processDihedral(syms, order, x, y, true, angle, where); break; } case AST::CF_P11G: { double mirrorx = 0.0, mirrory = 0.0; if (data.size() == 2) { if (tile.sx != 0.0) mirrory = data[1]; else mirrorx = data[1]; } else if (data.size() > 2) { CfdgError::Error(where, "p11g symmetry takes no arguments or an optional glide axis position argument"); } agg::trans_affine tr; addUnique(syms, tr); tr.translate(-mirrorx, -mirrory); if (tile.sx != 0.0) tr.flip_y(); else tr.flip_x(); tr.translate(tile.sx * 0.5 + mirrorx, tile.sy * 0.5 + mirrory); addUnique(syms, tr); break; } case AST::CF_P11M: { double mirrorx = 0.0, mirrory = 0.0; if (data.size() == 2) { if (tile.sx != 0.0) mirrory = data[1]; else mirrorx = data[1]; } else if (data.size() > 2) { CfdgError::Error(where, "p11m symmetry takes no arguments or an optional mirror axis position argument"); } agg::trans_affine tr; addUnique(syms, tr); tr.translate(-mirrorx, -mirrory); if (tile.sx != 0.0) tr.flip_y(); else tr.flip_x(); tr.translate(mirrorx, mirrory); addUnique(syms, tr); break; } case AST::CF_P1M1: { double mirrorx = 0.0, mirrory = 0.0; if (data.size() == 2) { if (tile.sx != 0.0) mirrorx = data[1]; else mirrory = data[1]; } else if (data.size() > 2) { CfdgError::Error(where, "p1m1 symmetry takes no arguments or an optional mirror axis position argument"); } agg::trans_affine tr; addUnique(syms, tr); tr.translate(-mirrorx, -mirrory); if (tile.sx != 0.0) tr.flip_x(); else tr.flip_y(); tr.translate(mirrorx, mirrory); addUnique(syms, tr); break; } case AST::CF_P2: { double mirrorx = 0.0, mirrory = 0.0; if (data.size() == 3) { mirrorx = data[1]; mirrory = data[2]; } else if (data.size() != 1) { CfdgError::Error(where, "p2 symmetry takes no arguments or a center of rotation"); } processDihedral(syms, 2.0, mirrorx, mirrory, false, 0.0, where); break; } case AST::CF_P2MG: { double mirrorx = 0.0, mirrory = 0.0; if (data.size() == 3) { mirrorx = data[1]; mirrory = data[2]; } else if (data.size() != 1) { CfdgError::Error(where, "p2mg symmetry takes no arguments or a center of rotation"); } agg::trans_affine tr1; agg::trans_affine_translation tr2(-mirrorx, -mirrory); agg::trans_affine_translation tr3(-mirrorx, -mirrory); agg::trans_affine_translation tr4(-mirrorx, -mirrory); tr2.flip_x(); tr3.flip_x(); tr3.flip_y(); tr4.flip_y(); tr2.translate(tile.sx * 0.5 + mirrorx, tile.sy * 0.5 + mirrory); tr3.translate(mirrorx, mirrory); tr4.translate(tile.sx * 0.5 + mirrorx, tile.sy * 0.5 + mirrory); addUnique(syms, tr1); addUnique(syms, tr2); addUnique(syms, tr3); addUnique(syms, tr4); break; } case AST::CF_P2MM: { double mirrorx = 0.0, mirrory = 0.0; if (data.size() == 3) { mirrorx = data[1]; mirrory = data[2]; } else if (data.size() != 1) { CfdgError::Error(where, "p2mm symmetry takes no arguments or a center of relection"); } processDihedral(syms, 2.0, mirrorx, mirrory, true, 0.0, where); break; } case AST::CF_PM: { if (!rectangular && !square45) { CfdgError::Error(where, "pm symmetry requires rectangular tiling"); } double offset = 0.0; switch (data.size()) { case 2: break; case 3: offset = data[2]; break; default: CfdgError::Error(where, "pm symmetry takes a mirror axis argument and an optional axis position argument"); } agg::trans_affine tr; addUnique(syms, tr); int axis = (int)data[1]; if (rectangular && (axis < 0 || axis > 1)) CfdgError(where, "pm symmetry mirror axis argument must be 0 or 1"); else if (axis < 2 || axis > 3) CfdgError::Error(where, "pm symmetry mirror axis argument must be 2 or 3"); switch (axis) { case 0: // mirror on x axis tr.translate(0, -offset); tr.flip_y(); tr.translate(0, offset); break; case 1: // mirror on y axis tr.translate(-offset, 0); tr.flip_x(); tr.translate(offset, 0); break; case 2: // mirror on x=y axis tr.translate(-offset * M_SQRT1_2, offset * M_SQRT1_2); tr *= ref45; tr.translate( offset * M_SQRT1_2, -offset * M_SQRT1_2); break; case 3: // mirror on x=-y axis tr.translate(-offset * M_SQRT1_2, -offset * M_SQRT1_2); tr *= ref135; tr.translate( offset * M_SQRT1_2, offset * M_SQRT1_2); break; default: CfdgError::Error(where, "pm symmetry mirror axis argument must be 0, 1, 2, or 3"); break; } addUnique(syms, tr); break; } case AST::CF_PG: { if (!rectangular && !square45) { CfdgError::Error(where, "pg symmetry requires rectangular tiling"); } double offset = 0.0; switch (data.size()) { case 2: break; case 3: offset = data[2]; break; default: CfdgError::Error(where, "pg symmetry takes a glide axis argument and an optional axis position argument"); } agg::trans_affine tr; addUnique(syms, tr); int axis = (int)data[1]; if (rectangular && (axis < 0 || axis > 1)) CfdgError(where, "pg symmetry mirror axis argument must be 0 or 1"); else if (axis < 2 || axis > 3) CfdgError::Error(where, "pg symmetry mirror axis argument must be 2 or 3"); switch (axis) { case 0: // mirror on x axis tr.translate(0, -offset); tr.flip_y(); tr.translate(tile.sx * 0.5, offset); break; case 1: // mirror on y axis tr.translate(-offset, 0); tr.flip_x(); tr.translate(offset, tile.sy * 0.5); break; case 2: // mirror on x=y axis tr.translate(-offset * M_SQRT1_2, offset * M_SQRT1_2); tr *= ref45; tr.translate(( offset + size45 * 0.5) * M_SQRT1_2, (-offset + size45 * 0.5) * M_SQRT1_2); break; case 3: // mirror on x=-y axis tr.translate(-offset * M_SQRT1_2, -offset * M_SQRT1_2); tr *= ref135; tr.translate(( offset - size45 * 0.5) * M_SQRT1_2, ( offset + size45 * 0.5) * M_SQRT1_2); break; default: CfdgError::Error(where, "pg symmetry glide axis argument must be 0, 1, 2, or 3"); break; } addUnique(syms, tr); break; } case AST::CF_CM: { if (!rhombic && !square) { CfdgError::Error(where, "cm symmetry requires diamond tiling"); } double offset = 0.0; switch (data.size()) { case 2: break; case 3: offset = data[2]; break; default: CfdgError::Error(where, "cm symmetry takes a mirror axis argument and an optional axis position argument"); } agg::trans_affine tr; addUnique(syms, tr); int axis = (int)data[1]; if (rectangular && (axis < 0 || axis > 1)) CfdgError(where, "cm symmetry mirror axis argument must be 0 or 1"); else if (axis < 2 || axis > 3) CfdgError::Error(where, "cm symmetry mirror axis argument must be 2 or 3"); switch (axis) { case 0: // mirror on x axis tr.translate(0, -offset); tr.flip_y(); tr.translate(0, offset); break; case 1: // mirror on y axis tr.translate(-offset, 0); tr.flip_x(); tr.translate(offset, 0); break; case 2: // mirror on x=y axis tr.translate( offset * M_SQRT1_2, -offset * M_SQRT1_2); tr *= ref45; tr.translate(-offset * M_SQRT1_2, offset * M_SQRT1_2); break; case 3: // mirror on x=-y axis tr.translate(-offset * M_SQRT1_2, -offset * M_SQRT1_2); tr *= ref135; tr.translate( offset * M_SQRT1_2, offset * M_SQRT1_2); break; default: CfdgError::Error(where, "cm symmetry mirror axis argument must be 0, 1, 2, or 3"); break; } addUnique(syms, tr); break; } case AST::CF_PMM: { if (!rectangular && !square45) { CfdgError::Error(where, "pmm symmetry requires rectangular tiling"); } double centerx = 0.0, centery = 0.0; switch (data.size()) { case 1: break; case 3: centerx = data[1]; centery = data[2]; break; default: CfdgError::Error(where, "pmm symmetry takes no arguments or a center of reflection"); } processDihedral(syms, 2.0, centerx, centery, true, square45 ? M_PI_4 : 0.0, where); break; } case AST::CF_PMG: { if (!rectangular && !square45) { CfdgError::Error(where, "pmg symmetry requires rectangular tiling"); } double centerx = 0.0, centery = 0.0; switch (data.size()) { case 2: break; case 4: centerx = data[2]; centery = data[3]; break; default: CfdgError::Error(where, "pmg symmetry takes a mirror axis argument and an optional center of reflection"); } agg::trans_affine tr, tr2; int axis = (int)data[1]; if (rectangular && (axis < 0 || axis > 1)) CfdgError(where, "pmg symmetry mirror axis argument must be 0 or 1"); else if (axis < 2 || axis > 3) CfdgError::Error(where, "pmg symmetry mirror axis argument must be 2 or 3"); switch (axis) { case 0: { // mirror on x axis double cy = fabs(centery + 0.25 * tile.sy) < fabs(centery - 0.25 * tile.sy) ? centery + 0.25 * tile.sy : centery - 0.25 * tile.sy; processDihedral(syms, 2.0, centerx, cy, false, 0.0, where); agg::trans_affine tr, tr2; tr.translate(-centerx, 0.0); tr.flip_x(); tr.translate(centerx, 0.5 * tile.sy); addUnique(syms, tr); tr2.translate(0.0, -centery); tr2.flip_y(); tr2.translate(0.0, centery); addUnique(syms, tr2); break; } case 1: { // mirror on y axis double cx = fabs(centerx + 0.25 * tile.sx) < fabs(centerx - 0.25 * tile.sx) ? centerx + 0.25 * tile.sx : centerx - 0.25 * tile.sx; processDihedral(syms, 2.0, cx, centery, false, 0.0, where); agg::trans_affine tr, tr2; tr.translate(-centerx, 0.0); tr.flip_x(); tr.translate(centerx, 0.0); addUnique(syms, tr); tr2.translate(0.0, -centery); tr2.flip_y(); tr2.translate(0.5 * tile.sx, centery); addUnique(syms, tr2); break; } case 2: { // mirror on x=y axis double cx = centerx - 0.25 * M_SQRT1_2 * size45; double cy = centery + 0.25 * M_SQRT1_2 * size45; double cx2 = centerx + 0.25 * M_SQRT1_2 * size45; double cy2 = centery - 0.25 * M_SQRT1_2 * size45; if (cx2 * cx2 + cy2 * cy2 < cx * cx + cy * cy) { cx = cx2; cy = cy2; } processDihedral(syms, 2.0, cx, cy, false, 0.0, where); agg::trans_affine tr, tr2; tr.translate(-centerx, -centery); // mirror on x=y tr *= ref45; tr.translate( centerx, centery); addUnique(syms, tr); tr2.translate(-centerx, -centery); // glide on x=-y tr2 *= ref135; tr2.translate(centerx - size45 * M_SQRT1_2 * 0.5, centery + size45 * M_SQRT1_2 * 0.5); addUnique(syms, tr2); break; } case 3: { // mirror on x=-y axis double cx = centerx + 0.25 * M_SQRT1_2 * size45; double cy = centery + 0.25 * M_SQRT1_2 * size45; double cx2 = centerx - 0.25 * M_SQRT1_2 * size45; double cy2 = centery - 0.25 * M_SQRT1_2 * size45; if (cx2 * cx2 + cy2 * cy2 < cx * cx + cy * cy) { cx = cx2; cy = cy2; } processDihedral(syms, 2.0, cx, cy, false, 0.0, where); agg::trans_affine tr, tr2; tr.translate(-centerx, -centery); // mirror on x=-y tr *= ref135; tr.translate( centerx, centery); addUnique(syms, tr); tr2.translate(-centerx, -centery); // glide on x=y tr2 *= ref45; tr2.translate(centerx + size45 * M_SQRT1_2 * 0.5, centery + size45 * M_SQRT1_2 * 0.5); addUnique(syms, tr2); break; } default: CfdgError::Error(where, "pmg symmetry mirror axis argument must be 0, 1, 2, or 3"); break; } break; } case AST::CF_PGG: { if (!rectangular && !square45) { CfdgError::Error(where, "pgg symmetry requires rectangular tiling"); } double centerx = 0.0, centery = 0.0; switch (data.size()) { case 1: break; case 3: centerx = data[1]; centery = data[2]; break; default: CfdgError::Error(where, "pgg symmetry takes no arguments or a center of glide axis intersection"); } if (square45) { double cx = centerx + 0.25 * M_SQRT2 * size45; double cy = centery; double cx2 = centerx - 0.25 * M_SQRT2 * size45; double cy2 = centery; if (cx2*cx2 + cy2*cy2 < cx*cx + cy*cy) { cx = cx2; cy = cy2; } cx2 = centerx; cy2 = centery + 0.25 * M_SQRT2 * size45; if (cx2*cx2 + cy2*cy2 < cx*cx + cy*cy) { cx = cx2; cy = cy2; } cx2 = centerx; cy2 = centery - 0.25 * M_SQRT2 * size45; if (cx2*cx2 + cy2*cy2 < cx*cx + cy*cy) { cx = cx2; cy = cy2; } processDihedral(syms, 2.0, cx, cy, false, 0.0, where); agg::trans_affine tr, tr2; tr.translate(-centerx, -centery); // glide on x=y tr *= ref45; tr.translate(centerx + size45 * M_SQRT1_2 * 0.5, centery + size45 * M_SQRT1_2 * 0.5); addUnique(syms, tr); tr2.translate(-centerx, -centery); // glide on x=-y tr2 *= ref135; tr2.translate(centerx - size45 * M_SQRT1_2 * 0.5, centery + size45 * M_SQRT1_2 * 0.5); addUnique(syms, tr2); break; } double cx = fabs(centerx + 0.25 * tile.sx) < fabs(centerx - 0.25 * tile.sx) ? centerx + 0.25 * tile.sx : centerx - 0.25 * tile.sx; double cy = fabs(centery + 0.25 * tile.sy) < fabs(centery - 0.25 * tile.sy) ? centery + 0.25 * tile.sy : centery - 0.25 * tile.sy; processDihedral(syms, 2.0, cx, cy, false, 0.0, where); agg::trans_affine tr, tr2; tr.translate(-centerx, 0.0); tr.flip_x(); tr.translate(centerx, 0.5 * tile.sy); addUnique(syms, tr); tr2.translate(0.0, -centery); tr2.flip_y(); tr2.translate(0.5 * tile.sx, centery); addUnique(syms, tr2); break; } case AST::CF_CMM: { if (!rhombic && !square) { CfdgError::Error(where, "cmm symmetry requires diamond tiling"); } double centerx = 0.0, centery = 0.0; switch (data.size()) { case 1: break; case 3: centerx = data[1]; centery = data[2]; break; default: CfdgError::Error(where, "cmm symmetry takes no arguments or a center of reflection"); } processDihedral(syms, 2.0, centerx, centery, true, square45 ? M_PI_4 : 0.0, where); break; } case AST::CF_P4: case AST::CF_P4M: { if (!square && !square45) { CfdgError::Error(where, "p4 & p4m symmetry requires square tiling"); } double x = 0.0, y = 0.0; switch (data.size()) { case 1: break; case 3: x = data[1]; y = data[2]; break; default: CfdgError::Error(where, "p4 & p4m symmetry takes no arguments or a center of rotation"); } processDihedral(syms, 4.0, x, y, t == AST::CF_P4M, square ? M_PI_4 : 0.0, where); break; } case AST::CF_P4G: { if (!square && !square45) { CfdgError::Error(where, "p4g symmetry requires square tiling"); } double centerx = 0.0, centery = 0.0; switch (data.size()) { case 1: break; case 3: centerx = data[1]; centery = data[2]; break; default: CfdgError::Error(where, "p4g symmetry takes no arguments or a center of rotation"); } agg::trans_affine reg; reg.translate(-centerx, -centery); agg::trans_affine glide(reg); if (square45) { glide.translate(-size45 * 0.25 * M_SQRT1_2, -size45 * 0.25 * M_SQRT1_2); glide *= ref135; glide.translate(-size45 * 0.25 * M_SQRT1_2, size45 * 0.75 * M_SQRT1_2); } else { glide.translate(tile.sx * 0.25, 0.0); glide.flip_x(); glide.translate(-tile.sx * 0.25, tile.sy * 0.5); } for (int i = 0; i < 4; ++i) { agg::trans_affine tr(reg), tr2(glide); if (i) { tr.rotate(i * M_PI_2); tr2.rotate(i * M_PI_2); } tr.translate(centerx, centery); tr2.translate(centerx, centery); addUnique(syms, tr); addUnique(syms, tr2); } break; } case AST::CF_P3: { if (!hexagonal) { CfdgError::Error(where, "p3 symmetry requires hexagonal tiling"); } double x = 0.0, y = 0.0; switch (data.size()) { case 1: break; case 3: x = data[1]; y = data[2]; break; default: CfdgError::Error(where, "p3 symmetry takes no arguments or a center of rotation"); } processDihedral(syms, 3.0, x, y, false, 0.0, where); break; } case AST::CF_P3M1: case AST::CF_P31M: { if (!hexagonal) { CfdgError::Error(where, "p3m1 & p31m symmetry requires hexagonal tiling"); } double x = 0.0, y = 0.0; switch (data.size()) { case 1: break; case 3: x = data[1]; y = data[2]; break; default: CfdgError::Error(where, "p3m1 & p31m symmetry takes no arguments or a center of rotation"); } bool deg30 = (fabs(tile.shx) <= 0.000001) != (t == AST::CF_P3M1); double angle = M_PI / (deg30 ? 6.0 : 3.0); processDihedral(syms, 3.0, x, y, true, angle, where); break; } case AST::CF_P6: case AST::CF_P6M: { if (!hexagonal) { CfdgError::Error(where, "p6 & p6m symmetry requires hexagonal tiling"); } double x = 0.0, y = 0.0; switch (data.size()) { case 1: break; case 3: x = data[1]; y = data[2]; break; default: CfdgError::Error(where, "p6 & p6m symmetry takes no arguments or a center of rotation"); } processDihedral(syms, 6.0, x, y, t == AST::CF_P6M, 0.0, where); break; } default: CfdgError::Error(where, "Unknown symmetry type"); break; // never gets here } data.clear(); } const ASTexpression* getTransforms(const ASTexpression* e, SymmList& syms, Renderer* r, bool tiled, agg::trans_affine& tile) { syms.clear(); if (e == NULL) return NULL; ASTexpression* ret = 0; std::vector symmSpec; yy::location where; for (int i = 0; i < e->size(); ++i) { const ASTexpression* cit = (*e)[i]; switch (cit->mType) { case ASTexpression::FlagType: processSymmSpec(syms, tile, tiled, symmSpec, where); where = cit->where; case ASTexpression::NumericType: { if (symmSpec.empty() && cit->mType != ASTexpression::FlagType) CfdgError::Error(cit->where, "Symmetry flag expected here"); int sz = cit->evaluate(0, 0); if (sz < 1) { CfdgError::Error(cit->where, "Could not evaluate this"); } else { size_t oldsize = symmSpec.size(); symmSpec.resize(oldsize + sz); if (cit->evaluate(&(symmSpec[oldsize]), sz, r) != sz) CfdgError::Error(cit->where, "Could not evaluate this"); } where = where + cit->where; break; } case ASTexpression::ModType: { processSymmSpec(syms, tile, tiled, symmSpec, where); const ASTmodification* m = dynamic_cast(&*cit); if ((!r && !cit->isConstant) || !m || (m->modClass & (ASTmodification::GeomClass | ASTmodification::PathOpClass)) != m->modClass) { // const_cast is a little sleazy, but we never never modify // it and we return it as const ret = ASTexpression::Append(ret, const_cast(cit)); } else { Modification mod; int dummy; cit->evaluate(mod, 0, 0, false, dummy, false, r); addUnique(syms, mod.m_transform); } break; } default: CfdgError::Error(cit->where, "Wrong type"); break; } } processSymmSpec(syms, tile, tiled, symmSpec, where); return ret; } } contextfree-3.0.5+dfsg1.orig/src-common/tempfile.h0000644000175000017500000000327712076364074020505 0ustar brambram// tempfile.h // this file is part of Context Free // --------------------- // Copyright (C) 2006-2008 Mark Lentczner - markl@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // Mark Lentczner can be contacted at markl@glyphic.com or at // Mark Lentczner, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #ifndef INCLUDE_TEMPFILE_H #define INCLUDE_TEMPFILE_H #include "cfdg.h" #include "countable.h" class TempFile : protected Countable { public: static ref_ptr build(AbstractSystem*, const char* prefix, const char* type, int num); std::ostream* forWrite(); std::istream* forRead(); std::string type() { return mType; } int number() { return mNum; } protected: TempFile(AbstractSystem*, const char* prefix, const char* type, int num); virtual ~TempFile(); private: friend class ref_ptr; AbstractSystem* mSystem; std::string mPath; std::string mType; int mNum; bool mWritten; }; #endif // INCLUDE_TEMPFILE_H contextfree-3.0.5+dfsg1.orig/src-common/Rand64.cpp0000644000175000017500000000367012076364074020266 0ustar brambram// Rand64.cpp // this file is part of Context Free // --------------------- // Copyright (C) 2008-2012 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #include "Rand64.h" #include #include Rand64 Rand64::Common; double Rand64::getDouble(bool doBump) { if (doBump) bump(); return ldexp((double) (mSeed & 0xffffffffffffULL), -48); } long Rand64::getLong(bool doBump) { if (doBump) bump(); return (long) (mSeed & ULONG_MAX); } long Rand64::getPositive(bool doBump) { if (doBump) bump(); return (long) (mSeed & LONG_MAX); } unsigned long Rand64::getUnsigned(bool doBump) { if (doBump) bump(); return (unsigned long) (mSeed & ULONG_MAX); } void Rand64::seed(uint64_t seed) { mSeed = seed; } void Rand64::init() { mSeed = RAND64_SEED; } void Rand64::xorChar(unsigned char c, unsigned i) { mSeed ^= ((uint64_t)c) << (i * 8); } void Rand64::xorString(const char* t, int& i) { for (; *t; ++t) { xorChar((unsigned char)(*t), (unsigned)i); bump(); i = (i + 1) & 7; } } void Rand64::bump() { mSeed = mSeed * RAND64_MULT + RAND64_ADD; } contextfree-3.0.5+dfsg1.orig/src-common/astexpression.cpp0000644000175000017500000026663512076364074022153 0ustar brambram// astexpression.cpp // this file is part of Context Free // --------------------- // Copyright (C) 2009-2013 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #include "astexpression.h" #include "builder.h" #include #include #include namespace AST { // Make sure that this stays in sync with the FuncType enum! const char* ASTfunction::FuncNames[ASTfunction::LastOne] = { "cos", "sin", "tan", "cot", "acos", "asin", "atan", "acot", "cosh", "sinh", "tanh", "acosh", "asinh", "atanh", "log", "log10", "sqrt", "exp", "abs", "floor", "infinity", "factorial", "sg", "isNatural", "bitnot", "bitor", "bitand", "bitxor", "bitleft", "bitright", "atan2", "mod", "divides", "div", "min", "max", "ftime", "frame", "rand_static", "rand", "rand+/-", "randint" }; int ASTmodification::ModClass[ASTmodTerm::lastModType] = { ASTmodification::NotAClass, // unknown ASTmodification::GeomClass | ASTmodification::PathOpClass, // x ASTmodification::GeomClass | ASTmodification::PathOpClass, // y ASTmodification::ZClass, // z ASTmodification::GeomClass | ASTmodification::ZClass, // xyz ASTmodification::GeomClass, // transform ASTmodification::GeomClass, // size ASTmodification::GeomClass | ASTmodification::ZClass, // sizexyz ASTmodification::GeomClass | ASTmodification::PathOpClass, // rot ASTmodification::GeomClass, // skew ASTmodification::GeomClass, ASTmodification::ZClass, // flip, zsize ASTmodification::NotAClass, // Entropy ASTmodification::HueClass, ASTmodification::SatClass, // hue, ... ASTmodification::BrightClass, ASTmodification::AlphaClass, ASTmodification::HueClass, ASTmodification::SatClass, // hue|, ... ASTmodification::BrightClass, ASTmodification::AlphaClass, ASTmodification::HueTargetClass, ASTmodification::SatTargetClass, // |hue, ... ASTmodification::BrightTargetClass, ASTmodification::AlphaTargetClass, ASTmodification::TimeClass, ASTmodification::TimeClass, // time, timescale ASTmodification::StrokeClass, ASTmodification::ParamClass, // stroke, param ASTmodification::PathOpClass, ASTmodification::PathOpClass, // x1, y1 ASTmodification::PathOpClass, ASTmodification::PathOpClass, // x2, y2 ASTmodification::PathOpClass, ASTmodification::PathOpClass, // xrad, yrad -1 // modification }; // These random strings are courtesy of http://www.fourmilab.ch/hotbits/ const char* ASTmodTerm::Entropies[ASTmodTerm::lastModType] = { "", // unknown "\x95\xE7\x48\x5E\xCC\x06", // x "\x84\x2B\xF3\xBB\x93\x59", // y "\xC8\x3A\x12\x32\x36\x71", // z "\x6C\x31\xCA\xBF\x8D\x89", // xyz "\x88\x90\x54\xC5\xD3\x20", // transform "\x64\xEC\x5B\x4B\xEE\x2B", // size "\xB0\x31\xD5\x1E\x7A\x5A", // sizexyz "\x84\xB0\x92\x26\x59\xE2", // rot "\xFF\x2D\x84\x01\xA0\x0A", // skew "\x43\x5A\x17\xEA\x12\x05", "\x64\xEC\x5B\x4B\xEE\x2B", // flip, zsize "", // Entropy "\x02\xDE\x2B\x2C\x25\xA1", "\x18\x4F\xCF\x04\x3F\xE5", // hue, ... "\x1F\x3F\xEB\xA2\xA2\x7E", "\xB4\xFF\x9E\x45\xEE\x7E", "\xAF\xE5\x58\x33\x20\xF8", "\x98\x80\xED\x44\x2F\xF2", // hue|, ... "\x68\xD6\xCB\x8A\x96\x20", "\x24\x4C\xCC\x41\x09\xC7", "\xDB\x3F\xA1\xDA\xE7\x45", "\xDA\x75\x13\xD3\x30\xEA", // |hue, ... "\x8F\x01\x2B\x75\xC3\x25", "\xE7\xCD\x5E\xE3\x88\xF4", "\x20\xC6\xE8\x02\xED\x27", "\x78\x8E\xC8\x2C\x1C\x96", // time, timescale "", "", // stroke, param "", "", // x1, y1 "", "", // x2, y2 "", "", // xrad, yrad "\x88\x90\x54\xC5\xD3\x20" // modification }; const char* ASTfunction::Entropies[ASTfunction::LastOne] = { "\xA1\xE7\x9C\x1A\xAF\x7D", // Cos "\xAF\x58\xFE\x2C\xD4\x53", // Sin "\x95\xFF\x59\x11\x03\x02", // Tan "\x77\xF5\xB6\x35\x8C\xF0", // Cot "\x3A\xCD\x79\x3E\xAD\xB4", // Acos "\x1D\x75\x0B\xBC\x5F\x52", // Asin "\x0B\xC8\x89\xAB\xF8\xB7", // Atan "\x69\x7C\xC7\x1A\xF6\x7B", // Acot "\x48\x43\x43\x35\x62\x81", // Cosh "\x51\x62\xFB\x76\xED\x9C", // Sinh "\xBB\x91\x54\xA9\x63\x84", // Tanh "\x4F\x28\x48\x20\xB7\x5C", // Acosh "\x6C\x9B\x32\xAA\x4C\xD0", // Asinh "\x58\xEC\xBB\x25\xF8\xB6", // Atanh "\x8E\xB8\x62\xA1\x75\x0F", // Log "\x4A\x6C\xA3\x02\x8B\x80", // Log10 "\x86\x7C\xFC\x20\xCB\x97", // Sqrt "\x88\xA8\x65\xF0\xC1\x06", // Exp "\x41\x89\x18\xD1\xAD\x82", // Abs "\xB7\x28\xD7\xD7\xA3\xCC", // Floor "\x2C\x28\x50\xCC\xDE\x44", // Infinity "\x19\xD7\x83\x29\x47\x99", // Factorial "\xB7\x05\x28\xBA\xCD\x2E", // Sg "\x49\xD6\xF8\x5B\x45\x59", // IsNatural "\x79\x19\x1A\x9F\x4D\xA0", // BitNot "\xF2\x77\xAB\x5C\x33\x43", // BitOr "\xC3\x56\x9E\x75\xE0\x44", // BitAnd "\xBB\xFA\x2B\xD2\x91\x55", // BitXOR "\x91\x47\xE5\xE5\x0D\xAA", // BitLeft "\xF1\xAB\x17\x00\xFA\xA5", // BitRight "\x99\x1B\xC9\xE0\x3F\xA4", // Atan2 "\x78\x8E\xC8\x2C\x1C\x96", // Divides "\x64\xEC\x5B\x4B\xEE\x2B", // Div "\x0F\xE3\xFE\x5F\xBF\xBF", // Mod "\xA2\x42\xA3\x49\xB1\x19", // Min "\xD3\x55\x5C\x0D\xD8\x51", // Max "\x4F\xBE\xA1\x06\x80\x06", // Ftime "\x90\x70\x6A\xBB\xBA\xB0", // Frame "\xC8\xF7\xE5\x3E\x05\xA3", // Rand_Static "\xDA\x18\x5B\xE2\xDB\x79", // Rand "\xDC\x8D\x09\x15\x8A\xC4", // Rand2 "\x48\x14\x4E\x27\x35\x2E" // RandInt }; ASTruleSpecifier ASTruleSpecifier::Zero; static const StackType StackZero = {0}; bool ASTparameter::Impure = false; void ASTparameter::init(int nameIndex, ASTdefine* def) { mType = def->mType; isLocal = !def->mExpression || def->mExpression->isLocal; mTuplesize = def->mTuplesize; if (mType == ASTexpression::NumericType) { isNatural = def->mExpression && def->mExpression->isNatural && mTuplesize == 1; if (mTuplesize == 0) mTuplesize = 1; // loop index if (mTuplesize < 1 || mTuplesize > 9) CfdgError::Error(mLocation, "Illegal vector size (<1 or >9)"); } mName = nameIndex; mDefinition = (def->isConstant || def->isFunction) ? def : 0; } void ASTparameter::init(const std::string& typeName, int nameIndex) { isLocal = false; if (typeName == "number") { mType = ASTexpression::NumericType; } else if (typeName == "natural") { mType = ASTexpression::NumericType; isNatural = true; } else if (typeName == "adjustment") { mTuplesize = ModificationSize; mType = ASTexpression::ModType; } else if (typeName == "shape") { mType = ASTexpression::RuleType; mTuplesize = 1; } else if (strncmp(typeName.data(), "vector", 6) == 0 && typeName.length() == 7 && isdigit(typeName[6])) { mType = ASTexpression::NumericType; mTuplesize = typeName[6] - '0'; if (mTuplesize < 1 || mTuplesize > 9) CfdgError::Error(mLocation, "Illegal vector size (<1 or >9)"); } else mType = ASTexpression::NoType; mName = nameIndex; mDefinition = 0; } void ASTparameter::check(const yy::location& typeLoc, const yy::location& nameLoc) { if (mType == ASTexpression::NoType) CfdgError::Error(typeLoc, "Unknown parameter type"); if (mName == -1) CfdgError::Error(nameLoc, "Reserved keyword used for parameter name"); } bool ASTparameter::operator!=(const ASTparameter& p) const { if (mType != p.mType) return true; if (mType == ASTexpression::NumericType && mTuplesize != p.mTuplesize) return true; return false; } bool ASTparameter::operator!=(const ASTexpression& e) const { if (mType != e.mType) return true; if (mType == ASTexpression::NumericType && mTuplesize != e.evaluate(0, 0)) return true; return false; } int ASTparameter::CheckType(const ASTparameters* types, const ASTparameters* parent, const ASTexpression* args, const yy::location& where, bool checkNumber) { // Walks down the right edge of an expression tree checking that the types // of the children match the specified argument types if ((types == NULL || types->empty()) && (args == NULL)) return 0; if (types == NULL && args && Builder::CurrentBuilder->mCompilePhase == 1) { Builder::CurrentBuilder->mWant2ndPass = true; return -1; } if (types == NULL || types->empty()) { CfdgError::Error(args->where, "Arguments are not expected."); return -1; } if (args == NULL) { CfdgError::Error(where, "Arguments are expected."); return -1; } bool justCount = args->mType == ASTexpression::NoType; int count = 0, size = 0; int expect = args->size(); ASTparameters::const_iterator param_it = types->begin(), param_end = types->end(); for (; param_it != param_end; size += param_it->mTuplesize, ++count, ++param_it) { if (justCount) continue; if (count >= expect) { CfdgError::Error(args->where, "Not enough arguments"); return -1; } const ASTexpression* arg = (*args)[count]; assert(arg); if (param_it->mType != arg->mType) { CfdgError::Error(arg->where, "Incorrect argument type."); CfdgError::Error(param_it->mLocation, "This is the expected type."); return -1; } if (param_it->isNatural && !arg->isNatural && !ASTparameter::Impure) { CfdgError::Error(arg->where, "this expression does not satisfy the natural number requirement"); return -1; } if (param_it->mType == ASTexpression::NumericType && param_it->mTuplesize != arg->evaluate(0, 0)) { if (param_it->mTuplesize == 1) CfdgError::Error(arg->where, "This argument should be scalar"); else CfdgError::Error(arg->where, "This argument should be a vector"); CfdgError::Error(param_it->mLocation, "This is the expected type."); return -1; } if (!arg->isLocal && param_it->mType == ASTexpression::NumericType && !param_it->isNatural && !ASTparameter::Impure && checkNumber) { // Unwrap any parentheses and check if the non-local expression // is actually an unmodified parameter. If so then accept it. while (const ASTparen* p = dynamic_cast (arg)) arg = p->e; assert(arg); const ASTvariable* v = dynamic_cast (arg); if (!v || !v->isParameter) { CfdgError::Error(arg->where, "This expression does not satisfy the number parameter requirement"); return -1; } } } if (count < expect) { CfdgError::Error((*args)[count]->where, "Too many arguments."); return -1; } if (justCount && types != parent) { if (parent == NULL) { CfdgError::Error(where, "Parameter reuse not allowed in this context."); return -1; } param_it = types->begin(); ASTparameters::const_iterator parent_it = parent->begin(); while (param_it != types->end()) { if (parent_it == parent->end() || *param_it != *parent_it) { CfdgError::Error(where, "Parameter reuse only allowed when type signature is identical."); return -1; } ++param_it; ++parent_it; } } return size; } ASTfunction::ASTfunction(const std::string& func, exp_ptr args, Rand64& r, const yy::location& nameLoc, const yy::location& argsLoc) : ASTexpression(nameLoc + argsLoc, true, false, NumericType), functype(NotAFunction), arguments(NULL) { if (&func == 0 || func.empty()) { CfdgError::Error(nameLoc, "bad function call"); return; } isConstant = args.get() ? args->isConstant : true; isLocal = args.get() ? args->isLocal : true; int argcount = args.get() ? args->evaluate(0, 0) : 0; functype = GetFuncType(func); if (functype == NotAFunction) { CfdgError::Error(nameLoc, "Unknown function"); return; } if (functype == ASTfunction::Infinity && argcount == 0) { arguments = new ASTreal(1.0, argsLoc); return; } if (functype == Ftime) { if (args.get()) CfdgError::Error(argsLoc, "ftime() function takes no arguments"); isConstant = false; isLocal = true; arguments = new ASTreal(1.0, argsLoc); return; } if (functype == Frame) { if (args.get()) CfdgError::Error(argsLoc, "frame() functions takes no arguments"); isConstant = false; isLocal = false; arguments = new ASTreal(1.0, argsLoc); return; } if (functype >= Rand_Static && functype <= RandInt) { if (functype == Rand_Static) { random = r.getDouble(); } else { isConstant = false; } switch (argcount) { case 0: args.reset(new ASTcons(new ASTreal(0.0, argsLoc), new ASTreal(functype == RandInt ? 2.0 : 1.0, argsLoc))); break; case 1: args.reset(new ASTcons(new ASTreal(0.0, argsLoc), args.release())); break; case 2: break; default: CfdgError::Error(argsLoc, "Illegal argument(s) for random function"); break; } if (!isConstant && functype == Rand_Static) { CfdgError::Error(argsLoc, "Argument(s) for rand_static() must be constant"); } arguments = args.release(); if (functype == RandInt) isNatural = arguments->isNatural; return; } if (functype == Abs) { if (argcount < 1 || argcount > 2) { CfdgError::Error(argsLoc, "function takes one or two arguments"); } } else if (functype < BitOr) { if (argcount != 1) { CfdgError::Error(argsLoc, functype == ASTfunction::Infinity ? "function takes zero or one arguments" : "function takes one argument"); } } else if (functype < Min) { if (argcount != 2) { CfdgError::Error(argsLoc, "function takes two arguments"); } } else { if (argcount < 2) { CfdgError::Error(argsLoc, "function takes at least two arguments"); } } arguments = args.release(); if (functype == Mod || functype == Abs || functype == Min || functype == Max || (functype >= BitNot && functype <= BitRight)) { isNatural = arguments->isNatural; } if (functype == Factorial || functype == Sg || functype == IsNatural || functype == Div || functype == Divides) { if (!arguments->isNatural) CfdgError::Error(arguments->where, "function is defined over natural numbers only"); isNatural = true; } } ASTfunction::FuncType ASTfunction::GetFuncType(const std::string& func) { for (int i = 0; i < LastOne; ++i) if (func.compare(FuncNames[i]) == 0) { return (FuncType)i; } return NotAFunction; } ASTruleSpecifier::ASTruleSpecifier(int t, const std::string& name, exp_ptr args, const yy::location& loc, const ASTparameters* types, const ASTparameters* parent) : ASTexpression(loc, args.get() == NULL || args->isConstant, false, RuleType), shapeType(t), entropyVal(name), argSource(DynamicArgs), arguments(args.release()), simpleRule(0), mStackIndex(0), typeSignature(types) { if (types && types->empty()) { types = NULL; typeSignature = NULL; } if (parent && parent->empty()) parent = NULL; argSize = ASTparameter::CheckType(types, parent, arguments, loc, true); if (argSize < 0) { argSource = NoArgs; return; } if (arguments && arguments->mType != ASTexpression::NoType) { arguments->entropy(entropyVal); if (arguments->isConstant) { const StackType* simp = evalArgs(); simp[0].ruleHeader.mRefCount = StackRule::MaxRefCount; simpleRule = simp; argSource = SimpleArgs; } } else if (arguments && arguments->mType == ASTexpression::NoType) { argSource = ParentArgs; } else { argSource = NoArgs; simpleRule = StackType::alloc(shapeType, 0, types); simpleRule[0].ruleHeader.mRefCount = StackRule::MaxRefCount; } } ASTruleSpecifier::ASTruleSpecifier(const std::string& name, const yy::location& loc, int stackIndex) : ASTexpression(loc, false, false, RuleType), shapeType(0), argSize(0), entropyVal(name), argSource(StackArgs), arguments(0), simpleRule(0), mStackIndex(stackIndex), typeSignature(0) { } ASTruleSpecifier::ASTruleSpecifier(const ASTruleSpecifier* r, const std::string& name, const yy::location& loc) : ASTexpression(loc, false, false, RuleType), shapeType(r->shapeType), argSize(r->argSize), entropyVal(name), argSource(NoArgs), arguments(0), simpleRule(0), mStackIndex(0), typeSignature(r->typeSignature) { if (r->argSource == SimpleArgs) { StackType* simp = StackType::alloc(shapeType, argSize, 0); simp[0].ruleHeader.mRefCount = StackRule::MaxRefCount; argSource = SimpleArgs; simpleRule = simp; if (argSize) for (int i = 1; i < argSize + 2; ++i) simp[i] = r->simpleRule[i]; return; } assert(r->argSource == NoArgs || Builder::CurrentBuilder->mWant2ndPass); // only duplicate constant rule specs } ASTruleSpecifier::ASTruleSpecifier(ASTruleSpecifier& r) : ASTexpression(r.where, r.isConstant, false, r.mType), shapeType(r.shapeType), argSize(r.argSize), entropyVal(r.entropyVal), argSource(r.argSource), arguments(r.arguments), simpleRule(r.simpleRule), mStackIndex(r.mStackIndex), typeSignature(r.typeSignature) { r.arguments = NULL; // move semantics r.simpleRule = NULL; } ASTruleSpecifier::ASTruleSpecifier(exp_ptr args, const yy::location& loc) : ASTexpression(loc, false, false, RuleType), shapeType(-1), argSize(0), argSource(ShapeArgs), arguments(args.release()), simpleRule(0), mStackIndex(0), typeSignature(0) { assert(arguments); } const StackType* ASTruleSpecifier::evalArgs(Renderer* rti, const StackType* parent) const { switch (argSource) { case NoArgs: case SimpleArgs: return simpleRule; case StackArgs: { const StackType* stackItem = (mStackIndex < 0) ? rti->mLogicalStackTop + mStackIndex : &(rti->mCFstack[mStackIndex]); stackItem->rule->retain(rti); return stackItem->rule; } case ParentArgs: assert(parent); assert(rti); if (shapeType != parent->ruleHeader.mRuleName) { // Child shape is different from parent, even though parameters are reused, // and we can't finesse it in ASTreplacement::traverse(). Just // copy the parameters with the correct shape type. StackType* ret = StackType::alloc(shapeType, argSize, typeSignature); if (argSize) for (int i = 1; i < argSize + 2; ++i) ret[i] = parent[i]; return ret; } case SimpleParentArgs: assert(parent); assert(rti); parent->retain(rti); return parent; case DynamicArgs: { StackType* ret = StackType::alloc(shapeType, argSize, typeSignature); ret->evalArgs(rti, arguments, parent); return ret; } case ShapeArgs: return arguments->evalArgs(rti, parent); default: assert(false); return NULL; } } const StackType* ASTparen::evalArgs(Renderer* rti, const StackType* parent) const { if (mType != RuleType) { CfdgError::Error(where, "Evaluation of a non-shape expression in a shape context"); return NULL; } return e->evalArgs(rti, parent); } const StackType* ASTselect::evalArgs(Renderer* rti, const StackType* parent) const { if (mType != RuleType) { CfdgError::Error(where, "Evaluation of a non-shape select() in a shape context"); return NULL; } return (*arguments)[getIndex(rti)]->evalArgs(rti, parent); } const StackType* ASTuserFunction::evalArgs(Renderer* rti, const StackType* parent) const { if (mType != RuleType) { CfdgError::Error(where, "Function does not evaluate to a shape"); return NULL; } if (!rti) throw DeferUntilRuntime(); if (rti->requestStop || Renderer::AbortEverything) throw CfdgError(where, "Stopping"); const StackType* ret = NULL; if (definition->mStackCount) { size_t size = rti->mCFstack.size(); if (size + definition->mStackCount > rti->mCFstack.capacity()) CfdgError::Error(where, "Maximum stack size exceeded"); const StackType* oldLogicalStackTop = rti->mLogicalStackTop; rti->mCFstack.resize(size + definition->mStackCount, StackZero); rti->mCFstack[size].evalArgs(rti, arguments, &(definition->mParameters), isLet); rti->mLogicalStackTop = &(rti->mCFstack.back()) + 1; ret = definition->mExpression->evalArgs(rti, parent); rti->mCFstack.resize(size, StackZero); rti->mLogicalStackTop = oldLogicalStackTop; } else { ret = definition->mExpression->evalArgs(rti, parent); } return ret; } ASTcons::ASTcons(ASTexpression* l, ASTexpression* r) : ASTexpression(l->where, l->isConstant, l->isNatural, l->mType) { isLocal = l->isLocal; children.push_back(l); append(r); }; ASTexpression* ASToperator::Op(char op, ASTexpression* l, ASTexpression* r) { if (l && r) return new ASToperator(op, l, r); return l ? l : r; } ASToperator::ASToperator(char o, ASTexpression* l, ASTexpression* r) : ASTexpression(r ? (l->where + r->where) : l->where), op(o), left(l), right(r) { isConstant = r ? r->isConstant && l->isConstant : l->isConstant; isLocal = r ? r->isLocal && l->isLocal : l->isLocal; mType = r ? (expType)(l->mType | r->mType) : l->mType; if (strchr("+_*<>LG=n&|X^!", o)) isNatural = r ? (l->isNatural && r->isNatural) : l->isNatural; } ASTmodTerm::ASTmodTerm(ASTmodTerm::modTypeEnum t, ASTexpression* a, const yy::location& loc) : ASTexpression(loc, a->isConstant, false, ModType), modType(t), args(a) { if (a->mType == ASTexpression::RuleType) CfdgError::Error(loc, "Illegal expression in shape adjustment"); if (a->mType == ASTexpression::ModType) { if (t != ASTmodTerm::transform) CfdgError::Error(loc, "Cannot accept a transform expression here"); modType = ASTmodTerm::modification; } } ASTmodification::ASTmodification(const ASTmodification& m, const yy::location& loc) : ASTexpression(loc, true, false, ModType), modData(m.modData), modClass(m.modClass), strokeWidth(m.strokeWidth), flags(m.flags), entropyIndex(m.entropyIndex) { assert(m.modExp.empty()); } ASTmodification::ASTmodification(mod_ptr m, const yy::location& loc) : ASTexpression(loc, true, false, ModType), entropyIndex(0) { if (m.get()) { modData.mRand64Seed.seed(0); grab(m.get()); } else { modClass = 0; strokeWidth = 0.1; flags = CF_MITER_JOIN + CF_BUTT_CAP + CF_FILL; } } void ASTmodification::grab(AST::ASTmodification* m) { Rand64 oldEntropy = modData.mRand64Seed; modData = m->modData; modData.mRand64Seed ^= oldEntropy; modExp.swap(m->modExp); modClass = m->modClass; strokeWidth = m->strokeWidth; flags = m->flags; entropyIndex = (entropyIndex + m->entropyIndex) & 7; isConstant = modExp.empty(); } ASTselect::ASTselect(exp_ptr args, const yy::location& loc, bool asIf) : ASTexpression(loc), tupleSize(-1), indexCache(0), arguments(args.release()), ifSelect(asIf) { isConstant = false; arguments->entropy(ent); ent.append("\xB5\xA2\x4A\x74\xA9\xDF"); if (arguments->size() < 3) { CfdgError::Error(loc, "select()/if() function requires arguments"); return; } if ((*arguments)[0]->mType != NumericType || (*arguments)[0]->evaluate(0, 0) != 1) { CfdgError::Error((*arguments)[0]->where, "is()/select() selector must be a numeric scalar"); return; } mType = (*arguments)[1]->mType; isLocal = (*arguments)[0]->isLocal && (*arguments)[1]->isLocal; isNatural = (*arguments)[1]->isNatural; tupleSize = (mType == NumericType) ? (*arguments)[1]->evaluate(0, 0) : 1; if (tupleSize > 1) isNatural = false; if (tupleSize == -1) CfdgError::Error((*arguments)[1]->where, "Error determining tuple size"); for (int i = 2; i < arguments->size(); ++i) { if (mType != (*arguments)[i]->mType) { CfdgError::Error((*arguments)[i]->where, "select()/if() choices must be of same type"); } else if (mType == NumericType && tupleSize != -1 && (*arguments)[i]->evaluate(0, 0) != tupleSize) { CfdgError::Error((*arguments)[i]->where, "select()/if() choices must be of same length"); } isLocal = isLocal && (*arguments)[i]->isLocal; isNatural = isLocal && (*arguments)[i]->isNatural; } if (ifSelect && arguments->size() != 3) { CfdgError::Error(loc, "if() function requires two arguments"); } if ((*arguments)[0]->isConstant) { indexCache = getIndex(); isConstant = (*arguments)[indexCache]->isConstant; isLocal = (*arguments)[indexCache]->isLocal; isNatural = (*arguments)[indexCache]->isNatural; } } ASTuserFunction::ASTuserFunction(ASTexpression* args, ASTdefine* func, const yy::location& nameLoc) : ASTexpression(args ? (nameLoc + args->where) : nameLoc, false, false, func->mType), definition(func), arguments(args), isLet(false) { if (definition->mExpression) { isConstant = isConstant && definition->mExpression->isConstant; isNatural = definition->mExpression->isNatural; } else { isConstant = isConstant && definition->mChildChange.modExp.empty(); } isLocal = args ? args->isLocal : true; if (args && !func->mStackCount) CfdgError::Error(nameLoc + args->where, "Function does not take arguments"); if (!args && func->mStackCount) CfdgError::Error(nameLoc, "Function takes arguments"); if (args && func->mStackCount) ASTparameter::CheckType(&(func->mParameters), NULL, args, args->where, false); } ASTlet::ASTlet(ASTexpression* args, ASTdefine* func, const yy::location& letLoc, const yy::location& defLoc) : AST::ASTuserFunction(args, func, letLoc) { where = where + defLoc; isLet = true; } ASTarray::ASTarray(const ASTparameter* bound, exp_ptr args, int stackOffset, const yy::location& loc, const std::string& name) : ASTexpression(loc, bound->mStackIndex == -1, bound->isNatural, bound->mType), mConstData(bound->mStackIndex == -1), mArgs(0), mLength(1), mStride(1), mStackIndex(bound->mStackIndex - stackOffset), mCount(bound->mType == NumericType ? bound->mTuplesize : 1), isParameter(bound->isParameter), entString(name) { if (args.get() == 0 || args->mType != ASTexpression::NumericType) { CfdgError::Error(loc, "Array arguments must be numeric"); mArgs = new ASTreal(0.0, loc); isConstant = mConstData = false; return; // deleting args } isLocal = bound->isLocal; args->entropy(entString); if (mConstData) { mConstData = bound->mDefinition->mExpression->evaluate(mData, 9) > 0; } if ((*args)[0]->evaluate(0, 0) == 1) { mArgs = (*args)[0]; if (!args->release(0)) { args.release(); args.reset(new ASTexpression(mArgs->where)); // replace with dummy } double data[2]; int count = 0; for (int i = 1; i < args->size(); ++i) { if (!(*args)[i]->isConstant) { CfdgError::Error((*args)[i]->where, "Array argument is not constant"); break; } int num = (*args)[i]->evaluate(data + count, 2 - count); if (num <= 0) { CfdgError::Error((*args)[i]->where, "Error evaluating array arguments"); break; } count += num; } switch (count) { case 2: mStride = (int)data[1]; // fall through case 1: mLength = (int)data[0]; // fall through case 0: break; default: CfdgError::Error(args->where, "Unexpected number of array arguments"); break; } } else if (args->isConstant) { double data[3]; switch (args->evaluate(data, 3)) { case 3: mStride = (int)data[2]; // fall through case 2: mLength = (int)data[1]; // fall through case 1: mArgs = new ASTreal(data[0], args->where); mArgs->isLocal = args->isLocal; break; default: CfdgError::Error(args->where, "Error evaluating array arguments"); break; } } else { mArgs = args.release(); if (mArgs->evaluate(0, 0) != 1) CfdgError::Error(mArgs->where, "Array length & stride arguments must be contant"); } if (mStride < 0 || mLength < 0) CfdgError::Error(mArgs->where, "Array length & stride arguments must be positive"); if (mStride * (mLength - 1) >= mCount) CfdgError::Error(mArgs->where, "Array length & stride arguments too large for source"); isConstant = isConstant && mArgs->isConstant; isLocal = isLocal && mArgs->isLocal; } ASTruleSpecifier::~ASTruleSpecifier() { delete[] simpleRule; delete arguments; }; ASTcons::~ASTcons() { ASTexpArray::iterator it = children.begin(), eit = children.end(); for (; it != eit; ++it) { delete *it; } children.clear(); } ASTselect::~ASTselect() { delete arguments; } ASTmodification::~ASTmodification() { for (ASTtermArray::iterator it = modExp.begin(); it != modExp.end(); ++it) delete (*it); modExp.clear(); } ASTarray::~ASTarray() { delete mArgs; } ASTlet::~ASTlet() { delete definition; } static void Setmod(term_ptr& mod, ASTmodTerm* newmod) { if (mod.get()) CfdgError::Warning(mod->where, "Warning: this term is being dropped"); mod.reset(newmod); } static void AddMod(ASTtermArray& arr, term_ptr mod) { if (mod.get()) arr.push_back(mod.release()); } void ASTmodification::makeCanonical() // Receive a vector of modification terms and return an ASTexpression with // those terms rearranged into TRSSF canonical order. Duplicate terms are // deleted with a warning. { ASTtermArray temp; temp.swap(modExp); try { term_ptr x; term_ptr y; term_ptr z; term_ptr rot; term_ptr skew; term_ptr size; term_ptr zsize; term_ptr flip; term_ptr transform; for (ASTtermArray::iterator it = temp.begin(); it != temp.end(); ++it) { ASTmodTerm* mod = *it; assert(mod); *it = 0; int argcount = 0; if (mod->args && mod->args->mType == NumericType) argcount = mod->args->evaluate(0, 0); switch (mod->modType) { case ASTmodTerm::x: Setmod(x, mod); if (argcount > 1) { y.reset(); } break; case ASTmodTerm::y: Setmod(y, mod); break; case ASTmodTerm::z: Setmod(z, mod); break; case ASTmodTerm::modification: case ASTmodTerm::transform: Setmod(transform, mod); break; case ASTmodTerm::rot: Setmod(rot, mod); break; case ASTmodTerm::size: Setmod(size, mod); break; case ASTmodTerm::zsize: Setmod(zsize, mod); break; case ASTmodTerm::skew: Setmod(skew, mod); break; case ASTmodTerm::flip: Setmod(flip, mod); break; default: modExp.push_back(mod); break; } } temp.clear(); // If x and y are provided then merge them into a single (x,y) modification if (x.get() && y.get() && x->args->evaluate(0, 0) == 1 && y->args->evaluate(0, 0) == 1) { x->args = x->args->append(y->args); y->args = 0; y.reset(); } AddMod(modExp, x); AddMod(modExp, y); AddMod(modExp, z); AddMod(modExp, rot); AddMod(modExp, size); AddMod(modExp, zsize); AddMod(modExp, skew); AddMod(modExp, flip); AddMod(modExp, transform); } catch (...) { for (ASTtermArray::iterator it = temp.begin(); it != temp.end(); ++it) delete (*it); temp.clear(); throw; } } ASTexpression* ASTexpression::Append(ASTexpression* l, ASTexpression* r) { if (l && r) return l->append(r); return l ? l : r; } ASTexpression* ASTexpression::append(AST::ASTexpression *sib) { return sib ? new ASTcons(this, sib) : this; } ASTexpression* ASTcons::append(AST::ASTexpression *sib) { if (!sib) return this; where = where + sib->where; isConstant = isConstant && sib->isConstant; isNatural = isNatural && sib->isNatural; isLocal = isLocal && sib->isLocal; mType = (expType)(mType | sib->mType); // Cannot insert an ASTcons into children, it will be flattened away. // You must wrap the ASTcons in an ASTparen in order to insert it whole. for (int i = 0; i < sib->size(); ++i) children.push_back((*sib)[i]); if (sib->release()) delete sib; return this; } bool ASTcons::release(size_t i) { if (i == std::numeric_limits::max()) { children.clear(); } else if (i < children.size()) { children[i] = 0; } else { CfdgError::Error(where, "Expression list bounds exceeded"); } return true; } ASTexpression* ASTexpression::operator[](size_t i) { if (i) CfdgError::Error(where, "Expression list bounds exceeded"); return this; } const ASTexpression* ASTexpression::operator[](size_t i) const { if (i) CfdgError::Error(where, "Expression list bounds exceeded"); return this; } ASTexpression* ASTcons::operator[](size_t i) { if (i >= children.size()) { CfdgError::Error(where, "Expression list bounds exceeded"); return this; } return children[i]; } const ASTexpression* ASTcons::operator[](size_t i) const { if (i >= children.size()) { CfdgError::Error(where, "Expression list bounds exceeded"); return this; } return children[i]; } // Evaluate a cons tree to see how many reals it has and optionally // copy them to an array int ASTcons::evaluate(double* res, int length, Renderer* rti) const { if (((int)mType & (NumericType | FlagType)) == 0 || ((int)mType & (ModType | RuleType))) { CfdgError::Error(where, "Non-numeric expression in a numeric context"); return -1; } int count = 0; for (size_t i = 0; i < children.size(); ++i) { int num = children[i]->evaluate(res, length, rti); if (num <= 0) return -1; count += num; if (res) { res += num; length -= num; } } return count; } int ASTreal::evaluate(double* res, int length, Renderer*) const { if (res && length < 1) return -1; if (res) *res = value; return 1; } int ASTvariable::evaluate(double* res, int length, Renderer* rti) const { if (mType != NumericType) { CfdgError::Error(where, "Non-numeric variable in a numeric context"); return -1; } if (res && (length < count)) return -1; if (res) { if (rti == NULL) throw DeferUntilRuntime(); const StackType* stackItem = (stackIndex < 0) ? rti->mLogicalStackTop + stackIndex : &(rti->mCFstack[stackIndex]); for (int i = 0; i < count; ++i) res[i] = stackItem[i].number; } return count; } int ASTuserFunction::evaluate(double* res, int length, Renderer* rti) const { if (mType != NumericType) { CfdgError::Error(where, "Function does not evaluate to a number"); return -1; } if (res && length < definition->mTuplesize) return -1; if (!res) return definition->mTuplesize; if (!rti) throw DeferUntilRuntime(); if (rti->requestStop || Renderer::AbortEverything) throw CfdgError(where, "Stopping"); if (definition->mStackCount) { size_t size = rti->mCFstack.size(); if (size + definition->mStackCount > rti->mCFstack.capacity()) CfdgError::Error(where, "Maximum stack size exceeded"); const StackType* oldLogicalStackTop = rti->mLogicalStackTop; rti->mCFstack.resize(size + definition->mStackCount, StackZero); rti->mCFstack[size].evalArgs(rti, arguments, &(definition->mParameters), isLet); rti->mLogicalStackTop = &(rti->mCFstack.back()) + 1; definition->mExpression->evaluate(res, length, rti); rti->mCFstack.resize(size, StackZero); rti->mLogicalStackTop = oldLogicalStackTop; } else { definition->mExpression->evaluate(res, length, rti); } return definition->mTuplesize; } int ASToperator::evaluate(double* res, int length, Renderer* rti) const { double l = 0.0; double r = 0.0; if (res && length < 1) return -1; if (mType == FlagType && op == '+') { if (left->evaluate(res ? &l : 0, 1, rti) != 1) return -1; if (!right || right->evaluate(res ? &r : 0, 1, rti) != 1) return -1; int f = (int)l | (int)r; if (res) *res = (double)f; return 1; } if (mType != NumericType) { CfdgError::Error(where, "Non-numeric expression in a numeric context"); return -1; } if (left->evaluate(res ? &l : 0, 1, rti) != 1) { CfdgError::Error(left->where, "illegal operand"); return -1; } // short-circuit evaluate && and || if (res && (op == '&' || op == '|')) { if (l != 0.0 && op == '|') { *res = l; return 1; } if (l == 0.0 && op == '&') { *res = 0.0; return 1; } } int rightnum = right ? right->evaluate(res ? &r : 0, 1, rti) : 0; if (rightnum == 0 && (op == 'N' || op == 'P' || op == '!')) { if (res) { switch (op) { case 'P': *res = l; break; case 'N': *res = -l; break; case '!': *res = (l == 0.0) ? 1.0 : 0.0; break; default: return -1; } } return 1; } if (rightnum != 1) { CfdgError::Error(left->where, "illegal operand"); return -1; } if (res) { switch(op) { case '+': *res = l + r; break; case '-': *res = l - r; break; case '_': *res = l - r > 0.0 ? l - r : 0.0; break; case '*': *res = l * r; break; case '/': *res = l / r; break; case '<': *res = (l < r) ? 1.0 : 0.0; break; case 'L': *res = (l <= r) ? 1.0 : 0.0; break; case '>': *res = (l > r) ? 1.0 : 0.0; break; case 'G': *res = (l >= r) ? 1.0 : 0.0; break; case '=': *res = (l == r) ? 1.0 : 0.0; break; case 'n': *res = (l != r) ? 1.0 : 0.0; break; case '&': case '|': *res = r; break; case 'X': *res = ((l && !r) || (!l && r)) ? 1.0 : 0.0; break; case '^': *res = pow(l, r); if (isNatural && *res < 9007199254740992.) { uint64_t pow = 1; uint64_t il = (uint64_t)l; uint64_t ir = (uint64_t)r; while (ir) { if (ir & 1) pow *= il; il *= il; ir >>= 1; } *res = (double)pow; } break; default: return -1; } } else { if (strchr("+-*/^_<>LG=n&|X", op) == 0) return -1; } return 1; } static double MinMax(const ASTexpression* e, Renderer* rti, bool isMin) { double res = 0.0; if ((*e)[0]->evaluate(&res, 1, rti) != 1) CfdgError::Error((*e)[0]->where, "Error computing min/max here."); for (int i = 1; i < e->size(); ++i) { double v; if ((*e)[i]->evaluate(&v, 1, rti) != 1) CfdgError::Error((*e)[i]->where, "Error computing min/max here."); bool leftMin = res < v; res = ((isMin && leftMin) || (!isMin && !leftMin)) ? res : v; } return res; } int ASTfunction::evaluate(double* res, int length, Renderer* rti) const { if (mType != NumericType) { CfdgError::Error(where, "Non-numeric expression in a numeric context"); return -1; } if ((res && length < 1) || (functype <= NotAFunction) || (functype >= LastOne)) return -1; if (!res) return 1; if (functype == Min || functype == Max) { *res = MinMax(arguments, rti, functype == Min); return 1; } double a[2]; int count = arguments->evaluate(a, 2, rti); // no need to check the argument count, the constructor already checked it // But check it anyway to make valgrind happy if (count < 0) return 1; switch (functype) { case Cos: *res = cos(a[0] * 0.0174532925199); break; case Sin: *res = sin(a[0] * 0.0174532925199); break; case Tan: *res = tan(a[0] * 0.0174532925199); break; case Cot: *res = 1.0 / tan(a[0] * 0.0174532925199); break; case Acos: *res = acos(a[0]) * 57.29577951308; break; case Asin: *res = asin(a[0]) * 57.29577951308; break; case Atan: *res = atan(a[0]) * 57.29577951308; break; case Acot: *res = atan(1.0 / a[0]) * 57.29577951308; break; case Cosh: *res = cosh(a[0]); break; case Sinh: *res = sinh(a[0]); break; case Tanh: *res = tanh(a[0]); break; case Acosh: *res = acosh(a[0]); break; case Asinh: *res = asinh(a[0]); break; case Atanh: *res = atanh(a[0]); break; case Log: *res = log(a[0]); break; case Log10: *res = log10(a[0]); break; case Sqrt: *res = sqrt(a[0]); break; case Exp: *res = exp(a[0]); break; case Abs: if (count == 1) *res = fabs(a[0]); else *res = fabs(a[0] - a[1]); break; case Infinity: *res = (a[0] < 0.0) ? (-Renderer::Infinity) : (Renderer::Infinity); break; case Factorial: if (a[0] < 0.0 || a[0] > 18.0 ||a[0] != floor(a[0])) CfdgError::Error(this->where, "Illegal argument for factorial"); *res = 1.0; for (double v = 1.0; v <= a[0]; v += 1.0) *res *= v; break; case Sg: *res = a[0] == 0.0 ? 0.0 : 1.0; break; case IsNatural: *res = Renderer::isNatural(rti, a[0]); break; case BitNot: *res = (double)(~(uint64_t)a[0] & 0xfffffffffffffull); break; case BitOr: *res = (double)(((uint64_t)a[0] | (uint64_t)a[1]) & 0xfffffffffffffull); break; case BitAnd: *res = (double)(((uint64_t)a[0] & (uint64_t)a[1]) & 0xfffffffffffffull); break; case BitXOR: *res = (double)(((uint64_t)a[0] ^ (uint64_t)a[1]) & 0xfffffffffffffull); break; case BitLeft: *res = (double)(((uint64_t)a[0] << (uint64_t)a[1]) & 0xfffffffffffffull); break; case BitRight: *res = (double)(((uint64_t)a[0] >> (uint64_t)a[1]) & 0xfffffffffffffull); break; case Atan2: *res = atan2(a[0], a[1]) * 57.29577951308; break; case Mod: if (arguments->isNatural) *res = (double)((uint64_t)a[0] % (uint64_t)a[1]); else *res = fmod(a[0], a[1]); break; case Divides: *res = ((uint64_t)a[0] % (uint64_t)a[1]) == (uint64_t)0 ? 1.0 : 0.0; break; case Div: *res = (double)((uint64_t)a[0] / (uint64_t)a[1]); break; case Floor: *res = floor(a[0]); break; case Ftime: if (rti == NULL) throw DeferUntilRuntime(); *res = rti->mCurrentTime; break; case Frame: if (rti == NULL) throw DeferUntilRuntime(); *res = rti->mCurrentFrame; break; case Rand_Static: *res = random * fabs(a[1] - a[0]) + fmin(a[0], a[1]); break; case Rand: if (rti == NULL) throw DeferUntilRuntime(); rti->mRandUsed = true; *res = rti->mCurrentSeed.getDouble() * fabs(a[1] - a[0]) + fmin(a[0], a[1]); break; case Rand2: if (rti == NULL) throw DeferUntilRuntime(); rti->mRandUsed = true; *res = (rti->mCurrentSeed.getDouble() * 2.0 - 1.0) * a[1] + a[0]; break; case RandInt: if (rti == NULL) throw DeferUntilRuntime(); rti->mRandUsed = true; *res = floor(rti->mCurrentSeed.getDouble() * fabs(a[1] - a[0]) + fmin(a[0], a[1])); break; default: return -1; } return 1; } int ASTselect::evaluate(double* res, int length, Renderer* rti) const { if (mType != NumericType) { CfdgError::Error(where, "Evaluation of a non-numeric select() in a numeric context"); return -1; } if (res == NULL) return tupleSize; return (*arguments)[getIndex(rti)]->evaluate(res, length, rti); } int ASTruleSpecifier::evaluate(double* , int , Renderer* ) const { CfdgError::Error(where, "Improper evaluation of a rule specifier"); return -1; } int ASTparen::evaluate(double* res, int length, Renderer* rti) const { if (mType != NumericType) { CfdgError::Error(where, "Non-numeric/flag expression in a numeric/flag context"); return -1; } return e->evaluate(res, length, rti); } int ASTmodTerm::evaluate(double* , int , Renderer* ) const { CfdgError::Error(where, "Improper evaluation of an adjustment expression"); return -1; } int ASTmodification::evaluate(double* , int , Renderer* ) const { CfdgError::Error(where, "Improper evaluation of an adjustment expression"); return -1; } int ASTarray::evaluate(double* res, int length, Renderer* rti) const { if (mType != NumericType) { CfdgError::Error(where, "Non-numeric/flag expression in a numeric/flag context"); return -1; } if (res && (length < mLength)) return -1; if (res) { if (rti == NULL && !mConstData) throw DeferUntilRuntime(); double i; if (mArgs->evaluate(&i, 1, rti) != 1) { CfdgError::Error(mArgs->where, "Cannot evaluate array index"); return -1; } int index = (int)i; if ((mLength - 1) * mStride + index >= mCount || index < 0) { CfdgError::Error(where, "array index exceeds bounds"); return -1; } const double* source = &mData[0]; if (!mConstData) source = (mStackIndex < 0) ? &(rti->mLogicalStackTop[mStackIndex].number) : &(rti->mCFstack[mStackIndex].number); for (int i = 0; i < mLength; ++i) res[i] = source[i * mStride + index]; } return mLength; } void ASTselect::evaluate(Modification& m, int* p, double* width, bool justCheck, int& seedIndex, bool shapeDest, Renderer* rti) const { if (mType != ModType) { CfdgError::Error(where, "Evaluation of a non-adjustment select() in an adjustment context"); return; } (*arguments)[getIndex(rti)]->evaluate(m, p, width, justCheck, seedIndex, shapeDest, rti); } void ASTvariable::evaluate(Modification& m, int*, double*, bool justCheck, int&, bool shapeDest, Renderer* rti) const { if (mType != ModType) CfdgError::Error(where, "Non-adjustment variable referenced in an adjustment context"); if (rti == NULL) throw DeferUntilRuntime(); if (justCheck) return; const StackType* stackItem = (stackIndex < 0) ? rti->mLogicalStackTop + stackIndex : &(rti->mCFstack[stackIndex]); const Modification* smod = reinterpret_cast (stackItem); if (shapeDest) { m *= *smod; } else { if (m.merge(*smod)) Renderer::ColorConflict(rti, where); } } void ASTcons::evaluate(Modification& m, int* p, double* width, bool justCheck, int& seedIndex, bool shapeDest, Renderer* rti) const { for (size_t i = 0; i < children.size(); ++i) children[i]->evaluate(m, p, width, justCheck, seedIndex, shapeDest, rti); } void ASTuserFunction::evaluate(Modification &m, int *p, double *width, bool justCheck, int &seedIndex, bool shapeDest, Renderer* rti) const { if (mType != ModType) { CfdgError::Error(where, "Function does not evaluate to an adjustment"); return; } if (!rti) throw DeferUntilRuntime(); if (rti->requestStop || Renderer::AbortEverything) throw CfdgError(where, "Stopping"); if (definition->mStackCount) { size_t size = rti->mCFstack.size(); if (size + definition->mStackCount > rti->mCFstack.capacity()) CfdgError::Error(where, "Maximum stack size exceeded"); const StackType* oldLogicalStackTop = rti->mLogicalStackTop; rti->mCFstack.resize(size + definition->mStackCount, StackZero); rti->mCFstack[size].evalArgs(rti, arguments, &(definition->mParameters), isLet); rti->mLogicalStackTop = &(rti->mCFstack.back()) + 1; definition->mExpression->evaluate(m, p, width, justCheck, seedIndex, shapeDest, rti); rti->mCFstack.resize(size, StackZero); rti->mLogicalStackTop = oldLogicalStackTop; } else { definition->mExpression->evaluate(m, p, width, justCheck, seedIndex, shapeDest, rti); } } void ASTmodification::evaluate(Modification& m, int* p, double* width, bool justCheck, int& seedIndex, bool shapeDest, Renderer* rti) const { if (shapeDest) { m *= modData; } else { if (m.merge(modData)) Renderer::ColorConflict(rti, where); } for (ASTtermArray::const_iterator it = modExp.begin(), eit = modExp.end(); it != eit; ++it) { (*it)->evaluate(m, p, width, justCheck, seedIndex, shapeDest, rti); } } void ASTmodification::setVal(Modification& m, int* p, double* width, bool justCheck, int& seedIndex, Renderer* rti) const { m = modData; for (ASTtermArray::const_iterator it = modExp.begin(); it != modExp.end(); ++it) (*it)->evaluate(m, p, width, justCheck, seedIndex, false, rti); } void ASTparen::evaluate(Modification& m, int* p, double* width, bool justCheck, int& seedIndex, bool shapeDest, Renderer* rti) const { if (mType != ModType) { CfdgError::Error(where, "Expression does not evaluate to an adjustment"); return; } e->evaluate(m, p, width, justCheck, seedIndex, shapeDest, rti); } void ASTmodTerm::evaluate(Modification& m, int* p, double* width, bool justCheck, int& seedIndex, bool shapeDest, Renderer* rti) const { double modArgs[6] = {0.0}; int argcount = 0; if (args) { if (modType != modification && args->mType == NumericType) { if (justCheck) argcount = args->evaluate(0, 0); else argcount = args->evaluate(modArgs, 6, rti); } else if (modType == modification && args->mType != ModType){ CfdgError::Error(where, "Adjustments require numeric arguments"); return; } } int minCount = 1; int maxCount = 1; double arg[6] = {0.0}; for (int i = 0; i < argcount; ++i) arg[i] = fmax(-1.0, fmin(1.0, modArgs[i])); switch (modType) { case ASTmodTerm::x: { maxCount = 2; if (justCheck) break; if (argcount == 1) modArgs[1] = 0.0; agg::trans_affine_translation trx(modArgs[0], modArgs[1]); m.m_transform.premultiply(trx); break; } case ASTmodTerm::y: { if (justCheck) break; agg::trans_affine_translation tr(0.0, modArgs[0]); m.m_transform.premultiply(tr); break; } case ASTmodTerm::z: { if (justCheck) break; agg::trans_affine_1D_translation tr(modArgs[0]); m.m_Z.premultiply(tr); break; } case ASTmodTerm::xyz: { minCount = maxCount = 3; if (justCheck) break; agg::trans_affine_translation trx(modArgs[0], modArgs[1]); m.m_transform.premultiply(trx); agg::trans_affine_1D_translation trz(modArgs[2]); m.m_Z.premultiply(trz); break; } case ASTmodTerm::time: { minCount = maxCount = 2; if (justCheck) break; agg::trans_affine_time_translation tr(modArgs[0], modArgs[1]); m.m_time.premultiply(tr); break; } case ASTmodTerm::timescale: { if (justCheck) break; agg::trans_affine_time_scaling sc(modArgs[0]); m.m_time.premultiply(sc); break; } case ASTmodTerm::transform: { maxCount = 6; if (argcount != 1 && argcount != 2 && argcount != 4 && argcount != 6) CfdgError::Error(where, "transform adjustment takes 1, 2, 4, or 6 parameters"); if (justCheck) break; switch (argcount) { case 2: case 1: { if (argcount == 1) modArgs[1] = 0.0; agg::trans_affine_translation trx(modArgs[0], modArgs[1]); m.m_transform.premultiply(trx); break; } case 4: { agg::trans_affine sq; double dx = modArgs[2] - modArgs[0]; double dy = modArgs[3] - modArgs[1]; sq.scale(sqrt(dx * dx + dy * dy)); sq.rotate(atan2(dy, dx)); sq.translate(modArgs[0], modArgs[1]); m.m_transform.premultiply(sq); break; } case 6: { agg::trans_affine par; par.rect_to_parl(0.0, 0.0, 1.0, 1.0, modArgs); m.m_transform.premultiply(par); break; } default: break; } break; } case ASTmodTerm::size: { maxCount = 2; if (justCheck) break; if (argcount == 1) modArgs[1] = modArgs[0]; agg::trans_affine_scaling sc(modArgs[0], modArgs[1]); m.m_transform.premultiply(sc); break; } case ASTmodTerm::sizexyz: { minCount = maxCount = 3; if (justCheck) break; agg::trans_affine_scaling sc(modArgs[0], modArgs[1]); m.m_transform.premultiply(sc); agg::trans_affine_1D_scaling scz(modArgs[2]); m.m_Z.premultiply(scz); break; } case ASTmodTerm::zsize: { if (justCheck) break; agg::trans_affine_1D_scaling sc(modArgs[0]); m.m_Z.premultiply(sc); break; } case ASTmodTerm::rot: { if (justCheck) break; agg::trans_affine_rotation rot(modArgs[0] * MY_PI / 180.0); m.m_transform.premultiply(rot); break; } case ASTmodTerm::skew: { minCount = maxCount = 2; if (justCheck) break; agg::trans_affine_skewing sk(modArgs[0] * MY_PI / 180.0, modArgs[1] * MY_PI / 180.0); m.m_transform.premultiply(sk); break; } case ASTmodTerm::flip: { if (justCheck) break; agg::trans_affine_reflection ref(modArgs[0] * MY_PI / 180.0); m.m_transform.premultiply(ref); break; } case ASTmodTerm::Entropy: { //ent.append(mod->parameter); minCount = maxCount = 0; //if (justCheck) break; m.mRand64Seed.xorString(entString.c_str(), seedIndex); break; } case ASTmodTerm::hue: { maxCount = 2; if (justCheck) break; if (argcount == 1) { if (m.m_ColorAssignment & HSBColor::HueMask) { if (rti == 0) throw DeferUntilRuntime(); if (!shapeDest) Renderer::ColorConflict(rti, where); } if (shapeDest) m.m_Color.h = HSBColor::adjustHue(m.m_Color.h, modArgs[0]); else m.m_Color.h += modArgs[0]; } else { if ((m.m_ColorAssignment & HSBColor::HueMask || m.m_Color.h != 0.0)) { if (rti == 0) throw DeferUntilRuntime(); if (!shapeDest) Renderer::ColorConflict(rti, where); } if (shapeDest) { m.m_Color.h = HSBColor::adjustHue(m.m_Color.h, arg[0], HSBColor::HueTarget, modArgs[1]); } else { m.m_Color.h = arg[0]; m.m_ColorTarget.h = modArgs[1]; m.m_ColorAssignment |= HSBColor::Hue2Value; } } break; } case ASTmodTerm::sat: { maxCount = 2; if (justCheck) break; if (argcount == 1) { if ((m.m_ColorAssignment & HSBColor::SaturationMask) || m.m_Color.s != 0.0) { if (rti == 0) throw DeferUntilRuntime(); if (!shapeDest) Renderer::ColorConflict(rti, where); } if (shapeDest) m.m_Color.s = HSBColor::adjust(m.m_Color.s, arg[0]); else m.m_Color.s = arg[0]; } else { if ((m.m_ColorAssignment & HSBColor::SaturationMask) || m.m_Color.s != 0.0 || m.m_ColorTarget.s != 0.0) { if (rti == 0) throw DeferUntilRuntime(); if (!shapeDest) Renderer::ColorConflict(rti, where); } if (shapeDest) { m.m_Color.s = HSBColor::adjust(m.m_Color.s, arg[0], 1, arg[1]); } else { m.m_Color.s = arg[0]; m.m_ColorTarget.s = arg[1]; m.m_ColorAssignment |= HSBColor::Saturation2Value; } } break; } case ASTmodTerm::bright: { maxCount = 2; if (justCheck) break; if (argcount == 1) { if ((m.m_ColorAssignment & HSBColor::BrightnessMask || m.m_Color.b != 0.0)) { if (rti == 0) throw DeferUntilRuntime(); if (!shapeDest) Renderer::ColorConflict(rti, where); } if (shapeDest) m.m_Color.b = HSBColor::adjust(m.m_Color.b, arg[0]); else m.m_Color.b = arg[0]; } else { if ((m.m_ColorAssignment & HSBColor::BrightnessMask) || m.m_Color.b != 0.0 || m.m_ColorTarget.b != 0.0) { if (rti == 0) throw DeferUntilRuntime(); if (!shapeDest) Renderer::ColorConflict(rti, where); } if (shapeDest) { m.m_Color.b = HSBColor::adjust(m.m_Color.b, arg[0], 1, arg[1]); } else { m.m_Color.b = arg[0]; m.m_ColorTarget.b = arg[1]; m.m_ColorAssignment |= HSBColor::Brightness2Value; } } break; } case ASTmodTerm::alpha: { maxCount = 2; if (p) *p |= CF_USES_ALPHA; if (justCheck) break; if (argcount == 1) { if ((m.m_ColorAssignment & HSBColor::AlphaMask || m.m_Color.a != 0.0)) { if (rti == 0) throw DeferUntilRuntime(); if (!shapeDest) Renderer::ColorConflict(rti, where); } if (shapeDest) m.m_Color.a = HSBColor::adjust(m.m_Color.a, arg[0]); else m.m_Color.a = arg[0]; } else { if ((m.m_ColorAssignment & HSBColor::AlphaMask) || m.m_Color.a != 0.0 || m.m_ColorTarget.a != 0.0) { if (rti == 0) throw DeferUntilRuntime(); if (!shapeDest) Renderer::ColorConflict(rti, where); } if (shapeDest) { m.m_Color.a = HSBColor::adjust(m.m_Color.a, arg[0], 1, arg[1]); } else { m.m_Color.a = arg[0]; m.m_ColorTarget.a = arg[1]; m.m_ColorAssignment |= HSBColor::Alpha2Value; } } break; } case ASTmodTerm::hueTarg: { if (justCheck) break; if ((m.m_ColorAssignment & HSBColor::HueMask) || m.m_Color.h != 0.0) { if (rti == 0) throw DeferUntilRuntime(); if (!shapeDest) Renderer::ColorConflict(rti, where); } if (shapeDest) { m.m_Color.h = HSBColor::adjustHue(m.m_Color.h, arg[0], HSBColor::HueTarget, m.m_ColorTarget.h); } else { m.m_Color.h = arg[0]; m.m_ColorAssignment |= HSBColor::HueTarget; } break; } case ASTmodTerm::satTarg: { if (justCheck) break; if ((m.m_ColorAssignment & HSBColor::SaturationMask) || m.m_Color.s != 0.0) { if (rti == 0) throw DeferUntilRuntime(); if (!shapeDest) Renderer::ColorConflict(rti, where); } if (shapeDest) { m.m_Color.s = HSBColor::adjust(m.m_Color.s, arg[0], 1, m.m_ColorTarget.s); } else { m.m_Color.s = arg[0]; m.m_ColorAssignment |= HSBColor::SaturationTarget; } break; } case ASTmodTerm::brightTarg: { if (justCheck) break; if ((m.m_ColorAssignment & HSBColor::BrightnessMask) || m.m_Color.b != 0.0) { if (rti == 0) throw DeferUntilRuntime(); if (!shapeDest) Renderer::ColorConflict(rti, where); } if (shapeDest) { m.m_Color.b = HSBColor::adjust(m.m_Color.b, arg[0], 1, m.m_ColorTarget.b); } else { m.m_Color.b = arg[0]; m.m_ColorAssignment |= HSBColor::BrightnessTarget; } break; } case ASTmodTerm::alphaTarg: { if (p) *p |= CF_USES_ALPHA; if (justCheck) break; if ((m.m_ColorAssignment & HSBColor::AlphaMask) || m.m_Color.a != 0.0) { if (rti == 0) throw DeferUntilRuntime(); if (!shapeDest) Renderer::ColorConflict(rti, where); } if (shapeDest) { m.m_Color.a = HSBColor::adjust(m.m_Color.a, arg[0], 1, m.m_ColorTarget.a); } else { m.m_Color.a = arg[0]; m.m_ColorAssignment |= HSBColor::AlphaTarget; } break; } case ASTmodTerm::targHue: { if (justCheck) break; m.m_ColorTarget.h += modArgs[0]; break; } case ASTmodTerm::targSat: { if (justCheck) break; if (m.m_ColorTarget.s != 0.0) { if (rti == 0) throw DeferUntilRuntime(); if (!shapeDest) Renderer::ColorConflict(rti, where); } if (shapeDest) m.m_ColorTarget.s = HSBColor::adjust(m.m_ColorTarget.s, arg[0]); else m.m_ColorTarget.s = arg[0]; break; } case ASTmodTerm::targBright: { if (justCheck) break; if (m.m_ColorTarget.b != 0.0) { if (rti == 0) throw DeferUntilRuntime(); if (!shapeDest) Renderer::ColorConflict(rti, where); } if (shapeDest) m.m_ColorTarget.b = HSBColor::adjust(m.m_ColorTarget.b, arg[0]); else m.m_ColorTarget.b = arg[0]; break; } case ASTmodTerm::targAlpha: { if (justCheck) break; if (m.m_ColorTarget.a != 0.0) { if (rti == 0) throw DeferUntilRuntime(); if (!shapeDest) Renderer::ColorConflict(rti, where); } if (shapeDest) m.m_ColorTarget.a = HSBColor::adjust(m.m_ColorTarget.a, arg[0]); else m.m_ColorTarget.a = arg[0]; break; } case ASTmodTerm::param: { minCount = maxCount = 0; if (!p) { CfdgError::Error(where, "Cannot provide a parameter in this context"); break; } if (justCheck) break; if (!entString.empty()) { if (entString.find("evenodd") != std::string::npos) *p |= CF_EVEN_ODD; if (entString.find("iso") != std::string::npos) *p |= CF_ISO_WIDTH; if (entString.find("join") != std::string::npos) *p &= ~CF_JOIN_MASK; if (entString.find("miterjoin") != std::string::npos) *p |= CF_MITER_JOIN | CF_JOIN_PRESENT; if (entString.find("roundjoin") != std::string::npos) *p |= CF_ROUND_JOIN | CF_JOIN_PRESENT; if (entString.find("beveljoin") != std::string::npos) *p |= CF_BEVEL_JOIN | CF_JOIN_PRESENT; if (entString.find("cap") != std::string::npos) *p &= ~CF_CAP_MASK; if (entString.find("buttcap") != std::string::npos) *p |= CF_BUTT_CAP | CF_CAP_PRESENT; if (entString.find("squarecap") != std::string::npos) *p |= CF_SQUARE_CAP | CF_CAP_PRESENT; if (entString.find("roundcap") != std::string::npos) *p |= CF_ROUND_CAP | CF_CAP_PRESENT; } break; } case ASTmodTerm::stroke: { if (!width) { CfdgError::Error(where, "Cannot provide a stroke width in this context"); break; } if (justCheck) break; *width = modArgs[0]; break; } case ASTmodTerm::modification: { minCount = maxCount = 0; if (rti == 0) { const ASTmodification* mod = dynamic_cast(args); if (!mod || (mod->modClass & (ASTmodification::HueClass | ASTmodification::HueTargetClass | ASTmodification::BrightClass | ASTmodification::BrightTargetClass | ASTmodification::SatClass | ASTmodification::SatTargetClass | ASTmodification::AlphaClass | ASTmodification::AlphaTargetClass))) { throw DeferUntilRuntime(); } } args->evaluate(m, p, width, justCheck, seedIndex, shapeDest, rti); break; } default: break; } if (argcount < minCount) CfdgError::Error(where, "Not enough adjustment parameters"); if (argcount > maxCount) CfdgError::Error(where, "Too many adjustment parameters"); } void ASTfunction::entropy(std::string& ent) const { if (functype <= NotAFunction) return; arguments->entropy(ent); ent.append(Entropies[functype]); } void ASTselect::entropy(std::string& e) const { e.append(ent); } void ASTruleSpecifier::entropy(std::string& ent) const { ent.append(entropyVal); } void ASTcons::entropy(std::string& ent) const { for (size_t i = 0; i < children.size(); ++i) children[i]->entropy(ent); ent.append("\xC5\x60\xA5\xC5\xC8\x74"); } void ASTreal::entropy(std::string& ent) const { ent.append(text); } void ASTvariable::entropy(std::string& ent) const { ent.append(text); } void ASTuserFunction::entropy(std::string& ent) const { if (arguments) arguments->entropy(ent); ent.append(definition->mName); } void ASToperator::entropy(std::string& ent) const { left->entropy(ent); if (right) right->entropy(ent); // These random strings are courtesy of http://www.fourmilab.ch/hotbits/ switch (op) { case '*': ent.append("\x2E\x32\xD9\x2C\x41\xFE"); break; case '/': ent.append("\x6B\x15\x23\x41\x9E\xEB"); break; case '+': ent.append("\xD7\xB1\xB0\x39\x33\xC8"); break; case '-': ent.append("\x5D\xE7\xF0\x94\xC4\x13"); break; case '^': ent.append("\x02\x3C\x68\x36\xC5\xA0"); break; case 'N': ent.append("\x55\x89\x51\x46\xDB\x84"); break; case 'P': ent.append("\x8E\xAC\x29\x4B\x0E\xDC"); break; case '!': ent.append("\x19\x3A\x3E\x53\x14\xEA"); break; case '<': ent.append("\xBE\xDB\xC4\xA6\x4E\xAD"); break; case '>': ent.append("\xC7\xD9\x57\x32\xD6\x87"); break; case 'L': ent.append("\xE3\x56\x7E\x44\x57\x80"); break; case 'G': ent.append("\xB1\x2D\x2A\xCC\x2C\x40"); break; case '=': ent.append("\x78\x48\xC2\x95\xA9\xE2"); break; case 'n': ent.append("\x36\xCC\x01\x3B\x2F\xAD"); break; case '&': ent.append("\x28\x9B\xFB\x7F\xDB\x9C"); break; case '|': ent.append("\x2E\x40\x1B\x44\x15\x7C"); break; case 'X': ent.append("\xA7\x2B\x92\xFA\xFC\xF9"); break; default: ent.append("\x60\x2F\x10\xAD\x10\xFF"); break; } } void ASTparen::entropy(std::string& ent) const { e->entropy(ent); ent.append("\xE8\xE9\xF6\x7E\x1A\xF1"); } void ASTmodTerm::entropy(std::string& ent) const { if (args) args->entropy(ent); ent.append(ASTmodTerm::Entropies[modType]); } void ASTarray::entropy(std::string& e) const { e.append(entString); } ASTexpression* ASTfunction::simplify() { if (isConstant) { double result; if (evaluate(&result, 1) != 1) { return this; } ASTreal* r = new ASTreal(result, where); r->isNatural = isNatural; r->isLocal = isLocal; delete this; return r; } else { arguments = arguments->simplify(); } return this; } ASTexpression* ASTselect::simplify() { if (!indexCache) { arguments = arguments->simplify(); return this; } ASTexpression* chosenOne = (*arguments)[indexCache]; if (!arguments->release(indexCache)) return this; delete this; return chosenOne->simplify(); } ASTexpression* ASTruleSpecifier::simplify() { if (arguments) { if (ASTcons* carg = dynamic_cast(arguments)) { for (size_t i = 0; i < carg->children.size(); ++i) carg->children[i] = carg->children[i]->simplify(); } else { arguments = arguments->simplify(); } } return this; } ASTexpression* ASTcons::simplify() { if (children.size() == 1) { ASTexpression* ret = children[0]->simplify(); children[0] = NULL; delete this; return ret; } for (size_t i = 0; i < children.size(); ++i) children[i] = children[i]->simplify(); return this; } ASTexpression* ASTuserFunction::simplify() { if (arguments) { if (ASTcons* carg = dynamic_cast(arguments)) { for (size_t i = 0; i < carg->children.size(); ++i) carg->children[i] = carg->children[i]->simplify(); } else { arguments = arguments->simplify(); } } return this; } ASTexpression* ASToperator::simplify() { left = left->simplify(); if (right) right = right->simplify(); if (isConstant && (mType == NumericType || mType == FlagType)) { double result; if (evaluate(&result, 1) != 1) { return 0; } ASTreal* r = new ASTreal(result, where); r->mType = mType; r->isNatural = isNatural; r->isLocal = isLocal; delete this; return r; } return this; } ASTexpression* ASTparen::simplify() { ASTexpression* e2 = e->simplify(); e = 0; delete this; return e2; } ASTvariable::ASTvariable(int stringNum, const std::string& str, const yy::location& loc) : ASTexpression(loc), stringIndex(stringNum), text(str), stackIndex(0), isParameter(false) { }; ASTexpression* ASTmodTerm::simplify() { if (args) { args = args->simplify(); } return this; } ASTexpression* ASTarray::simplify() { if (!isConstant) { mArgs = mArgs->simplify(); return this; } double i; if (mArgs->evaluate(&i, 1) != 1) { CfdgError::Error(mArgs->where, "Cannot evaluate array index"); return this; } int index = (int)i; if ((mLength - 1) * mStride + index >= mCount || index < 0) { CfdgError::Error(where, "Array index exceeds bounds"); return this; } // Create a new cons-list based on the evaluated variable's expression ASTreal* top = new ASTreal(mData[index], where); top->text = entString; // use variable name for entropy ASTexpression* list = top; for (int i = 1; i < mLength; ++i) list = list->append(new ASTreal(mData[i * mStride + index], where)); list->isNatural = isNatural; delete this; return list; } void ASTmodification::evalConst() { int nonConstant = 0; ASTtermArray temp; temp.swap(modExp); for (ASTtermArray::iterator it = temp.begin(); it != temp.end(); ++it) { bool keepThisOne = false; ASTmodTerm* mod = *it; if (mod == 0) { CfdgError::Error((*it)->where, "Unknown term in shape adjustment"); delete *it; continue; } // Put in code for separating color changes and target color changes int mc = ASTmodification::ModClass[mod->modType]; modClass |= mc; if (!mod->isConstant) nonConstant |= mc; bool justCheck = (mc & nonConstant) != 0; try { mod->evaluate(modData, &flags, &strokeWidth, justCheck, entropyIndex, false, NULL); } catch (CfdgError) { for (; it != temp.end(); ++it) { delete *it; } for (it = modExp.begin(); it != modExp.end(); ++it) { delete *it; } throw; } catch (DeferUntilRuntime) { keepThisOne = true; } if (justCheck || keepThisOne) { if (mod->args) mod->args = mod->args->simplify(); modExp.push_back(mod); } else { delete *it; } } } void ASTmodification::addEntropy(const std::string& s) { modData.mRand64Seed.xorString(s.c_str(), entropyIndex); } unsigned ASTselect::getIndex(Renderer* rti) const { if (indexCache) return indexCache; double select = 0.0; (*arguments)[0]->evaluate(&select, 1, rti); if (ifSelect) return select ? 1 : 2; int i = (int)select + 1; if (i <= 0) return 1; if (i > arguments->size()) return arguments->size() - 1; return i; } } contextfree-3.0.5+dfsg1.orig/src-common/stacktype.h0000644000175000017500000000471112076364074020701 0ustar brambram// stacktype.h // this file is part of Context Free // --------------------- // Copyright (C) 2011 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #ifndef INCLUDE_STACKTYPE_H #define INCLUDE_STACKTYPE_H #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS #endif #include // Use the C99 official header #include #include namespace AST { class ASTparameter; class ASTexpression; } union StackType; class Renderer; struct StackRule { enum { MaxRefCount = UINT32_MAX }; int16_t mRuleName; uint16_t mParamCount; mutable uint32_t mRefCount; bool operator==(const StackRule& o) const; static bool Equal(const StackRule* a, const StackType* b); }; union StackType { double number; const StackType* rule; StackRule ruleHeader; const std::vector* typeInfo; static StackType* alloc(int name, int size, const std::vector* ti); void release() const; void release(const std::vector* p) const; void retain(Renderer* r) const; void read(std::istream& is); void write(std::ostream& os) const; static StackType* readHeader(std::istream& is); static void writeHeader(std::ostream& os, const StackType* s); void evalArgs(Renderer* rti, const AST::ASTexpression* arguments, const StackType* parent); void evalArgs(Renderer* rti, const AST::ASTexpression* arguments, const std::vector* p, bool sequential); }; #endif // INCLUDE_STACKTYPE_H contextfree-3.0.5+dfsg1.orig/src-common/makeCFfilename.cpp0000644000175000017500000000461212076364074022054 0ustar brambram// makeCFfilename.cpp // Context Free // --------------------- // Copyright (C) 2008-2012 John Horigan // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #include "makeCFfilename.h" #include #include #include #include "variation.h" #include "math.h" #include #include using namespace std; string makeCFfilename(const char* fmt, int frame, int frameCount, int variation) { stringstream namestream(stringstream::out); int numLength = 1; if (strcmp(fmt, "-") == 0) return namestream.str(); // empty string becomes stdout if (frameCount) numLength = (int)log10((double)frameCount) + 1; const char* p = fmt; while (*p) { const char* perc = strchr(p, '%'); if (perc) { namestream.write(p, perc - p); } else { namestream << p; break; } bool lower = true; char code[Variation::maxStringLength]; switch (*(perc + 1)) { case 'V': lower = false; case 'v': Variation::toString(variation, code, lower); namestream << code; break; case 'f': namestream << setfill('0') << setw(numLength) << frame; break; case '%': namestream << '%'; break; default: namestream << "_Unknown_format_code_" << *(perc + 1) << '_'; break; } p = perc + 2; } return namestream.str(); } contextfree-3.0.5+dfsg1.orig/src-common/bounds.h0000644000175000017500000001122112076364074020156 0ustar brambram// bounds.h // this file is part of Context Free // --------------------- // Copyright (C) 2006-2007 Mark Lentczner - markl@glyphic.com // Copyright (C) 2006-2012 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // Mark Lentczner can be contacted at markl@glyphic.com or at // Mark Lentczner, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #ifndef INCLUDE_BOUNDS_H #define INCLUDE_BOUNDS_H #include "agg_path_storage.h" namespace agg { struct trans_affine; } namespace AST { class ASTpathCommand; struct CommandInfo; } class pathIterator; class Bounds { public: Bounds() : mValid(false) {} Bounds(const agg::trans_affine& trans, pathIterator& helper, double scale, const AST::CommandInfo& attr, agg::point_d* cent = NULL, double* area = NULL); // set bounds to be the bounds of this shape, transformed bool valid() { return mValid; } Bounds dilate(agg::point_d& cent, double dilation) const; Bounds dilate(double dilation) const; void merge(const Bounds& b) // merge the other bounds into this bounds { if (mValid && b.mValid) { if (b.mMin_X < mMin_X) mMin_X = b.mMin_X; if (b.mMax_X > mMax_X) mMax_X = b.mMax_X; if (b.mMin_Y < mMin_Y) mMin_Y = b.mMin_Y; if (b.mMax_Y > mMax_Y) mMax_Y = b.mMax_Y; } else if (b.mValid) { *this = b; } } void merge(double x, double y) // merge a point into this bounds { if (mValid) { if (x < mMin_X) mMin_X = x; if (x > mMax_X) mMax_X = x; if (y < mMin_Y) mMin_Y = y; if (y > mMax_Y) mMax_Y = y; } else { mMin_X = mMax_X = x; mMin_Y = mMax_Y = y; mValid = true; } } void merge(const agg::point_d& p) { merge(p.x, p.y); } // merge a point into this bounds Bounds operator+(const Bounds& other) { Bounds t(*this); t.merge(other); return t; } Bounds& operator+=(const Bounds& other) { merge(other); return *this; } Bounds operator+(const agg::point_d& p) { Bounds t(*this); t.merge(p); return t; } Bounds& operator+=(const agg::point_d& p) { merge(p); return *this; } Bounds interpolate(const Bounds& other, double alpha) const; // compute the interpolation between this bounds and the other // an alpha of 0.0 has no effect, an alpha of 1.0 give the other Bounds slewCenter(const Bounds& other, double alpha) const; // compute a new bounds who's center is slewed alpha of the way // toward the other center, yet incorporates all of the current // bounds double computeScale(int& width, int& height, double borderX, double borderY, bool modify = false, agg::trans_affine* trans = 0, bool exact = false); // Computes the scale factor of fitting this bounds into a canvas // of the given width and height, with the provided fixed border. // If modify is true, width and height are reset to the scaled size. // If trans isn't null, it is set to the needed transformation. // If exact is true then the diensions are not bumped to preserve parity. void gather(const Bounds& other, double weight); void update(const agg::trans_affine& trns, pathIterator& helper, double scale, const AST::CommandInfo& attr, agg::point_d* cent = NULL, double* area = NULL); double mMin_X, mMin_Y, mMax_X, mMax_Y; bool mValid; }; #endif // INCLUDE_BOUNDS_H contextfree-3.0.5+dfsg1.orig/src-common/SVGCanvas.cpp0000644000175000017500000002130112076364074021012 0ustar brambram// SVGCanvas.cpp // this file is part of Context Free // --------------------- // Copyright (C) 2006-2011 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #include "SVGCanvas.h" #include #include #include #include #include #include "primShape.h" #include "ast.h" #include using namespace std; void SVGCanvas::start(bool , const agg::rgba& , int width, int height) { //assert(clear); if (mCropped) { mWidth = width; mHeight = height; } agg::trans_affine_translation off((mWidth - width) / 2.0, (mHeight - height) / 2.0); mOffset = off.premultiply(agg::trans_affine(1.0, 0.0, 0.0, -1.0, 0.0, (double)mHeight)); mOutput << "" << mEndline; mOutput << "" << mEndline; mOutput << ""; indent(-3); mOutput << mEndline << "" << mEndline << " " << mEndline << ""; if (mDescription) { mOutput << mEndline << ""; indent(2); mOutput << mEndline; mOutput.write(mDescription, mLength); indent(-2); mOutput << mEndline << ""; } } void SVGCanvas::end() { indent(-2); mOutput << mEndline << "" << mEndline; if (mOutputFile.is_open()) mOutputFile.close(); } void SVGCanvas::complete(RGBA8 c, agg::trans_affine tr, int padding, const AST::CommandInfo& attr, bool g) { int rgb = (c.r >> (RGBA8::base_shift - 8)) * 65536 + (c.g >> (RGBA8::base_shift - 8)) * 256 + (c.b >> (RGBA8::base_shift - 8)); const char* ending = g ? ">" : "/>"; indent(padding); if (!g) mOutput << mEndline; if (attr.mFlags & AST::CF_FILL) { mOutput << "stroke=\"none\" fill=\"#" << hex << setw(6) << setfill('0') << rgb << dec << "\"" << setfill(' '); if (c.a < RGBA8::base_mask) mOutput << " fill-opacity=\"" << c.opacity() << "\""; if (attr.mFlags & AST::CF_EVEN_ODD) mOutput << " fill-rule=\"evenodd\""; else mOutput << " fill-rule=\"nonzero\""; } else { mOutput << "fill=\"none\" stroke=\"#" << hex << setw(6) << setfill('0') << rgb << dec << "\"" << setfill(' '); if (c.a < RGBA8::base_mask) mOutput << " stroke-opacity=\"" << c.opacity() << "\""; if (attr.mFlags & AST::CF_ISO_WIDTH) { double scaledWidth = attr.mStrokeWidth * sqrt(fabs(tr.determinant())); mOutput << mEndline << "stroke-width=\"" << scaledWidth << "\""; } else { mOutput << mEndline << "stroke-width=\"" << attr.mStrokeWidth << "\""; } mOutput << " stroke-linecap=\""; switch ((attr.mFlags >> 4) & 15) { case agg::square_cap: mOutput << "butt"; break; case agg::round_cap: mOutput << "circle"; break; default: mOutput << "miter"; break; } mOutput << "\" stroke-linejoin=\""; switch (attr.mFlags & 15) { case agg::bevel_join: mOutput << "bevel"; break; case agg::round_join: mOutput << "round"; break; default: mOutput << "miter"; break; } mOutput << "\" stroke-miterlimit=\"" << attr.mMiterLimit << "\""; } if (attr.mFlags & AST::CF_ISO_WIDTH) { mOutput << ' ' << ending; } else { mOutput << mEndline << setprecision(8); mOutput << "transform=\"matrix(" << setw(10) << tr.sx << " " << setw(10) << tr.shy << " " << setw(10) << tr.shx << " " << setw(10) << tr.sy << " " << setw(10) << tr.tx << " " << setw(10) << tr.ty << ")\"" << ending; } indent(-padding); } void SVGCanvas::circle(RGBA8 c, agg::trans_affine tr) { tr *= mOffset; mOutput << mEndline << ""; } else { id = mNextPathID++; mPathIDMap[attrPath] = id; mOutput << mEndline << "vertex(&x, &y))) { if (attr.mFlags & AST::CF_ISO_WIDTH) tr.transform(&x, &y); switch (cmd & agg::path_cmd_mask) { case agg::path_cmd_move_to: mOutput << sep << "M " << x << ',' << y; break; case agg::path_cmd_line_to: mOutput << sep << "L " << x << ',' << y; break; case agg::path_cmd_curve3: mOutput << sep << "Q " << x << ',' << y; attr.mPath->vertex(&x, &y); if (attr.mFlags & AST::CF_ISO_WIDTH) tr.transform(&x, &y); mOutput << ' ' << x << ',' << y; break; case agg::path_cmd_curve4: mOutput << sep << "C " << x << ',' << y; attr.mPath->vertex(&x, &y); if (attr.mFlags & AST::CF_ISO_WIDTH) tr.transform(&x, &y); mOutput << ' ' << x << ',' << y; attr.mPath->vertex(&x, &y); if (attr.mFlags & AST::CF_ISO_WIDTH) tr.transform(&x, &y); mOutput << ' ' << x << ',' << y; break; case agg::path_cmd_end_poly: if (cmd & agg::path_flags_close) mOutput << sep << 'Z'; break; default: break; } sep = ' '; } if (sep == '"') mOutput << '"'; mOutput << "\"/>"; } indent(-2); mOutput << mEndline << ""; } void SVGCanvas::indent(int change) { if (change > 0) { for (int i = 0; i < change; ++i) mEndline[mPadding + i + 1] = ' '; } mPadding += change; mEndline[mPadding + 1] = '\0'; } SVGCanvas::SVGCanvas(const char* opath, int width, int height, bool crop, const char* desc, int length) : Canvas(width, height), mPadding(0), mNextPathID(1), mCropped(crop), mOutputFile(), mOutput(*opath ? mOutputFile : cout), mDescription(desc), mLength(length) { if (*opath) mOutputFile.open(opath); mEndline[0] = '\n'; mEndline[1] = '\0'; if (mLength == -1 && mDescription) mLength = (int)strlen(mDescription); } contextfree-3.0.5+dfsg1.orig/src-common/CmdInfo.h0000644000175000017500000000450412076364074020211 0ustar brambram// CmdInfo.h // this file is part of Context Free // --------------------- // Copyright (C) 2010-2011 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #ifndef INCLUDE_CMDINFO_H #define INCLUDE_CMDINFO_H #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS #endif #include #include #include "agg_path_storage.h" #include #include namespace AST { class ASTpathCommand; class ASTcompiledPath; struct CommandInfo { #if defined(__ppc__) || defined(__powerpc__) typedef uint32_t UIDtype; #else typedef uint64_t UIDtype; #endif int mFlags; double mMiterLimit; double mStrokeWidth; unsigned mIndex; agg::path_storage* mPath; UIDtype mPathUID; static const CommandInfo Default; CommandInfo() : mFlags(0), mMiterLimit(4.0), mStrokeWidth(0.1), mIndex(0), mPath(NULL), mPathUID(std::numeric_limits::max()) {}; CommandInfo(unsigned i, ASTcompiledPath* path, double w, const ASTpathCommand* c = NULL); void tryInit(unsigned i, ASTcompiledPath* path, double w, const ASTpathCommand* c = NULL); private: CommandInfo(unsigned i, agg::path_storage* p); void init(unsigned i, ASTcompiledPath* path, double w, const ASTpathCommand* c = NULL); }; typedef std::deque InfoCache; } #endif //INCLUDE_CMDINFO_Hcontextfree-3.0.5+dfsg1.orig/src-common/shapeSTL.h0000644000175000017500000001113612076364074020354 0ustar brambram// shapeSTL.h // this file is part of Context Free // --------------------- // Copyright (C) 2006-2007 Mark Lentczner - markl@glyphic.com // Copyright (C) 2012 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // Mark Lentczner can be contacted at markl@glyphic.com or at // Mark Lentczner, 1209 Villa St., Mountain View, CA 94041-1123, USA // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #ifndef INCLUDE_SHAPESTL_H #define INCLUDE_SHAPESTL_H #ifdef _WIN32 #pragma warning( disable : 4786 ) #endif #include #include #include #include #include #include #include "cfdg.h" #include "shape.h" #include "tempfile.h" class ShapeOp { public: ShapeOp() { }; virtual ~ShapeOp(); virtual void apply(const FinishedShape&) = 0; class iterator { public: iterator(const iterator& i) : mOp(i.mOp) { } iterator& operator++() { return *this; } iterator& operator++(int) { return *this; } iterator& operator*() { return *this; } iterator& operator=(const FinishedShape& s) { mOp.apply(s); return *this; } private: friend class ShapeOp; iterator(ShapeOp& op) : mOp(op) { } void operator=(const iterator&); // not defined: can't be assigned ShapeOp& mOp; }; iterator outputIterator() { return iterator(*this); } class function : public std::unary_function { public: function(const function& f) : mOp(f.mOp) { } void operator()(const FinishedShape& s) const { mOp.apply(s); } private: friend class ShapeOp; function(ShapeOp& op) : mOp(op) { } void operator=(const function&); // not defined: can't be assigned ShapeOp& mOp; }; function outputFunction() { return function(*this); } private: ShapeOp(const ShapeOp&); ShapeOp& operator=(const ShapeOp&); // not implemented, not copyable }; class OutputMerge { public: OutputMerge(AbstractSystem& system) : mSystem(system) { } ~OutputMerge(); typedef std::multiset ShapeSource; typedef ShapeSource::iterator ShapeIter; void addShapes(ShapeIter begin, ShapeIter end); typedef std::unary_function, void > TempFileAdderBase; class TempFileAdder: public TempFileAdderBase { public: void operator()(ref_ptr& t) { mOM.addTempFile(t); } private: TempFileAdder(OutputMerge& om) : mOM(om) { } TempFileAdder& operator=(const TempFileAdder&) { return *this; } OutputMerge& mOM; friend class OutputMerge; }; TempFileAdder tempFileAdder() { return TempFileAdder(*this); } void addTempFile(ref_ptr); template < typename O > void merge(O output) { while (!mSieve.empty()) { Sieve::iterator nextShape = mSieve.begin(); *output++ = nextShape->first; int i = nextShape->second; mSieve.erase(nextShape); insertNext(i); } } private: typedef std::istream_iterator FileIter; typedef std::vector FileStreams; typedef std::vector FileIters; AbstractSystem& mSystem; FileStreams mStreams; FileIters mIters; FileIter mFileEnd; ShapeIter mShapesNext; ShapeIter mShapesEnd; typedef std::map Sieve; typedef Sieve::value_type SievePair; Sieve mSieve; void insertNext(int i); OutputMerge& operator=(const OutputMerge&) { return *this; } }; #endif // INCLUDE_SHAPESTL_H contextfree-3.0.5+dfsg1.orig/src-common/agg-extras/0000755000175000017500000000000012245646004020552 5ustar brambramcontextfree-3.0.5+dfsg1.orig/src-common/agg-extras/agg_fast_ellipse.h0000644000175000017500000001005612076364074024223 0ustar brambram// agg_fast_ellipse.h // this file is part of Context Free // --------------------- // Copyright (C) 2006 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // //---------------------------------------------------------------------------- // // class fast_ellipse // //---------------------------------------------------------------------------- #ifndef AGG_FAST_ELLIPSE_INCLUDED #define AGG_FAST_ELLIPSE_INCLUDED #include "agg_basics.h" #include #ifdef _WIN32 #pragma warning( disable : 4146 ) #endif namespace agg { class fast_ellipse { public: fast_ellipse() : m_x(0.0), m_y(0.0), m_rx(0.0), m_ry(0.0), m_num(0), m_step(0), m_cosine(0), m_sine(0), m_size(0) { init_num(0); } fast_ellipse(double x, double y, double rx, double ry, unsigned num_steps) : m_x(x), m_y(y), m_rx(rx), m_ry(ry), m_num(0), m_step(0), m_cosine(0), m_sine(0), m_size(0) { init_num(num_steps); } ~fast_ellipse() { delete[] m_cosine; delete[] m_sine; } void init(double x, double y, double rx, double ry, unsigned num_steps); void rewind(unsigned); unsigned vertex(double* x, double* y); private: double m_x; double m_y; double m_rx; double m_ry; unsigned m_num; unsigned m_step; double* m_cosine; double* m_sine; unsigned m_size; void init_num(unsigned num_steps); }; inline void fast_ellipse::init(double x, double y, double rx, double ry, unsigned num_steps) { init_num(num_steps); m_x = x; m_y = y; m_rx = rx; m_ry = ry; m_step = 0; } inline void fast_ellipse::init_num(unsigned num_steps) { unsigned old_num = m_num; m_num = num_steps + ((-num_steps) & 7); // round to next highest 8 if (!m_num || m_num == old_num) return; if (m_num/4 > m_size) { delete[] m_cosine; delete[] m_sine; m_size = m_num / 2 > 25 ? m_num / 2 : 25; m_cosine = new double[m_size]; m_sine = new double[m_size]; } for (unsigned i = 0; i < m_num/8; i++) { double angle = (double(i) + 0.5) / double(m_num) * 2.0 * pi; m_sine[(m_num / 4) - i - 1] = m_cosine[i] = cos(angle); m_cosine[(m_num / 4) - i - 1] = m_sine[i] = sin(angle); } } inline void fast_ellipse::rewind(unsigned) { m_step = 0; } inline unsigned fast_ellipse::vertex(double* x, double* y) { if(m_step == m_num) { ++m_step; return path_cmd_end_poly | path_flags_close | path_flags_ccw; } if(m_step > m_num) return path_cmd_stop; int quadrant = m_step / (m_num / 4); int step = m_step % (m_num / 4); if (quadrant & 1) step = (m_num / 4) - step - 1; int ref_x = ((quadrant + 1) & 2) - 1; int ref_y = (quadrant & 2) - 1; *x = m_x + m_cosine[step] * ref_x * m_rx; *y = m_y + m_sine[step] * ref_y * m_ry; m_step++; return ((m_step == 1) ? path_cmd_move_to : path_cmd_line_to); } } #endif contextfree-3.0.5+dfsg1.orig/src-common/agg-extras/agg_copy_rect.h0000644000175000017500000001013512076364074023536 0ustar brambram// agg_copy_rect.h // this file is part of Context Free // --------------------- // Copyright (C) 2006 Mark Lentczner - markl@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // Mark Lentczner can be contacted at markl@glyphic.com or at // Mark Lentczner, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #ifndef AGG_COPY_RECT_INCLUDED #define AGG_COPY_RECT_INCLUDED #include "agg_color_gray.h" #include "agg_color_rgba.h" #include "agg_renderer_base.h" namespace agg { template class ColorConverter { public: static ToColor f(const FromColor& c) { return c; } }; template<> class ColorConverter { public: static gray16 f(const gray8& c) { return gray16(c.v << 8 | c.v, c.a << 8 | c.a); } }; template<> class ColorConverter { public: static rgba16 f(const gray8& c) { gray16 g16(c); return rgba16(g16); } }; template<> class ColorConverter { public: static gray8 f(const rgba16& c) { rgba8 c8(c.r >> 8, c.g >> 8, c.b >> 8, c.a >> 8); return gray8(c8); } }; template<> class ColorConverter { public: static rgba8 f(const rgba16& c) { return rgba8(c.r >> 8, c.g >> 8, c.b >> 8, c.a >> 8); } }; template<> class ColorConverter { public: static gray8 f(const gray16& c) { return gray8(c.v >> 8, c.a >> 8); } }; template<> class ColorConverter { public: static rgba8 f(const gray16& c) { return rgba8(c.v >> 8, c.v >> 8, c.v >> 8, c.a >> 8); } }; template void copy_rect( SrcPixelFormat& srcFormat, DstPixelFormat& dstFormat, const rect_i* rect_src_ptr = 0, int dst_dx = 0, int dst_dy = 0 ) { renderer_base srcRenderer(srcFormat); renderer_base dstRenderer(dstFormat); srcRenderer.reset_clipping(true); dstRenderer.reset_clipping(true); rect_i rsrc(0, 0, srcRenderer.width(), srcRenderer.height()); if(rect_src_ptr) { rsrc.x1 = rect_src_ptr->x1; rsrc.y1 = rect_src_ptr->y1; rsrc.x2 = rect_src_ptr->x2 + 1; rsrc.y2 = rect_src_ptr->y2 + 1; } rect_i rdst(rsrc.x1 + dst_dx, rsrc.y1 + dst_dy, rsrc.x2 + dst_dx, rsrc.y2 + dst_dy); rect_i rc = dstRenderer.clip_rect_area(rdst, rsrc, srcRenderer.width(), srcRenderer.height()); // this rect is 0,0,w,h if(rc.x2 <= rc.x1 || rc.y2 <= rc.y1) return; typedef typename SrcPixelFormat::color_type SrcColor; typedef typename DstPixelFormat::color_type DstColor; typedef ColorConverter Converter_type; // no need to use renderers to do this, everything has been clipped for (int y = 0; y < rc.y2; ++y) { for (int x = 0; x < rc.x2; ++x) { dstFormat.copy_pixel(rdst.x1 + x, rdst.y1 + y, Converter_type::f(srcFormat.pixel(rsrc.x1 + x, rsrc.y1 + y))); } } } } #endif // AGG_COPY_RECT_INCLUDED contextfree-3.0.5+dfsg1.orig/src-common/agg-extras/agg_trans_affine_time.h0000644000175000017500000002124712076364074025232 0ustar brambram//---------------------------------------------------------------------------- // Anti-Grain Geometry - Version 2.4 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) // Copyright (C) 2009 John Horigan ( john@glyphic.com ) // // Permission to copy, use, modify, sell and distribute this software // is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // //---------------------------------------------------------------------------- // Contact: john@glyphic.com // mcseem@antigrain.com // mcseemagg@yahoo.com // http://www.antigrain.com // //---------------------------------------------------------------------------- // // Affine transformation classes for time ranges. // //---------------------------------------------------------------------------- #ifndef AGG_TRANS_AFFINE_TIME_INCLUDED #define AGG_TRANS_AFFINE_TIME_INCLUDED #include #include "agg_basics.h" #include namespace agg { const double affine_time_epsilon = 1e-14; //============================================================trans_affine_time // // Affine transformation are linear transformations in Cartesian coordinates // (strictly speaking not only in Cartesian, but for the beginning we will // think so). In one dimension, they are scaling and translation. // //---------------------------------------------------------------------- struct trans_affine_time { double st, tbegin, tend; //------------------------------------------ Construction // Identity matrix trans_affine_time() : st(1.0), tbegin(0.0), tend(0.0) {} // Custom matrix. Usually used in derived classes trans_affine_time(double v0, double v1, double v2) : st(v0), tbegin(v1), tend(v2) {} // Custom matrix from m[3] explicit trans_affine_time(const double* m) : st(m[0]), tbegin(m[1]), tend(m[2]) {} //------------------------------------------ Operations // Reset - load an identity matrix const trans_affine_time& reset(); // Direct transformations operations const trans_affine_time& translate(double x, double y); const trans_affine_time& translate(double x); const trans_affine_time& scale(double s); // Multiply matrix to another one const trans_affine_time& multiply(const trans_affine_time& m); // Multiply "m" to "this" and assign the result to "this" const trans_affine_time& premultiply(const trans_affine_time& m); // Check if transform is valid bool is_valid(double epsilon = affine_time_epsilon) const; //------------------------------------------- Load/Store // Store matrix to an array [3] of double void store_to(double* m) const { *m++ = st; *m++ = tbegin; *m++ = tend; } // Load matrix from an array [3] of double const trans_affine_time& load_from(const double* m) { st = *m++; tbegin = *m++; tend = *m++; return *this; } // Load matrix from 3 doubles const trans_affine_time& load_from(double v0, double v1, double v2) { st = v0; tbegin = v1; tend = v2; return *this; } //------------------------------------------- Operators // Multiply the matrix by another one const trans_affine_time& operator *= (const trans_affine_time& m) { return multiply(m); } // Multiply the matrix by another one and return // the result in a separete matrix. trans_affine_time operator * (const trans_affine_time& m) const { return trans_affine_time(*this).multiply(m); } // Equal operator with default epsilon bool operator == (const trans_affine_time& m) const { return is_equal(m, affine_time_epsilon); } // Not Equal operator with default epsilon bool operator != (const trans_affine_time& m) const { return !is_equal(m, affine_time_epsilon); } // Check to see if it's an identity matrix bool is_identity(double epsilon = affine_time_epsilon) const; // Check to see if two matrices are equal bool is_equal(const trans_affine_time& m, double epsilon = affine_time_epsilon) const; // Check to see if two time ranges overlap bool overlaps(const trans_affine_time& m) const; // Determine the major parameters. Use with caution considering // possible degenerate cases. void translation(double* begin, double* end) const; }; //------------------------------------------------------------------------ inline const trans_affine_time& trans_affine_time::premultiply(const trans_affine_time& m) { trans_affine_time t = m; return *this = t.multiply(*this); } //====================================================trans_affine_time_scaling // Scaling matrix. x, y - scale coefficients by X and Y respectively class trans_affine_time_scaling : public trans_affine_time { public: trans_affine_time_scaling(double s) : trans_affine_time(s, 0.0, 0.0) {} }; //================================================trans_affine_time_translation // Translation matrix class trans_affine_time_translation : public trans_affine_time { public: trans_affine_time_translation(double begin, double end) : trans_affine_time(1.0, begin, end) {} }; //------------------------------------------------------------------------ inline const trans_affine_time& trans_affine_time::multiply(const trans_affine_time& m) { st = st * m.st; tbegin = tbegin * m.st + m.tbegin; tend = tend * m.st + m.tend; return *this; } //------------------------------------------------------------------------ inline const trans_affine_time& trans_affine_time::reset() { st = 1.0; tbegin = 0.0; tend = 0.0; return *this; } static inline double sign(double a) { return (a < -affine_time_epsilon) ? -1.0 : ((a > affine_time_epsilon) ? 1.0 : 0.0); } //------------------------------------------------------------------------ inline const trans_affine_time& trans_affine_time::scale(double s) { st *= s; tbegin *= s; tend *= s; return *this; } //------------------------------------------------------------------------ inline const trans_affine_time& trans_affine_time::translate(double x, double y) { tbegin += x; tend += y; return *this; } //------------------------------------------------------------------------ inline const trans_affine_time& trans_affine_time::translate(double x) { tbegin += x; tend += x; return *this; } //------------------------------------------------------------------------ inline bool trans_affine_time::is_identity(double epsilon) const { return is_equal_eps(st, 1.0, epsilon) && is_equal_eps(tbegin, 0.0, epsilon) && is_equal_eps(tend, 0.0, epsilon); } //------------------------------------------------------------------------ inline bool trans_affine_time::is_valid(double epsilon) const { return fabs(st) > epsilon && tbegin <= tend; } //------------------------------------------------------------------------ inline bool trans_affine_time::is_equal(const trans_affine_time& m, double epsilon) const { return is_equal_eps(st, m.st, epsilon) && is_equal_eps(tbegin, m.tbegin, epsilon) && is_equal_eps(tend, m.tend, epsilon); } //------------------------------------------------------------------------ inline bool trans_affine_time::overlaps(const trans_affine_time& m) const { return !(m.tbegin > tend || m.tend < tbegin); } //------------------------------------------------------------------------ inline void trans_affine_time::translation(double* begin, double* end) const { *begin = tbegin; *end = tend; } } #endif contextfree-3.0.5+dfsg1.orig/src-common/agg-extras/agg_trans_affine_1D.h0000644000175000017500000002505412076364074024540 0ustar brambram//---------------------------------------------------------------------------- // Anti-Grain Geometry - Version 2.4 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) // Copyright (C) 2009 John Horigan ( john@glyphic.com ) // // Permission to copy, use, modify, sell and distribute this software // is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // //---------------------------------------------------------------------------- // Contact: john@glyphic.com // mcseem@antigrain.com // mcseemagg@yahoo.com // http://www.antigrain.com // //---------------------------------------------------------------------------- // // Affine transformation classes in one dimension. // //---------------------------------------------------------------------------- #ifndef AGG_TRANS_AFFINE_1D_INCLUDED #define AGG_TRANS_AFFINE_1D_INCLUDED #include #include "agg_basics.h" namespace agg { const double affine_1D_epsilon = 1e-14; //============================================================trans_affine_1D // // Affine transformation are linear transformations in Cartesian coordinates // (strictly speaking not only in Cartesian, but for the beginning we will // think so). In one dimension, they are rotation and translation. // //---------------------------------------------------------------------- struct trans_affine_1D { double sz, tz; //------------------------------------------ Construction // Identity matrix trans_affine_1D() : sz(1.0), tz(0.0) {} // Custom matrix. Usually used in derived classes trans_affine_1D(double v0, double v1) : sz(v0), tz(v1) {} // Custom matrix from m[2] explicit trans_affine_1D(const double* m) : sz(m[0]), tz(m[1]) {} //------------------------------------------ Operations // Reset - load an identity matrix const trans_affine_1D& reset(); // Direct transformations operations const trans_affine_1D& translate(double z); const trans_affine_1D& scale(double s); // Multiply matrix to another one const trans_affine_1D& multiply(const trans_affine_1D& m); // Multiply "m" to "this" and assign the result to "this" const trans_affine_1D& premultiply(const trans_affine_1D& m); // Multiply matrix to inverse of another one const trans_affine_1D& multiply_inv(const trans_affine_1D& m); // Multiply inverse of "m" to "this" and assign the result to "this" const trans_affine_1D& premultiply_inv(const trans_affine_1D& m); // Invert matrix. Do not try to invert degenerate matrices, // there's no check for validity. If you set scale to 0 and // then try to invert matrix, expect unpredictable result. const trans_affine_1D& invert(); //------------------------------------------- Load/Store // Store matrix to an array [6] of double void store_to(double* m) const { *m++ = sz; *m++ = tz; } // Load matrix from an array [6] of double const trans_affine_1D& load_from(const double* m) { sz = *m++; tz = *m++; return *this; } //------------------------------------------- Operators // Multiply the matrix by another one const trans_affine_1D& operator *= (const trans_affine_1D& m) { return multiply(m); } // Multiply the matrix by inverse of another one const trans_affine_1D& operator /= (const trans_affine_1D& m) { return multiply_inv(m); } // Multiply the matrix by another one and return // the result in a separete matrix. trans_affine_1D operator * (const trans_affine_1D& m) const { return trans_affine_1D(*this).multiply(m); } // Multiply the matrix by inverse of another one // and return the result in a separete matrix. trans_affine_1D operator / (const trans_affine_1D& m) const { return trans_affine_1D(*this).multiply_inv(m); } // Calculate and return the inverse matrix trans_affine_1D operator ~ () const { trans_affine_1D ret = *this; return ret.invert(); } // Equal operator with default epsilon bool operator == (const trans_affine_1D& m) const { return is_equal(m, affine_1D_epsilon); } // Not Equal operator with default epsilon bool operator != (const trans_affine_1D& m) const { return !is_equal(m, affine_1D_epsilon); } //-------------------------------------------- Transformations // Direct transformation of z void transform(double* z) const; // Inverse transformation of z. It works slower than the // direct transformation. For massive operations it's better to // invert() the matrix and then use direct transformations. void inverse_transform(double* z) const; //-------------------------------------------- Auxiliary // Calculate the determinant of matrix double determinant() const { return sz; } // Calculate the reciprocal of the determinant double determinant_reciprocal() const { return 1.0 / (sz); } double scale() const; // Check to see if the matrix is not degenerate bool is_valid(double epsilon = affine_1D_epsilon) const; // Check to see if it's an identity matrix bool is_identity(double epsilon = affine_1D_epsilon) const; // Check to see if two matrices are equal bool is_equal(const trans_affine_1D& m, double epsilon = affine_1D_epsilon) const; // Determine the major parameters. Use with caution considering // possible degenerate cases. void translation(double* dz) const; }; //------------------------------------------------------------------------ inline void trans_affine_1D::transform(double* z) const { *z = *z * sz + tz; } //------------------------------------------------------------------------ inline void trans_affine_1D::inverse_transform(double* z) const { register double d = determinant_reciprocal(); *z = (*z - tz) * d; } //------------------------------------------------------------------------ inline double trans_affine_1D::scale() const { return fabs(sz); } //------------------------------------------------------------------------ inline const trans_affine_1D& trans_affine_1D::translate(double z) { tz += z; return *this; } //------------------------------------------------------------------------ inline const trans_affine_1D& trans_affine_1D::scale(double s) { double m = s; // Possible hint for the optimizer sz *= m; tz *= m; return *this; } //------------------------------------------------------------------------ inline const trans_affine_1D& trans_affine_1D::premultiply(const trans_affine_1D& m) { trans_affine_1D t = m; return *this = t.multiply(*this); } //------------------------------------------------------------------------ inline const trans_affine_1D& trans_affine_1D::multiply_inv(const trans_affine_1D& m) { trans_affine_1D t = m; t.invert(); return multiply(t); } //------------------------------------------------------------------------ inline const trans_affine_1D& trans_affine_1D::premultiply_inv(const trans_affine_1D& m) { trans_affine_1D t = m; t.invert(); return *this = t.multiply(*this); } //====================================================trans_affine_1D_scaling // Scaling matrix. x, y - scale coefficients by X and Y respectively class trans_affine_1D_scaling : public trans_affine_1D { public: trans_affine_1D_scaling(double s) : trans_affine_1D(s, 0.0) {} }; //================================================trans_affine_1D_translation // Translation matrix class trans_affine_1D_translation : public trans_affine_1D { public: trans_affine_1D_translation(double z) : trans_affine_1D(1.0, z) {} }; //------------------------------------------------------------------------ inline const trans_affine_1D& trans_affine_1D::invert() { double d = determinant_reciprocal(); sz = d; tz = -tz * d; return *this; } //------------------------------------------------------------------------ inline const trans_affine_1D& trans_affine_1D::multiply(const trans_affine_1D& m) { sz = sz * m.sz; tz = tz * m.sz + m.tz; return *this; } //------------------------------------------------------------------------ inline const trans_affine_1D& trans_affine_1D::reset() { sz = 1.0; tz = 0.0; return *this; } //------------------------------------------------------------------------ inline bool trans_affine_1D::is_identity(double epsilon) const { return is_equal_eps(sz, 1.0, epsilon) && is_equal_eps(tz, 0.0, epsilon); } //------------------------------------------------------------------------ inline bool trans_affine_1D::is_valid(double epsilon) const { return fabs(sz) > epsilon; } //------------------------------------------------------------------------ inline bool trans_affine_1D::is_equal(const trans_affine_1D& m, double epsilon) const { return is_equal_eps(sz, m.sz, epsilon) && is_equal_eps(tz, m.tz, epsilon); } //------------------------------------------------------------------------ inline void trans_affine_1D::translation(double* dz) const { *dz = tz; } } #endif contextfree-3.0.5+dfsg1.orig/src-common/agg-extras/agg_conv_centroid.h0000644000175000017500000000724112076364074024407 0ustar brambram//---------------------------------------------------------------------------- // agg_conv_centroid.h // this file is part of Context Free // --------------------- // Copyright (C) 2011 John Horigan - john@glyphic.com // // Permission to copy, use, modify, sell and distribute this software // is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // //---------------------------------------------------------------------------- // // class conv_centroid // //---------------------------------------------------------------------------- #ifndef AGG_CONV_CENTROID_INCLUDED #define AGG_CONV_CENTROID_INCLUDED #include "agg_basics.h" namespace agg { //----------------------------------------------------------conv_centroid template class conv_centroid { public: conv_centroid(VertexSource& source) : m_source(&source) { reset(); } void attach(VertexSource& source) { m_source = &source; } void reset() { m_first_poly = true; m_p0.x = m_p0.y = m_plast.x = m_plast.y = 0.0; m_area = 0.0; m_centroid.x = m_centroid.y = 0.0; m_average.x = m_average.y = 0.0; m_count = 0; } void rewind(unsigned path_id) { m_source->rewind(path_id); reset(); } unsigned vertex(double* x, double* y) { unsigned cmd = m_source->vertex(x, y) & path_cmd_mask; if (is_vertex(cmd)) { m_average.x += *x; m_average.y += *y; ++m_count; if (m_first_poly) { m_first_poly = false; m_p0.x = m_plast.x = *x; m_p0.y = m_plast.y = *y; } else { double term = *y * m_plast.x - *x * m_plast.y; m_area += 0.5 * term; m_centroid.x += (*x + m_plast.x) * term; m_centroid.y += (*y + m_plast.y) * term; m_plast.x = *x; m_plast.y = *y; } } else if (is_end_poly(cmd)) { m_first_poly = true; double term = m_p0.y * m_plast.x - m_p0.x * m_plast.y; m_area += 0.5 * term; m_centroid.x += (m_p0.x + m_plast.x) * term; m_centroid.y += (m_p0.y + m_plast.y) * term; } else if (is_stop(cmd)) { if (fabs(m_area) < 1e-34) { if (m_count) { m_centroid.x = m_average.x / m_count; m_centroid.y = m_average.y / m_count; } else { m_centroid.x = m_centroid.y = 0.0; } } else { m_centroid.x = m_centroid.x / (6.0 * m_area); m_centroid.y = m_centroid.y / (6.0 * m_area); } m_area = fabs(m_area); } return cmd; } double m_area; point_d m_centroid; private: conv_centroid(const conv_centroid&); const conv_centroid& operator = (const conv_centroid&); VertexSource* m_source; bool m_first_poly; point_d m_p0, m_plast, m_average; unsigned m_count; }; } #endif contextfree-3.0.5+dfsg1.orig/src-common/agg-extras/agg_renderer_fill.h0000644000175000017500000000416112076364074024365 0ustar brambram//---------------------------------------------------------------------------- // Anti-Grain Geometry - Version 2.4 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) // Copyright (C) 2009 John Horigan ( john@glyphic.com ) // // Permission to copy, use, modify, sell and distribute this software // is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // //---------------------------------------------------------------------------- // Contact: john@glyphic.com // mcseem@antigrain.com // mcseemagg@yahoo.com // http://www.antigrain.com // //---------------------------------------------------------------------------- // // class renderer_fill: extends class renderer_base by adding a fill() method // //---------------------------------------------------------------------------- #ifndef AGG_RENDERER_FILL_INCLUDED #define AGG_RENDERER_FILL_INCLUDED #include "agg_renderer_base.h" namespace agg { //-----------------------------------------------------------renderer_fill template class renderer_fill : public renderer_base { public: typedef PixelFormat pixfmt_type; typedef typename pixfmt_type::color_type color_type; typedef typename pixfmt_type::row_data row_data; //-------------------------------------------------------------------- renderer_fill() : renderer_base() {} explicit renderer_fill(pixfmt_type& ren) : renderer_base(ren) {} //-------------------------------------------------------------------- void fill(const color_type& c) { unsigned y; if(this->width()) { for(y = 0; y < this->height(); y++) { this->ren().blend_hline(0, y, this->width(), c, cover_mask); } } } }; } #endif // AGG_RENDERER_FILL_INCLUDED contextfree-3.0.5+dfsg1.orig/src-common/shapeSTL.cpp0000644000175000017500000000350612076364074020711 0ustar brambram// shapeSTL.cpp // this file is part of Context Free // --------------------- // Copyright (C) 2006-2007 Mark Lentczner - markl@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // Mark Lentczner can be contacted at markl@glyphic.com or at // Mark Lentczner, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #include "shapeSTL.h" using namespace std; ShapeOp::~ShapeOp() { } void OutputMerge::addTempFile(ref_ptr t) { istream* f = t->forRead(); mStreams.push_back(f); mIters.push_back(FileIter(*f)); insertNext((int)mIters.size() - 1); } void OutputMerge::addShapes(ShapeIter begin, ShapeIter end) { mShapesNext = begin; mShapesEnd = end; insertNext(-1); } OutputMerge::~OutputMerge() { for (FileStreams::iterator i = mStreams.begin(); i != mStreams.end(); ++i) { delete *i; } } void OutputMerge::insertNext(int i) { if (i < 0) { if (mShapesNext != mShapesEnd) { mSieve.insert(SievePair(*mShapesNext++, i)); } } else { FileIter& input = mIters[i]; if (input != mFileEnd) { mSieve.insert(SievePair(*input++, i)); } } } contextfree-3.0.5+dfsg1.orig/src-agg/0000755000175000017500000000000012245646004015756 5ustar brambramcontextfree-3.0.5+dfsg1.orig/src-agg/include/0000755000175000017500000000000012245646004017401 5ustar brambramcontextfree-3.0.5+dfsg1.orig/src-agg/include/agg_pixfmt_gray.h0000644000175000017500000005377712076364074022752 0ustar brambram//---------------------------------------------------------------------------- // Anti-Grain Geometry - Version 2.4 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) // // Permission to copy, use, modify, sell and distribute this software // is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // //---------------------------------------------------------------------------- // Contact: mcseem@antigrain.com // mcseemagg@yahoo.com // http://www.antigrain.com //---------------------------------------------------------------------------- // // Adaptation for high precision colors has been sponsored by // Liberty Technology Systems, Inc., visit http://lib-sys.com // // Liberty Technology Systems, Inc. is the provider of // PostScript and PDF technology for software developers. // //---------------------------------------------------------------------------- #ifndef AGG_PIXFMT_GRAY_INCLUDED #define AGG_PIXFMT_GRAY_INCLUDED #include #include "agg_basics.h" #include "agg_color_gray.h" #include "agg_rendering_buffer.h" namespace agg { //============================================================blender_gray template struct blender_gray { typedef ColorT color_type; typedef typename color_type::value_type value_type; typedef typename color_type::calc_type calc_type; enum base_scale_e { base_shift = color_type::base_shift }; // Blend pixels using the non-premultiplied form of Alvy-Ray Smith's // compositing function. Since the render buffer is opaque we skip the // initial premultiply and final demultiply. static AGG_INLINE void blend_pix(value_type* p, unsigned cv, unsigned alpha, unsigned cover) { alpha = color_type::int_mult_cover(alpha, cover); *p = (value_type)(color_type::int_lerp(*p, cv, alpha)); } static AGG_INLINE void blend_pix(value_type* p, unsigned cv, unsigned alpha) { *p = (value_type)(color_type::int_lerp(*p, cv, alpha)); } }; //======================================================blender_gray_pre template struct blender_gray_pre { typedef ColorT color_type; typedef typename color_type::value_type value_type; typedef typename color_type::calc_type calc_type; enum base_scale_e { base_shift = color_type::base_shift }; // Blend pixels using the premultiplied form of Alvy-Ray Smith's // compositing function. static AGG_INLINE void blend_pix(value_type* p, unsigned cv, unsigned alpha, unsigned cover) { cv = color_type::int_mult_cover(cv, cover); alpha = color_type::int_mult_cover(alpha, cover); *p = (value_type)(color_type::int_prelerp(*p, cv, alpha)); } static AGG_INLINE void blend_pix(value_type* p, unsigned cv, unsigned alpha) { *p = (value_type)(color_type::int_prelerp(*p, cv, alpha)); } }; //=====================================================apply_gamma_dir_gray template class apply_gamma_dir_gray { public: typedef typename ColorT::value_type value_type; apply_gamma_dir_gray(const GammaLut& gamma) : m_gamma(gamma) {} AGG_INLINE void operator () (value_type* p) { *p = m_gamma.dir(*p); } private: const GammaLut& m_gamma; }; //=====================================================apply_gamma_inv_gray template class apply_gamma_inv_gray { public: typedef typename ColorT::value_type value_type; apply_gamma_inv_gray(const GammaLut& gamma) : m_gamma(gamma) {} AGG_INLINE void operator () (value_type* p) { *p = m_gamma.inv(*p); } private: const GammaLut& m_gamma; }; //=================================================pixfmt_alpha_blend_gray template class pixfmt_alpha_blend_gray { public: typedef RenBuf rbuf_type; typedef typename rbuf_type::row_data row_data; typedef Blender blender_type; typedef typename blender_type::color_type color_type; typedef int order_type; // A fake one typedef typename color_type::value_type value_type; typedef typename color_type::calc_type calc_type; enum base_scale_e { base_shift = color_type::base_shift, base_scale = color_type::base_scale, base_mask = color_type::base_mask, pix_width = sizeof(value_type), pix_step = Step, pix_offset = Offset }; private: //-------------------------------------------------------------------- static AGG_INLINE void copy_or_blend_pix(value_type* p, const color_type& c, unsigned cover) { if (c.a) { if(c.a == base_mask && cover == cover_mask) { *p = c.v; } else { Blender::blend_pix(p, c.v, c.a, cover); } } } static AGG_INLINE void copy_or_blend_pix(value_type* p, const color_type& c) { if (c.a) { if(c.a == base_mask) { *p = c.v; } else { Blender::blend_pix(p, c.v, c.a); } } } public: //-------------------------------------------------------------------- explicit pixfmt_alpha_blend_gray(rbuf_type& rb) : m_rbuf(&rb) {} void attach(rbuf_type& rb) { m_rbuf = &rb; } //-------------------------------------------------------------------- template bool attach(PixFmt& pixf, int x1, int y1, int x2, int y2) { rect_i r(x1, y1, x2, y2); if(r.clip(rect_i(0, 0, pixf.width()-1, pixf.height()-1))) { int stride = pixf.stride(); m_rbuf->attach(pixf.pix_ptr(r.x1, stride < 0 ? r.y2 : r.y1), (r.x2 - r.x1) + 1, (r.y2 - r.y1) + 1, stride); return true; } return false; } //-------------------------------------------------------------------- AGG_INLINE unsigned width() const { return m_rbuf->width(); } AGG_INLINE unsigned height() const { return m_rbuf->height(); } AGG_INLINE int stride() const { return m_rbuf->stride(); } //-------------------------------------------------------------------- int8u* row_ptr(int y) { return m_rbuf->row_ptr(y); } const int8u* row_ptr(int y) const { return m_rbuf->row_ptr(y); } row_data row(int y) const { return m_rbuf->row(y); } const int8u* pix_ptr(int x, int y) const { return m_rbuf->row_ptr(y) + x * Step + Offset; } int8u* pix_ptr(int x, int y) { return m_rbuf->row_ptr(y) + x * Step + Offset; } //-------------------------------------------------------------------- AGG_INLINE static void make_pix(int8u* p, const color_type& c) { *(value_type*)p = c.v; } //-------------------------------------------------------------------- AGG_INLINE color_type pixel(int x, int y) const { value_type* p = (value_type*)m_rbuf->row_ptr(y) + x * Step + Offset; return color_type(*p); } //-------------------------------------------------------------------- AGG_INLINE void copy_pixel(int x, int y, const color_type& c) { *((value_type*)m_rbuf->row_ptr(x, y, 1) + x * Step + Offset) = c.v; } //-------------------------------------------------------------------- AGG_INLINE void blend_pixel(int x, int y, const color_type& c, int8u cover) { copy_or_blend_pix((value_type*) m_rbuf->row_ptr(x, y, 1) + x * Step + Offset, c, cover); } //-------------------------------------------------------------------- AGG_INLINE void copy_hline(int x, int y, unsigned len, const color_type& c) { value_type* p = (value_type*) m_rbuf->row_ptr(x, y, len) + x * Step + Offset; do { *p = c.v; p += Step; } while(--len); } //-------------------------------------------------------------------- AGG_INLINE void copy_vline(int x, int y, unsigned len, const color_type& c) { do { value_type* p = (value_type*) m_rbuf->row_ptr(x, y++, 1) + x * Step + Offset; *p = c.v; } while(--len); } //-------------------------------------------------------------------- void blend_hline(int x, int y, unsigned len, const color_type& c, int8u cover) { if (c.a) { value_type* p = (value_type*) m_rbuf->row_ptr(x, y, len) + x * Step + Offset; if(c.a == base_mask && cover == cover_mask) { do { *p = c.v; p += Step; } while(--len); } else { do { Blender::blend_pix(p, c.v, c.a, cover); p += Step; } while(--len); } } } //-------------------------------------------------------------------- void blend_vline(int x, int y, unsigned len, const color_type& c, int8u cover) { if (c.a) { value_type* p; if(c.a == base_mask && cover == cover_mask) { do { p = (value_type*) m_rbuf->row_ptr(x, y++, 1) + x * Step + Offset; *p = c.v; } while(--len); } else { do { p = (value_type*) m_rbuf->row_ptr(x, y++, 1) + x * Step + Offset; Blender::blend_pix(p, c.v, c.a, cover); } while(--len); } } } //-------------------------------------------------------------------- void blend_solid_hspan(int x, int y, unsigned len, const color_type& c, const int8u* covers) { if (c.a) { value_type* p = (value_type*) m_rbuf->row_ptr(x, y, len) + x * Step + Offset; do { if(c.a == base_mask && *covers == cover_mask) { *p = c.v; } else { Blender::blend_pix(p, c.v, c.a, *covers); } p += Step; ++covers; } while(--len); } } //-------------------------------------------------------------------- void blend_solid_vspan(int x, int y, unsigned len, const color_type& c, const int8u* covers) { if (c.a) { do { value_type* p = (value_type*) m_rbuf->row_ptr(x, y++, 1) + x * Step + Offset; if(c.a == base_mask && *covers == cover_mask) { *p = c.v; } else { Blender::blend_pix(p, c.v, c.a, *covers); } ++covers; } while(--len); } } //-------------------------------------------------------------------- void copy_color_hspan(int x, int y, unsigned len, const color_type* colors) { value_type* p = (value_type*) m_rbuf->row_ptr(x, y, len) + x * Step + Offset; do { *p = colors->v; p += Step; ++colors; } while(--len); } //-------------------------------------------------------------------- void copy_color_vspan(int x, int y, unsigned len, const color_type* colors) { do { value_type* p = (value_type*) m_rbuf->row_ptr(x, y++, 1) + x * Step + Offset; *p = colors->v; ++colors; } while(--len); } //-------------------------------------------------------------------- void blend_color_hspan(int x, int y, unsigned len, const color_type* colors, const int8u* covers, int8u cover) { value_type* p = (value_type*) m_rbuf->row_ptr(x, y, len) + x * Step + Offset; if(covers) { do { copy_or_blend_pix(p, *colors++, *covers++); p += Step; } while(--len); } else { if(cover == cover_mask) { do { if(colors->a == base_mask) { *p = colors->v; } else { copy_or_blend_pix(p, *colors); } p += Step; ++colors; } while(--len); } else { do { copy_or_blend_pix(p, *colors++, cover); p += Step; } while(--len); } } } //-------------------------------------------------------------------- void blend_color_vspan(int x, int y, unsigned len, const color_type* colors, const int8u* covers, int8u cover) { value_type* p; if(covers) { do { p = (value_type*) m_rbuf->row_ptr(x, y++, 1) + x * Step + Offset; copy_or_blend_pix(p, *colors++, *covers++); } while(--len); } else { if(cover == cover_mask) { do { p = (value_type*) m_rbuf->row_ptr(x, y++, 1) + x * Step + Offset; if(colors->a == base_mask) { *p = colors->v; } else { copy_or_blend_pix(p, *colors); } ++colors; } while(--len); } else { do { p = (value_type*) m_rbuf->row_ptr(x, y++, 1) + x * Step + Offset; copy_or_blend_pix(p, *colors++, cover); } while(--len); } } } //-------------------------------------------------------------------- template void for_each_pixel(Function f) { unsigned y; for(y = 0; y < height(); ++y) { row_data r = m_rbuf->row(y); if(r.ptr) { unsigned len = r.x2 - r.x1 + 1; value_type* p = (value_type*) m_rbuf->row_ptr(r.x1, y, len) + r.x1 * Step + Offset; do { f(p); p += Step; } while(--len); } } } //-------------------------------------------------------------------- template void apply_gamma_dir(const GammaLut& g) { for_each_pixel(apply_gamma_dir_gray(g)); } //-------------------------------------------------------------------- template void apply_gamma_inv(const GammaLut& g) { for_each_pixel(apply_gamma_inv_gray(g)); } //-------------------------------------------------------------------- template void copy_from(const RenBuf2& from, int xdst, int ydst, int xsrc, int ysrc, unsigned len) { const int8u* p = from.row_ptr(ysrc); if(p) { memmove(m_rbuf->row_ptr(xdst, ydst, len) + xdst * pix_width, p + xsrc * pix_width, len * pix_width); } } //-------------------------------------------------------------------- template void blend_from_color(const SrcPixelFormatRenderer& from, const color_type& color, int xdst, int ydst, int xsrc, int ysrc, unsigned len, int8u cover) { typedef typename SrcPixelFormatRenderer::value_type src_value_type; const src_value_type* psrc = (src_value_type*)from.row_ptr(ysrc); if(psrc) { value_type* pdst = (value_type*)m_rbuf->row_ptr(xdst, ydst, len) + xdst; do { copy_or_blend_pix(pdst, color, color_type::int_mult_cover(*psrc, cover)); ++psrc; ++pdst; } while(--len); } } //-------------------------------------------------------------------- template void blend_from_lut(const SrcPixelFormatRenderer& from, const color_type* color_lut, int xdst, int ydst, int xsrc, int ysrc, unsigned len, int8u cover) { typedef typename SrcPixelFormatRenderer::value_type src_value_type; const src_value_type* psrc = (src_value_type*)from.row_ptr(ysrc); if(psrc) { value_type* pdst = (value_type*)m_rbuf->row_ptr(xdst, ydst, len) + xdst; do { copy_or_blend_pix(pdst, color_lut[*psrc], cover); ++psrc; ++pdst; } while(--len); } } private: rbuf_type* m_rbuf; }; typedef blender_gray blender_gray8; typedef blender_gray_pre blender_gray8_pre; typedef blender_gray blender_gray16; typedef blender_gray_pre blender_gray16_pre; typedef pixfmt_alpha_blend_gray pixfmt_gray8; //----pixfmt_gray8 typedef pixfmt_alpha_blend_gray pixfmt_gray8_pre; //----pixfmt_gray8_pre typedef pixfmt_alpha_blend_gray pixfmt_gray16; //----pixfmt_gray16 typedef pixfmt_alpha_blend_gray pixfmt_gray16_pre; //----pixfmt_gray16_pre } #endif contextfree-3.0.5+dfsg1.orig/src-agg/include/agg_rasterizer_sl_clip.h0000644000175000017500000003115112076364074024276 0ustar brambram//---------------------------------------------------------------------------- // Anti-Grain Geometry - Version 2.4 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) // // Permission to copy, use, modify, sell and distribute this software // is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // //---------------------------------------------------------------------------- // Contact: mcseem@antigrain.com // mcseemagg@yahoo.com // http://www.antigrain.com //---------------------------------------------------------------------------- #ifndef AGG_RASTERIZER_SL_CLIP_INCLUDED #define AGG_RASTERIZER_SL_CLIP_INCLUDED #include "agg_clip_liang_barsky.h" namespace agg { //--------------------------------------------------------poly_max_coord_e enum poly_max_coord_e { poly_max_coord = (1 << 30) - 1 //----poly_max_coord }; //------------------------------------------------------------ras_conv_int struct ras_conv_int { typedef int coord_type; static AGG_INLINE int mul_div(double a, double b, double c) { return iround(a * b / c); } static int xi(int v) { return v; } static int yi(int v) { return v; } static int upscale(double v) { return iround(v * poly_subpixel_scale); } static int downscale(int v) { return v; } }; //--------------------------------------------------------ras_conv_int_sat struct ras_conv_int_sat { typedef int coord_type; static AGG_INLINE int mul_div(double a, double b, double c) { return saturation::iround(a * b / c); } static int xi(int v) { return v; } static int yi(int v) { return v; } static int upscale(double v) { return saturation::iround(v * poly_subpixel_scale); } static int downscale(int v) { return v; } }; //---------------------------------------------------------ras_conv_int_3x struct ras_conv_int_3x { typedef int coord_type; static AGG_INLINE int mul_div(double a, double b, double c) { return iround(a * b / c); } static int xi(int v) { return v * 3; } static int yi(int v) { return v; } static int upscale(double v) { return iround(v * poly_subpixel_scale); } static int downscale(int v) { return v; } }; //-----------------------------------------------------------ras_conv_dbl struct ras_conv_dbl { typedef double coord_type; static AGG_INLINE double mul_div(double a, double b, double c) { return a * b / c; } static int xi(double v) { return iround(v * poly_subpixel_scale); } static int yi(double v) { return iround(v * poly_subpixel_scale); } static double upscale(double v) { return v; } static double downscale(int v) { return v / double(poly_subpixel_scale); } }; //--------------------------------------------------------ras_conv_dbl_3x struct ras_conv_dbl_3x { typedef double coord_type; static AGG_INLINE double mul_div(double a, double b, double c) { return a * b / c; } static int xi(double v) { return iround(v * poly_subpixel_scale * 3); } static int yi(double v) { return iround(v * poly_subpixel_scale); } static double upscale(double v) { return v; } static double downscale(int v) { return v / double(poly_subpixel_scale); } }; //------------------------------------------------------rasterizer_sl_clip template class rasterizer_sl_clip { public: typedef Conv conv_type; typedef typename Conv::coord_type coord_type; typedef rect_base rect_type; //-------------------------------------------------------------------- rasterizer_sl_clip() : m_clip_box(0,0,0,0), m_x1(0), m_y1(0), m_f1(0), m_clipping(false) {} //-------------------------------------------------------------------- void reset_clipping() { m_clipping = false; } //-------------------------------------------------------------------- void clip_box(coord_type x1, coord_type y1, coord_type x2, coord_type y2) { m_clip_box = rect_type(x1, y1, x2, y2); m_clip_box.normalize(); m_clipping = true; } //-------------------------------------------------------------------- void move_to(coord_type x1, coord_type y1) { m_x1 = x1; m_y1 = y1; if(m_clipping) m_f1 = clipping_flags(x1, y1, m_clip_box); } private: //------------------------------------------------------------------------ template AGG_INLINE void line_clip_y(Rasterizer& ras, coord_type x1, coord_type y1, coord_type x2, coord_type y2, unsigned f1, unsigned f2) const { f1 &= 10; f2 &= 10; if((f1 | f2) == 0) { // Fully visible ras.line(Conv::xi(x1), Conv::yi(y1), Conv::xi(x2), Conv::yi(y2)); } else { if(f1 == f2) { // Invisible by Y return; } coord_type tx1 = x1; coord_type ty1 = y1; coord_type tx2 = x2; coord_type ty2 = y2; if(f1 & 8) // y1 < clip.y1 { tx1 = x1 + Conv::mul_div(m_clip_box.y1-y1, x2-x1, y2-y1); ty1 = m_clip_box.y1; } if(f1 & 2) // y1 > clip.y2 { tx1 = x1 + Conv::mul_div(m_clip_box.y2-y1, x2-x1, y2-y1); ty1 = m_clip_box.y2; } if(f2 & 8) // y2 < clip.y1 { tx2 = x1 + Conv::mul_div(m_clip_box.y1-y1, x2-x1, y2-y1); ty2 = m_clip_box.y1; } if(f2 & 2) // y2 > clip.y2 { tx2 = x1 + Conv::mul_div(m_clip_box.y2-y1, x2-x1, y2-y1); ty2 = m_clip_box.y2; } ras.line(Conv::xi(tx1), Conv::yi(ty1), Conv::xi(tx2), Conv::yi(ty2)); } } public: //-------------------------------------------------------------------- template void line_to(Rasterizer& ras, coord_type x2, coord_type y2) { if(m_clipping) { unsigned f2 = clipping_flags(x2, y2, m_clip_box); if((m_f1 & 10) == (f2 & 10) && (m_f1 & 10) != 0) { // Invisible by Y m_x1 = x2; m_y1 = y2; m_f1 = f2; return; } coord_type x1 = m_x1; coord_type y1 = m_y1; unsigned f1 = m_f1; coord_type y3, y4; unsigned f3, f4; switch(((f1 & 5) << 1) | (f2 & 5)) { case 0: // Visible by X line_clip_y(ras, x1, y1, x2, y2, f1, f2); break; case 1: // x2 > clip.x2 y3 = y1 + Conv::mul_div(m_clip_box.x2-x1, y2-y1, x2-x1); f3 = clipping_flags_y(y3, m_clip_box); line_clip_y(ras, x1, y1, m_clip_box.x2, y3, f1, f3); line_clip_y(ras, m_clip_box.x2, y3, m_clip_box.x2, y2, f3, f2); break; case 2: // x1 > clip.x2 y3 = y1 + Conv::mul_div(m_clip_box.x2-x1, y2-y1, x2-x1); f3 = clipping_flags_y(y3, m_clip_box); line_clip_y(ras, m_clip_box.x2, y1, m_clip_box.x2, y3, f1, f3); line_clip_y(ras, m_clip_box.x2, y3, x2, y2, f3, f2); break; case 3: // x1 > clip.x2 && x2 > clip.x2 line_clip_y(ras, m_clip_box.x2, y1, m_clip_box.x2, y2, f1, f2); break; case 4: // x2 < clip.x1 y3 = y1 + Conv::mul_div(m_clip_box.x1-x1, y2-y1, x2-x1); f3 = clipping_flags_y(y3, m_clip_box); line_clip_y(ras, x1, y1, m_clip_box.x1, y3, f1, f3); line_clip_y(ras, m_clip_box.x1, y3, m_clip_box.x1, y2, f3, f2); break; case 6: // x1 > clip.x2 && x2 < clip.x1 y3 = y1 + Conv::mul_div(m_clip_box.x2-x1, y2-y1, x2-x1); y4 = y1 + Conv::mul_div(m_clip_box.x1-x1, y2-y1, x2-x1); f3 = clipping_flags_y(y3, m_clip_box); f4 = clipping_flags_y(y4, m_clip_box); line_clip_y(ras, m_clip_box.x2, y1, m_clip_box.x2, y3, f1, f3); line_clip_y(ras, m_clip_box.x2, y3, m_clip_box.x1, y4, f3, f4); line_clip_y(ras, m_clip_box.x1, y4, m_clip_box.x1, y2, f4, f2); break; case 8: // x1 < clip.x1 y3 = y1 + Conv::mul_div(m_clip_box.x1-x1, y2-y1, x2-x1); f3 = clipping_flags_y(y3, m_clip_box); line_clip_y(ras, m_clip_box.x1, y1, m_clip_box.x1, y3, f1, f3); line_clip_y(ras, m_clip_box.x1, y3, x2, y2, f3, f2); break; case 9: // x1 < clip.x1 && x2 > clip.x2 y3 = y1 + Conv::mul_div(m_clip_box.x1-x1, y2-y1, x2-x1); y4 = y1 + Conv::mul_div(m_clip_box.x2-x1, y2-y1, x2-x1); f3 = clipping_flags_y(y3, m_clip_box); f4 = clipping_flags_y(y4, m_clip_box); line_clip_y(ras, m_clip_box.x1, y1, m_clip_box.x1, y3, f1, f3); line_clip_y(ras, m_clip_box.x1, y3, m_clip_box.x2, y4, f3, f4); line_clip_y(ras, m_clip_box.x2, y4, m_clip_box.x2, y2, f4, f2); break; case 12: // x1 < clip.x1 && x2 < clip.x1 line_clip_y(ras, m_clip_box.x1, y1, m_clip_box.x1, y2, f1, f2); break; } m_f1 = f2; } else { ras.line(Conv::xi(m_x1), Conv::yi(m_y1), Conv::xi(x2), Conv::yi(y2)); } m_x1 = x2; m_y1 = y2; } private: rect_type m_clip_box; coord_type m_x1; coord_type m_y1; unsigned m_f1; bool m_clipping; }; //---------------------------------------------------rasterizer_sl_no_clip class rasterizer_sl_no_clip { public: typedef ras_conv_int conv_type; typedef int coord_type; rasterizer_sl_no_clip() : m_x1(0), m_y1(0) {} void reset_clipping() {} void clip_box(coord_type x1, coord_type y1, coord_type x2, coord_type y2) {} void move_to(coord_type x1, coord_type y1) { m_x1 = x1; m_y1 = y1; } template void line_to(Rasterizer& ras, coord_type x2, coord_type y2) { ras.line(m_x1, m_y1, x2, y2); m_x1 = x2; m_y1 = y2; } private: int m_x1, m_y1; }; // -----rasterizer_sl_clip_int // -----rasterizer_sl_clip_int_sat // -----rasterizer_sl_clip_int_3x // -----rasterizer_sl_clip_dbl // -----rasterizer_sl_clip_dbl_3x //------------------------------------------------------------------------ typedef rasterizer_sl_clip rasterizer_sl_clip_int; typedef rasterizer_sl_clip rasterizer_sl_clip_int_sat; typedef rasterizer_sl_clip rasterizer_sl_clip_int_3x; typedef rasterizer_sl_clip rasterizer_sl_clip_dbl; typedef rasterizer_sl_clip rasterizer_sl_clip_dbl_3x; } #endif contextfree-3.0.5+dfsg1.orig/src-agg/include/agg_rendering_buffer.h0000644000175000017500000002327312076364074023713 0ustar brambram//---------------------------------------------------------------------------- // Anti-Grain Geometry - Version 2.4 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) // // Permission to copy, use, modify, sell and distribute this software // is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // //---------------------------------------------------------------------------- // Contact: mcseem@antigrain.com // mcseemagg@yahoo.com // http://www.antigrain.com //---------------------------------------------------------------------------- // // class rendering_buffer // //---------------------------------------------------------------------------- #ifndef AGG_RENDERING_BUFFER_INCLUDED #define AGG_RENDERING_BUFFER_INCLUDED #include "agg_array.h" namespace agg { //===========================================================row_accessor template class row_accessor { public: typedef const_row_info row_data; //------------------------------------------------------------------- row_accessor() : m_buf(0), m_start(0), m_width(0), m_height(0), m_stride(0) { } //-------------------------------------------------------------------- row_accessor(T* buf, unsigned width, unsigned height, int stride) : m_buf(0), m_start(0), m_width(0), m_height(0), m_stride(0) { attach(buf, width, height, stride); } //-------------------------------------------------------------------- void attach(T* buf, unsigned width, unsigned height, int stride) { m_buf = m_start = buf; m_width = width; m_height = height; m_stride = stride; if(stride < 0) { m_start = m_buf - int(height - 1) * stride; } } //-------------------------------------------------------------------- AGG_INLINE T* buf() { return m_buf; } AGG_INLINE const T* buf() const { return m_buf; } AGG_INLINE unsigned width() const { return m_width; } AGG_INLINE unsigned height() const { return m_height; } AGG_INLINE int stride() const { return m_stride; } AGG_INLINE unsigned stride_abs() const { return (m_stride < 0) ? unsigned(-m_stride) : unsigned(m_stride); } //-------------------------------------------------------------------- AGG_INLINE T* row_ptr(int, int y, unsigned) { return m_start + y * m_stride; } AGG_INLINE T* row_ptr(int y) { return m_start + y * m_stride; } AGG_INLINE const T* row_ptr(int y) const { return m_start + y * m_stride; } AGG_INLINE row_data row (int y) const { return row_data(0, m_width-1, row_ptr(y)); } //-------------------------------------------------------------------- template void copy_from(const RenBuf& src) { unsigned h = height(); if(src.height() < h) h = src.height(); unsigned l = stride_abs(); if(src.stride_abs() < l) l = src.stride_abs(); l *= sizeof(T); unsigned y; unsigned w = width(); for (y = 0; y < h; y++) { memcpy(row_ptr(0, y, w), src.row_ptr(y), l); } } //-------------------------------------------------------------------- void clear(T value) { unsigned y; unsigned w = width(); unsigned stride = stride_abs(); for(y = 0; y < height(); y++) { T* p = row_ptr(0, y, w); unsigned x; for(x = 0; x < stride; x++) { *p++ = value; } } } private: //-------------------------------------------------------------------- T* m_buf; // Pointer to renrdering buffer T* m_start; // Pointer to first pixel depending on stride unsigned m_width; // Width in pixels unsigned m_height; // Height in pixels int m_stride; // Number of bytes per row. Can be < 0 }; //==========================================================row_ptr_cache template class row_ptr_cache { public: typedef const_row_info row_data; //------------------------------------------------------------------- row_ptr_cache() : m_buf(0), m_rows(), m_width(0), m_height(0), m_stride(0) { } //-------------------------------------------------------------------- row_ptr_cache(T* buf, unsigned width, unsigned height, int stride) : m_buf(0), m_rows(), m_width(0), m_height(0), m_stride(0) { attach(buf, width, height, stride); } //-------------------------------------------------------------------- void attach(T* buf, unsigned width, unsigned height, int stride) { m_buf = buf; m_width = width; m_height = height; m_stride = stride; if(height > m_rows.size()) { m_rows.resize(height); } T* row_ptr = m_buf; if(stride < 0) { row_ptr = m_buf - int(height - 1) * stride; } T** rows = &m_rows[0]; while(height--) { *rows++ = row_ptr; row_ptr += stride; } } //-------------------------------------------------------------------- AGG_INLINE T* buf() { return m_buf; } AGG_INLINE const T* buf() const { return m_buf; } AGG_INLINE unsigned width() const { return m_width; } AGG_INLINE unsigned height() const { return m_height; } AGG_INLINE int stride() const { return m_stride; } AGG_INLINE unsigned stride_abs() const { return (m_stride < 0) ? unsigned(-m_stride) : unsigned(m_stride); } //-------------------------------------------------------------------- AGG_INLINE T* row_ptr(int, int y, unsigned) { return m_rows[y]; } AGG_INLINE T* row_ptr(int y) { return m_rows[y]; } AGG_INLINE const T* row_ptr(int y) const { return m_rows[y]; } AGG_INLINE row_data row (int y) const { return row_data(0, m_width-1, m_rows[y]); } //-------------------------------------------------------------------- T const* const* rows() const { return &m_rows[0]; } //-------------------------------------------------------------------- template void copy_from(const RenBuf& src) { unsigned h = height(); if(src.height() < h) h = src.height(); unsigned l = stride_abs(); if(src.stride_abs() < l) l = src.stride_abs(); l *= sizeof(T); unsigned y; unsigned w = width(); for (y = 0; y < h; y++) { memcpy(row_ptr(0, y, w), src.row_ptr(y), l); } } //-------------------------------------------------------------------- void clear(T value) { unsigned y; unsigned w = width(); unsigned stride = stride_abs(); for(y = 0; y < height(); y++) { T* p = row_ptr(0, y, w); unsigned x; for(x = 0; x < stride; x++) { *p++ = value; } } } private: //-------------------------------------------------------------------- T* m_buf; // Pointer to renrdering buffer pod_array m_rows; // Pointers to each row of the buffer unsigned m_width; // Width in pixels unsigned m_height; // Height in pixels int m_stride; // Number of bytes per row. Can be < 0 }; //========================================================rendering_buffer // // The definition of the main type for accessing the rows in the frame // buffer. It provides functionality to navigate to the rows in a // rectangular matrix, from top to bottom or from bottom to top depending // on stride. // // row_accessor is cheap to create/destroy, but performs one multiplication // when calling row_ptr(). // // row_ptr_cache creates an array of pointers to rows, so, the access // via row_ptr() may be faster. But it requires memory allocation // when creating. For example, on typical Intel Pentium hardware // row_ptr_cache speeds span_image_filter_rgb_nn up to 10% // // It's used only in short hand typedefs like pixfmt_rgba32 and can be // redefined in agg_config.h // In real applications you can use both, depending on your needs //------------------------------------------------------------------------ #ifdef AGG_RENDERING_BUFFER typedef AGG_RENDERING_BUFFER rendering_buffer; #else // typedef row_ptr_cache rendering_buffer; typedef row_accessor rendering_buffer; #endif } #endif contextfree-3.0.5+dfsg1.orig/src-agg/include/agg_vcgen_contour.h0000644000175000017500000000657412076364074023265 0ustar brambram//---------------------------------------------------------------------------- // Anti-Grain Geometry - Version 2.4 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) // // Permission to copy, use, modify, sell and distribute this software // is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // //---------------------------------------------------------------------------- // Contact: mcseem@antigrain.com // mcseemagg@yahoo.com // http://www.antigrain.com //---------------------------------------------------------------------------- #ifndef AGG_VCGEN_CONTOUR_INCLUDED #define AGG_VCGEN_CONTOUR_INCLUDED #include "agg_math_stroke.h" namespace agg { //----------------------------------------------------------vcgen_contour // // See Implementation agg_vcgen_contour.cpp // class vcgen_contour { enum status_e { initial, ready, outline, out_vertices, end_poly, stop }; public: typedef vertex_sequence vertex_storage; typedef pod_bvector coord_storage; vcgen_contour(); void line_cap(line_cap_e lc) { m_stroker.line_cap(lc); } void line_join(line_join_e lj) { m_stroker.line_join(lj); } void inner_join(inner_join_e ij) { m_stroker.inner_join(ij); } line_cap_e line_cap() const { return m_stroker.line_cap(); } line_join_e line_join() const { return m_stroker.line_join(); } inner_join_e inner_join() const { return m_stroker.inner_join(); } void width(double w) { m_stroker.width(m_width = w); } void miter_limit(double ml) { m_stroker.miter_limit(ml); } void miter_limit_theta(double t) { m_stroker.miter_limit_theta(t); } void inner_miter_limit(double ml) { m_stroker.inner_miter_limit(ml); } void approximation_scale(double as) { m_stroker.approximation_scale(as); } double width() const { return m_width; } double miter_limit() const { return m_stroker.miter_limit(); } double inner_miter_limit() const { return m_stroker.inner_miter_limit(); } double approximation_scale() const { return m_stroker.approximation_scale(); } void auto_detect_orientation(bool v) { m_auto_detect = v; } bool auto_detect_orientation() const { return m_auto_detect; } // Generator interface void remove_all(); void add_vertex(double x, double y, unsigned cmd); // Vertex Source Interface void rewind(unsigned path_id); unsigned vertex(double* x, double* y); private: vcgen_contour(const vcgen_contour&); const vcgen_contour& operator = (const vcgen_contour&); math_stroke m_stroker; double m_width; vertex_storage m_src_vertices; coord_storage m_out_vertices; status_e m_status; unsigned m_src_vertex; unsigned m_out_vertex; unsigned m_closed; unsigned m_orientation; bool m_auto_detect; }; } #endif contextfree-3.0.5+dfsg1.orig/src-agg/include/agg_conv_stroke.h0000644000175000017500000000611412076364074022734 0ustar brambram//---------------------------------------------------------------------------- // Anti-Grain Geometry - Version 2.4 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) // // Permission to copy, use, modify, sell and distribute this software // is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // //---------------------------------------------------------------------------- // Contact: mcseem@antigrain.com // mcseemagg@yahoo.com // http://www.antigrain.com //---------------------------------------------------------------------------- // // conv_stroke // //---------------------------------------------------------------------------- #ifndef AGG_CONV_STROKE_INCLUDED #define AGG_CONV_STROKE_INCLUDED #include "agg_basics.h" #include "agg_vcgen_stroke.h" #include "agg_conv_adaptor_vcgen.h" namespace agg { //-------------------------------------------------------------conv_stroke template struct conv_stroke : public conv_adaptor_vcgen { typedef Markers marker_type; typedef conv_adaptor_vcgen base_type; conv_stroke(VertexSource& vs) : conv_adaptor_vcgen(vs) { } void line_cap(line_cap_e lc) { base_type::generator().line_cap(lc); } void line_join(line_join_e lj) { base_type::generator().line_join(lj); } void inner_join(inner_join_e ij) { base_type::generator().inner_join(ij); } line_cap_e line_cap() const { return base_type::generator().line_cap(); } line_join_e line_join() const { return base_type::generator().line_join(); } inner_join_e inner_join() const { return base_type::generator().inner_join(); } void width(double w) { base_type::generator().width(w); } void miter_limit(double ml) { base_type::generator().miter_limit(ml); } void miter_limit_theta(double t) { base_type::generator().miter_limit_theta(t); } void inner_miter_limit(double ml) { base_type::generator().inner_miter_limit(ml); } void approximation_scale(double as) { base_type::generator().approximation_scale(as); } double width() const { return base_type::generator().width(); } double miter_limit() const { return base_type::generator().miter_limit(); } double inner_miter_limit() const { return base_type::generator().inner_miter_limit(); } double approximation_scale() const { return base_type::generator().approximation_scale(); } void shorten(double s) { base_type::generator().shorten(s); } double shorten() const { return base_type::generator().shorten(); } private: conv_stroke(const conv_stroke&); const conv_stroke& operator = (const conv_stroke&); }; } #endif contextfree-3.0.5+dfsg1.orig/src-agg/include/agg_curves.h0000644000175000017500000004666512076364074021726 0ustar brambram//---------------------------------------------------------------------------- // Anti-Grain Geometry - Version 2.4 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) // Copyright (C) 2005 Tony Juricic (tonygeek@yahoo.com) // // Permission to copy, use, modify, sell and distribute this software // is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // //---------------------------------------------------------------------------- // Contact: mcseem@antigrain.com // mcseemagg@yahoo.com // http://www.antigrain.com //---------------------------------------------------------------------------- #ifndef AGG_CURVES_INCLUDED #define AGG_CURVES_INCLUDED #include "agg_array.h" namespace agg { // See Implementation agg_curves.cpp //--------------------------------------------curve_approximation_method_e enum curve_approximation_method_e { curve_inc, curve_div }; //--------------------------------------------------------------curve3_inc class curve3_inc { public: curve3_inc() : m_num_steps(0), m_step(0), m_scale(1.0) { } curve3_inc(double x1, double y1, double x2, double y2, double x3, double y3) : m_num_steps(0), m_step(0), m_scale(1.0) { init(x1, y1, x2, y2, x3, y3); } void reset() { m_num_steps = 0; m_step = -1; } void init(double x1, double y1, double x2, double y2, double x3, double y3); void approximation_method(curve_approximation_method_e) {} curve_approximation_method_e approximation_method() const { return curve_inc; } void approximation_scale(double s); double approximation_scale() const; void angle_tolerance(double) {} double angle_tolerance() const { return 0.0; } void cusp_limit(double) {} double cusp_limit() const { return 0.0; } void rewind(unsigned path_id); unsigned vertex(double* x, double* y); private: int m_num_steps; int m_step; double m_scale; double m_start_x; double m_start_y; double m_end_x; double m_end_y; double m_fx; double m_fy; double m_dfx; double m_dfy; double m_ddfx; double m_ddfy; double m_saved_fx; double m_saved_fy; double m_saved_dfx; double m_saved_dfy; }; //-------------------------------------------------------------curve3_div class curve3_div { public: curve3_div() : m_approximation_scale(1.0), m_angle_tolerance(0.0), m_count(0) {} curve3_div(double x1, double y1, double x2, double y2, double x3, double y3) : m_approximation_scale(1.0), m_angle_tolerance(0.0), m_count(0) { init(x1, y1, x2, y2, x3, y3); } void reset() { m_points.remove_all(); m_count = 0; } void init(double x1, double y1, double x2, double y2, double x3, double y3); void approximation_method(curve_approximation_method_e) {} curve_approximation_method_e approximation_method() const { return curve_div; } void approximation_scale(double s) { m_approximation_scale = s; } double approximation_scale() const { return m_approximation_scale; } void angle_tolerance(double a) { m_angle_tolerance = a; } double angle_tolerance() const { return m_angle_tolerance; } void cusp_limit(double) {} double cusp_limit() const { return 0.0; } void rewind(unsigned) { m_count = 0; } unsigned vertex(double* x, double* y) { if(m_count >= m_points.size()) return path_cmd_stop; const point_d& p = m_points[m_count++]; *x = p.x; *y = p.y; return (m_count == 1) ? path_cmd_move_to : path_cmd_line_to; } private: void bezier(double x1, double y1, double x2, double y2, double x3, double y3); void recursive_bezier(double x1, double y1, double x2, double y2, double x3, double y3, unsigned level); double m_approximation_scale; double m_distance_tolerance_square; double m_angle_tolerance; unsigned m_count; pod_bvector m_points; }; //-------------------------------------------------------------curve4_points struct curve4_points { double cp[8]; curve4_points() {} curve4_points(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4) { cp[0] = x1; cp[1] = y1; cp[2] = x2; cp[3] = y2; cp[4] = x3; cp[5] = y3; cp[6] = x4; cp[7] = y4; } void init(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4) { cp[0] = x1; cp[1] = y1; cp[2] = x2; cp[3] = y2; cp[4] = x3; cp[5] = y3; cp[6] = x4; cp[7] = y4; } double operator [] (unsigned i) const { return cp[i]; } double& operator [] (unsigned i) { return cp[i]; } }; //-------------------------------------------------------------curve4_inc class curve4_inc { public: curve4_inc() : m_num_steps(0), m_step(0), m_scale(1.0) { } curve4_inc(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4) : m_num_steps(0), m_step(0), m_scale(1.0) { init(x1, y1, x2, y2, x3, y3, x4, y4); } curve4_inc(const curve4_points& cp) : m_num_steps(0), m_step(0), m_scale(1.0) { init(cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]); } void reset() { m_num_steps = 0; m_step = -1; } void init(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4); void init(const curve4_points& cp) { init(cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]); } void approximation_method(curve_approximation_method_e) {} curve_approximation_method_e approximation_method() const { return curve_inc; } void approximation_scale(double s); double approximation_scale() const; void angle_tolerance(double) {} double angle_tolerance() const { return 0.0; } void cusp_limit(double) {} double cusp_limit() const { return 0.0; } void rewind(unsigned path_id); unsigned vertex(double* x, double* y); private: int m_num_steps; int m_step; double m_scale; double m_start_x; double m_start_y; double m_end_x; double m_end_y; double m_fx; double m_fy; double m_dfx; double m_dfy; double m_ddfx; double m_ddfy; double m_dddfx; double m_dddfy; double m_saved_fx; double m_saved_fy; double m_saved_dfx; double m_saved_dfy; double m_saved_ddfx; double m_saved_ddfy; }; //-------------------------------------------------------catrom_to_bezier inline curve4_points catrom_to_bezier(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4) { // Trans. matrix Catmull-Rom to Bezier // // 0 1 0 0 // -1/6 1 1/6 0 // 0 1/6 1 -1/6 // 0 0 1 0 // return curve4_points( x2, y2, (-x1 + 6*x2 + x3) / 6, (-y1 + 6*y2 + y3) / 6, ( x2 + 6*x3 - x4) / 6, ( y2 + 6*y3 - y4) / 6, x3, y3); } //----------------------------------------------------------------------- inline curve4_points catrom_to_bezier(const curve4_points& cp) { return catrom_to_bezier(cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]); } //-----------------------------------------------------ubspline_to_bezier inline curve4_points ubspline_to_bezier(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4) { // Trans. matrix Uniform BSpline to Bezier // // 1/6 4/6 1/6 0 // 0 4/6 2/6 0 // 0 2/6 4/6 0 // 0 1/6 4/6 1/6 // return curve4_points( (x1 + 4*x2 + x3) / 6, (y1 + 4*y2 + y3) / 6, (4*x2 + 2*x3) / 6, (4*y2 + 2*y3) / 6, (2*x2 + 4*x3) / 6, (2*y2 + 4*y3) / 6, (x2 + 4*x3 + x4) / 6, (y2 + 4*y3 + y4) / 6); } //----------------------------------------------------------------------- inline curve4_points ubspline_to_bezier(const curve4_points& cp) { return ubspline_to_bezier(cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]); } //------------------------------------------------------hermite_to_bezier inline curve4_points hermite_to_bezier(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4) { // Trans. matrix Hermite to Bezier // // 1 0 0 0 // 1 0 1/3 0 // 0 1 0 -1/3 // 0 1 0 0 // return curve4_points( x1, y1, (3*x1 + x3) / 3, (3*y1 + y3) / 3, (3*x2 - x4) / 3, (3*y2 - y4) / 3, x2, y2); } //----------------------------------------------------------------------- inline curve4_points hermite_to_bezier(const curve4_points& cp) { return hermite_to_bezier(cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]); } //-------------------------------------------------------------curve4_div class curve4_div { public: curve4_div() : m_approximation_scale(1.0), m_angle_tolerance(0.0), m_cusp_limit(0.0), m_count(0) {} curve4_div(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4) : m_approximation_scale(1.0), m_angle_tolerance(0.0), m_cusp_limit(0.0), m_count(0) { init(x1, y1, x2, y2, x3, y3, x4, y4); } curve4_div(const curve4_points& cp) : m_approximation_scale(1.0), m_angle_tolerance(0.0), m_count(0) { init(cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]); } void reset() { m_points.remove_all(); m_count = 0; } void init(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4); void init(const curve4_points& cp) { init(cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]); } void approximation_method(curve_approximation_method_e) {} curve_approximation_method_e approximation_method() const { return curve_div; } void approximation_scale(double s) { m_approximation_scale = s; } double approximation_scale() const { return m_approximation_scale; } void angle_tolerance(double a) { m_angle_tolerance = a; } double angle_tolerance() const { return m_angle_tolerance; } void cusp_limit(double v) { m_cusp_limit = (v == 0.0) ? 0.0 : pi - v; } double cusp_limit() const { return (m_cusp_limit == 0.0) ? 0.0 : pi - m_cusp_limit; } void rewind(unsigned) { m_count = 0; } unsigned vertex(double* x, double* y) { if(m_count >= m_points.size()) return path_cmd_stop; const point_d& p = m_points[m_count++]; *x = p.x; *y = p.y; return (m_count == 1) ? path_cmd_move_to : path_cmd_line_to; } private: void bezier(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4); void recursive_bezier(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4, unsigned level); double m_approximation_scale; double m_distance_tolerance_square; double m_angle_tolerance; double m_cusp_limit; unsigned m_count; pod_bvector m_points; }; //-----------------------------------------------------------------curve3 class curve3 { public: curve3() : m_approximation_method(curve_div) {} curve3(double x1, double y1, double x2, double y2, double x3, double y3) : m_approximation_method(curve_div) { init(x1, y1, x2, y2, x3, y3); } void reset() { m_curve_inc.reset(); m_curve_div.reset(); } void init(double x1, double y1, double x2, double y2, double x3, double y3) { if(m_approximation_method == curve_inc) { m_curve_inc.init(x1, y1, x2, y2, x3, y3); } else { m_curve_div.init(x1, y1, x2, y2, x3, y3); } } void approximation_method(curve_approximation_method_e v) { m_approximation_method = v; } curve_approximation_method_e approximation_method() const { return m_approximation_method; } void approximation_scale(double s) { m_curve_inc.approximation_scale(s); m_curve_div.approximation_scale(s); } double approximation_scale() const { return m_curve_inc.approximation_scale(); } void angle_tolerance(double a) { m_curve_div.angle_tolerance(a); } double angle_tolerance() const { return m_curve_div.angle_tolerance(); } void cusp_limit(double v) { m_curve_div.cusp_limit(v); } double cusp_limit() const { return m_curve_div.cusp_limit(); } void rewind(unsigned path_id) { if(m_approximation_method == curve_inc) { m_curve_inc.rewind(path_id); } else { m_curve_div.rewind(path_id); } } unsigned vertex(double* x, double* y) { if(m_approximation_method == curve_inc) { return m_curve_inc.vertex(x, y); } return m_curve_div.vertex(x, y); } private: curve3_inc m_curve_inc; curve3_div m_curve_div; curve_approximation_method_e m_approximation_method; }; //-----------------------------------------------------------------curve4 class curve4 { public: curve4() : m_approximation_method(curve_div) {} curve4(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4) : m_approximation_method(curve_div) { init(x1, y1, x2, y2, x3, y3, x4, y4); } curve4(const curve4_points& cp) : m_approximation_method(curve_div) { init(cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]); } void reset() { m_curve_inc.reset(); m_curve_div.reset(); } void init(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4) { if(m_approximation_method == curve_inc) { m_curve_inc.init(x1, y1, x2, y2, x3, y3, x4, y4); } else { m_curve_div.init(x1, y1, x2, y2, x3, y3, x4, y4); } } void init(const curve4_points& cp) { init(cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]); } void approximation_method(curve_approximation_method_e v) { m_approximation_method = v; } curve_approximation_method_e approximation_method() const { return m_approximation_method; } void approximation_scale(double s) { m_curve_inc.approximation_scale(s); m_curve_div.approximation_scale(s); } double approximation_scale() const { return m_curve_inc.approximation_scale(); } void angle_tolerance(double v) { m_curve_div.angle_tolerance(v); } double angle_tolerance() const { return m_curve_div.angle_tolerance(); } void cusp_limit(double v) { m_curve_div.cusp_limit(v); } double cusp_limit() const { return m_curve_div.cusp_limit(); } void rewind(unsigned path_id) { if(m_approximation_method == curve_inc) { m_curve_inc.rewind(path_id); } else { m_curve_div.rewind(path_id); } } unsigned vertex(double* x, double* y) { if(m_approximation_method == curve_inc) { return m_curve_inc.vertex(x, y); } return m_curve_div.vertex(x, y); } private: curve4_inc m_curve_inc; curve4_div m_curve_div; curve_approximation_method_e m_approximation_method; }; } #endif contextfree-3.0.5+dfsg1.orig/src-agg/include/agg_pixfmt_rgba.h0000644000175000017500000035366412076364074022721 0ustar brambram//---------------------------------------------------------------------------- // Anti-Grain Geometry - Version 2.4 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) // // Permission to copy, use, modify, sell and distribute this software // is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // //---------------------------------------------------------------------------- // Contact: mcseem@antigrain.com // mcseemagg@yahoo.com // http://www.antigrain.com //---------------------------------------------------------------------------- // // Adaptation for high precision colors has been sponsored by // Liberty Technology Systems, Inc., visit http://lib-sys.com // // Liberty Technology Systems, Inc. is the provider of // PostScript and PDF technology for software developers. // //---------------------------------------------------------------------------- #ifndef AGG_PIXFMT_RGBA_INCLUDED #define AGG_PIXFMT_RGBA_INCLUDED #include #include #include "agg_basics.h" #include "agg_color_rgba.h" #include "agg_rendering_buffer.h" namespace agg { //=========================================================multiplier_rgba template struct multiplier_rgba { typedef typename ColorT::value_type value_type; typedef typename ColorT::calc_type calc_type; //-------------------------------------------------------------------- static AGG_INLINE void premultiply(value_type* p) { calc_type a = p[Order::A]; if(a < ColorT::base_mask) { if(a == 0) { p[Order::R] = p[Order::G] = p[Order::B] = 0; return; } p[Order::R] = value_type(ColorT::int_mult(p[Order::R], a)); p[Order::G] = value_type(ColorT::int_mult(p[Order::G], a)); p[Order::B] = value_type(ColorT::int_mult(p[Order::B], a)); } } //-------------------------------------------------------------------- static AGG_INLINE void demultiply(value_type* p) { calc_type a = p[Order::A]; if(a < ColorT::base_mask) { if(a == 0) { p[Order::R] = p[Order::G] = p[Order::B] = 0; return; } calc_type r = (calc_type(p[Order::R]) * ColorT::base_mask) / a; calc_type g = (calc_type(p[Order::G]) * ColorT::base_mask) / a; calc_type b = (calc_type(p[Order::B]) * ColorT::base_mask) / a; p[Order::R] = value_type((r > ColorT::base_mask) ? ColorT::base_mask : r); p[Order::G] = value_type((g > ColorT::base_mask) ? ColorT::base_mask : g); p[Order::B] = value_type((b > ColorT::base_mask) ? ColorT::base_mask : b); } } }; //=====================================================apply_gamma_dir_rgba template class apply_gamma_dir_rgba { public: typedef typename ColorT::value_type value_type; apply_gamma_dir_rgba(const GammaLut& gamma) : m_gamma(gamma) {} AGG_INLINE void operator () (value_type* p) { p[Order::R] = m_gamma.dir(p[Order::R]); p[Order::G] = m_gamma.dir(p[Order::G]); p[Order::B] = m_gamma.dir(p[Order::B]); } private: const GammaLut& m_gamma; }; //=====================================================apply_gamma_inv_rgba template class apply_gamma_inv_rgba { public: typedef typename ColorT::value_type value_type; apply_gamma_inv_rgba(const GammaLut& gamma) : m_gamma(gamma) {} AGG_INLINE void operator () (value_type* p) { p[Order::R] = m_gamma.inv(p[Order::R]); p[Order::G] = m_gamma.inv(p[Order::G]); p[Order::B] = m_gamma.inv(p[Order::B]); } private: const GammaLut& m_gamma; }; //=============================================================blender_rgba template struct blender_rgba { typedef ColorT color_type; typedef Order order_type; typedef typename color_type::value_type value_type; typedef typename color_type::calc_type calc_type; enum base_scale_e { base_shift = color_type::base_shift, base_mask = color_type::base_mask }; // Blend pixels using the non-premultiplied form of Alvy-Ray Smith's // compositing function. Since the render buffer is in fact premultiplied // we omit the initial premultiplication and final demultiplication. //-------------------------------------------------------------------- static AGG_INLINE void blend_pix(value_type* p, unsigned cr, unsigned cg, unsigned cb, unsigned alpha, unsigned cover) { alpha = color_type::int_mult_cover(alpha, cover); p[Order::R] = (value_type)(color_type::int_lerp(p[Order::R], cr, alpha)); p[Order::G] = (value_type)(color_type::int_lerp(p[Order::G], cg, alpha)); p[Order::B] = (value_type)(color_type::int_lerp(p[Order::B], cb, alpha)); p[Order::A] = (value_type)(color_type::int_prelerp(p[Order::A], alpha, alpha)); } //-------------------------------------------------------------------- static AGG_INLINE void blend_pix(value_type* p, unsigned cr, unsigned cg, unsigned cb, unsigned alpha) { p[Order::R] = (value_type)(color_type::int_lerp(p[Order::R], cr, alpha)); p[Order::G] = (value_type)(color_type::int_lerp(p[Order::G], cg, alpha)); p[Order::B] = (value_type)(color_type::int_lerp(p[Order::B], cb, alpha)); p[Order::A] = (value_type)(color_type::int_prelerp(p[Order::A], alpha, alpha)); } }; //========================================================blender_rgba_pre template struct blender_rgba_pre { typedef ColorT color_type; typedef Order order_type; typedef typename color_type::value_type value_type; typedef typename color_type::calc_type calc_type; enum base_scale_e { base_shift = color_type::base_shift, base_mask = color_type::base_mask }; // Blend pixels using the premultiplied form of Alvy-Ray Smith's // compositing function. //-------------------------------------------------------------------- static AGG_INLINE void blend_pix(value_type* p, unsigned cr, unsigned cg, unsigned cb, unsigned alpha, unsigned cover) { cr = color_type::int_mult_cover(cr, cover); cg = color_type::int_mult_cover(cg, cover); cb = color_type::int_mult_cover(cb, cover); alpha = color_type::int_mult_cover(alpha, cover); p[Order::R] = (value_type)(color_type::int_prelerp(p[Order::R], cr, alpha)); p[Order::G] = (value_type)(color_type::int_prelerp(p[Order::G], cg, alpha)); p[Order::B] = (value_type)(color_type::int_prelerp(p[Order::B], cb, alpha)); p[Order::A] = (value_type)(color_type::int_prelerp(p[Order::A], alpha, alpha)); } //-------------------------------------------------------------------- static AGG_INLINE void blend_pix(value_type* p, unsigned cr, unsigned cg, unsigned cb, unsigned alpha) { p[Order::R] = (value_type)(color_type::int_prelerp(p[Order::R], cr, alpha)); p[Order::G] = (value_type)(color_type::int_prelerp(p[Order::G], cg, alpha)); p[Order::B] = (value_type)(color_type::int_prelerp(p[Order::B], cb, alpha)); p[Order::A] = (value_type)(color_type::int_prelerp(p[Order::A], alpha, alpha)); } }; //======================================================blender_rgba_plain template struct blender_rgba_plain { typedef ColorT color_type; typedef Order order_type; typedef typename color_type::value_type value_type; typedef typename color_type::calc_type calc_type; enum base_scale_e { base_shift = color_type::base_shift }; // Blend pixels using the non-premultiplied form of Alvy-Ray Smith's // compositing function. //-------------------------------------------------------------------- static AGG_INLINE void blend_pix(value_type* p, unsigned cr, unsigned cg, unsigned cb, unsigned alpha, unsigned cover) { alpha = color_type::int_mult_cover(alpha, cover); if(alpha == 0) return; calc_type a = p[Order::A]; calc_type r = color_type::int_mult(p[Order::R], a); calc_type g = color_type::int_mult(p[Order::G], a); calc_type b = color_type::int_mult(p[Order::B], a); p[Order::R] = (value_type)(color_type::int_lerp(r, cr, alpha)); p[Order::G] = (value_type)(color_type::int_lerp(g, cg, alpha)); p[Order::B] = (value_type)(color_type::int_lerp(b, cb, alpha)); p[Order::A] = (value_type)(color_type::int_prelerp(a, alpha, alpha)); multiplier_rgba::demultiply(p); } //-------------------------------------------------------------------- static AGG_INLINE void blend_pix(value_type* p, unsigned cr, unsigned cg, unsigned cb, unsigned alpha) { if(alpha == 0) return; calc_type a = p[Order::A]; calc_type r = color_type::int_mult(p[Order::R], a); calc_type g = color_type::int_mult(p[Order::G], a); calc_type b = color_type::int_mult(p[Order::B], a); p[Order::R] = (value_type)(color_type::int_lerp(r, cr, alpha)); p[Order::G] = (value_type)(color_type::int_lerp(g, cg, alpha)); p[Order::B] = (value_type)(color_type::int_lerp(b, cb, alpha)); p[Order::A] = (value_type)(color_type::int_prelerp(a, alpha, alpha)); multiplier_rgba::demultiply(p); } }; //=========================================================comp_op_rgba_clear template struct comp_op_rgba_clear { typedef ColorT color_type; typedef Order order_type; typedef typename color_type::value_type value_type; enum base_scale_e { base_shift = color_type::base_shift, base_mask = color_type::base_mask }; static AGG_INLINE void blend_pix(value_type* p, unsigned, unsigned, unsigned, unsigned, unsigned cover) { if(cover < 255) { cover = 255 - cover; p[Order::R] = (value_type)((p[Order::R] * cover + 255) >> 8); p[Order::G] = (value_type)((p[Order::G] * cover + 255) >> 8); p[Order::B] = (value_type)((p[Order::B] * cover + 255) >> 8); p[Order::A] = (value_type)((p[Order::A] * cover + 255) >> 8); } else { p[0] = p[1] = p[2] = p[3] = 0; } } }; //===========================================================comp_op_rgba_src template struct comp_op_rgba_src { typedef ColorT color_type; typedef Order order_type; typedef typename color_type::value_type value_type; static AGG_INLINE void blend_pix(value_type* p, unsigned sr, unsigned sg, unsigned sb, unsigned sa, unsigned cover) { if(cover < 255) { unsigned alpha = 255 - cover; p[Order::R] = (value_type)(((p[Order::R] * alpha + 255) >> 8) + ((sr * cover + 255) >> 8)); p[Order::G] = (value_type)(((p[Order::G] * alpha + 255) >> 8) + ((sg * cover + 255) >> 8)); p[Order::B] = (value_type)(((p[Order::B] * alpha + 255) >> 8) + ((sb * cover + 255) >> 8)); p[Order::A] = (value_type)(((p[Order::A] * alpha + 255) >> 8) + ((sa * cover + 255) >> 8)); } else { p[Order::R] = sr; p[Order::G] = sg; p[Order::B] = sb; p[Order::A] = sa; } } }; //===========================================================comp_op_rgba_dst template struct comp_op_rgba_dst { typedef ColorT color_type; typedef Order order_type; typedef typename color_type::value_type value_type; static AGG_INLINE void blend_pix(value_type*, unsigned, unsigned, unsigned, unsigned, unsigned) { } }; //======================================================comp_op_rgba_src_over template struct comp_op_rgba_src_over { typedef ColorT color_type; typedef Order order_type; typedef typename color_type::value_type value_type; typedef typename color_type::calc_type calc_type; enum base_scale_e { base_shift = color_type::base_shift, base_mask = color_type::base_mask }; // Dca' = Sca + Dca.(1 - Sa) // Da' = Sa + Da - Sa.Da static AGG_INLINE void blend_pix(value_type* p, unsigned sr, unsigned sg, unsigned sb, unsigned sa, unsigned cover) { if(cover < 255) { sr = (sr * cover + 255) >> 8; sg = (sg * cover + 255) >> 8; sb = (sb * cover + 255) >> 8; sa = (sa * cover + 255) >> 8; } calc_type s1a = base_mask - sa; p[Order::R] = (value_type)(sr + ((p[Order::R] * s1a + base_mask) >> base_shift)); p[Order::G] = (value_type)(sg + ((p[Order::G] * s1a + base_mask) >> base_shift)); p[Order::B] = (value_type)(sb + ((p[Order::B] * s1a + base_mask) >> base_shift)); p[Order::A] = (value_type)(sa + p[Order::A] - ((sa * p[Order::A] + base_mask) >> base_shift)); } }; //======================================================comp_op_rgba_dst_over template struct comp_op_rgba_dst_over { typedef ColorT color_type; typedef Order order_type; typedef typename color_type::value_type value_type; typedef typename color_type::calc_type calc_type; enum base_scale_e { base_shift = color_type::base_shift, base_mask = color_type::base_mask }; // Dca' = Dca + Sca.(1 - Da) // Da' = Sa + Da - Sa.Da static AGG_INLINE void blend_pix(value_type* p, unsigned sr, unsigned sg, unsigned sb, unsigned sa, unsigned cover) { if(cover < 255) { sr = (sr * cover + 255) >> 8; sg = (sg * cover + 255) >> 8; sb = (sb * cover + 255) >> 8; sa = (sa * cover + 255) >> 8; } calc_type d1a = base_mask - p[Order::A]; p[Order::R] = (value_type)(p[Order::R] + ((sr * d1a + base_mask) >> base_shift)); p[Order::G] = (value_type)(p[Order::G] + ((sg * d1a + base_mask) >> base_shift)); p[Order::B] = (value_type)(p[Order::B] + ((sb * d1a + base_mask) >> base_shift)); p[Order::A] = (value_type)(sa + p[Order::A] - ((sa * p[Order::A] + base_mask) >> base_shift)); } }; //======================================================comp_op_rgba_src_in template struct comp_op_rgba_src_in { typedef ColorT color_type; typedef Order order_type; typedef typename color_type::value_type value_type; typedef typename color_type::calc_type calc_type; enum base_scale_e { base_shift = color_type::base_shift, base_mask = color_type::base_mask }; // Dca' = Sca.Da // Da' = Sa.Da static AGG_INLINE void blend_pix(value_type* p, unsigned sr, unsigned sg, unsigned sb, unsigned sa, unsigned cover) { calc_type da = p[Order::A]; if(cover < 255) { unsigned alpha = 255 - cover; p[Order::R] = (value_type)(((p[Order::R] * alpha + 255) >> 8) + ((((sr * da + base_mask) >> base_shift) * cover + 255) >> 8)); p[Order::G] = (value_type)(((p[Order::G] * alpha + 255) >> 8) + ((((sg * da + base_mask) >> base_shift) * cover + 255) >> 8)); p[Order::B] = (value_type)(((p[Order::B] * alpha + 255) >> 8) + ((((sb * da + base_mask) >> base_shift) * cover + 255) >> 8)); p[Order::A] = (value_type)(((p[Order::A] * alpha + 255) >> 8) + ((((sa * da + base_mask) >> base_shift) * cover + 255) >> 8)); } else { p[Order::R] = (value_type)((sr * da + base_mask) >> base_shift); p[Order::G] = (value_type)((sg * da + base_mask) >> base_shift); p[Order::B] = (value_type)((sb * da + base_mask) >> base_shift); p[Order::A] = (value_type)((sa * da + base_mask) >> base_shift); } } }; //======================================================comp_op_rgba_dst_in template struct comp_op_rgba_dst_in { typedef ColorT color_type; typedef Order order_type; typedef typename color_type::value_type value_type; typedef typename color_type::calc_type calc_type; enum base_scale_e { base_shift = color_type::base_shift, base_mask = color_type::base_mask }; // Dca' = Dca.Sa // Da' = Sa.Da static AGG_INLINE void blend_pix(value_type* p, unsigned, unsigned, unsigned, unsigned sa, unsigned cover) { if(cover < 255) { sa = base_mask - ((cover * (base_mask - sa) + 255) >> 8); } p[Order::R] = (value_type)((p[Order::R] * sa + base_mask) >> base_shift); p[Order::G] = (value_type)((p[Order::G] * sa + base_mask) >> base_shift); p[Order::B] = (value_type)((p[Order::B] * sa + base_mask) >> base_shift); p[Order::A] = (value_type)((p[Order::A] * sa + base_mask) >> base_shift); } }; //======================================================comp_op_rgba_src_out template struct comp_op_rgba_src_out { typedef ColorT color_type; typedef Order order_type; typedef typename color_type::value_type value_type; typedef typename color_type::calc_type calc_type; enum base_scale_e { base_shift = color_type::base_shift, base_mask = color_type::base_mask }; // Dca' = Sca.(1 - Da) // Da' = Sa.(1 - Da) static AGG_INLINE void blend_pix(value_type* p, unsigned sr, unsigned sg, unsigned sb, unsigned sa, unsigned cover) { calc_type da = base_mask - p[Order::A]; if(cover < 255) { unsigned alpha = 255 - cover; p[Order::R] = (value_type)(((p[Order::R] * alpha + 255) >> 8) + ((((sr * da + base_mask) >> base_shift) * cover + 255) >> 8)); p[Order::G] = (value_type)(((p[Order::G] * alpha + 255) >> 8) + ((((sg * da + base_mask) >> base_shift) * cover + 255) >> 8)); p[Order::B] = (value_type)(((p[Order::B] * alpha + 255) >> 8) + ((((sb * da + base_mask) >> base_shift) * cover + 255) >> 8)); p[Order::A] = (value_type)(((p[Order::A] * alpha + 255) >> 8) + ((((sa * da + base_mask) >> base_shift) * cover + 255) >> 8)); } else { p[Order::R] = (value_type)((sr * da + base_mask) >> base_shift); p[Order::G] = (value_type)((sg * da + base_mask) >> base_shift); p[Order::B] = (value_type)((sb * da + base_mask) >> base_shift); p[Order::A] = (value_type)((sa * da + base_mask) >> base_shift); } } }; //======================================================comp_op_rgba_dst_out template struct comp_op_rgba_dst_out { typedef ColorT color_type; typedef Order order_type; typedef typename color_type::value_type value_type; typedef typename color_type::calc_type calc_type; enum base_scale_e { base_shift = color_type::base_shift, base_mask = color_type::base_mask }; // Dca' = Dca.(1 - Sa) // Da' = Da.(1 - Sa) static AGG_INLINE void blend_pix(value_type* p, unsigned, unsigned, unsigned, unsigned sa, unsigned cover) { if(cover < 255) { sa = (sa * cover + 255) >> 8; } sa = base_mask - sa; p[Order::R] = (value_type)((p[Order::R] * sa + base_shift) >> base_shift); p[Order::G] = (value_type)((p[Order::G] * sa + base_shift) >> base_shift); p[Order::B] = (value_type)((p[Order::B] * sa + base_shift) >> base_shift); p[Order::A] = (value_type)((p[Order::A] * sa + base_shift) >> base_shift); } }; //=====================================================comp_op_rgba_src_atop template struct comp_op_rgba_src_atop { typedef ColorT color_type; typedef Order order_type; typedef typename color_type::value_type value_type; typedef typename color_type::calc_type calc_type; enum base_scale_e { base_shift = color_type::base_shift, base_mask = color_type::base_mask }; // Dca' = Sca.Da + Dca.(1 - Sa) // Da' = Da static AGG_INLINE void blend_pix(value_type* p, unsigned sr, unsigned sg, unsigned sb, unsigned sa, unsigned cover) { if(cover < 255) { sr = (sr * cover + 255) >> 8; sg = (sg * cover + 255) >> 8; sb = (sb * cover + 255) >> 8; sa = (sa * cover + 255) >> 8; } calc_type da = p[Order::A]; sa = base_mask - sa; p[Order::R] = (value_type)((sr * da + p[Order::R] * sa + base_mask) >> base_shift); p[Order::G] = (value_type)((sg * da + p[Order::G] * sa + base_mask) >> base_shift); p[Order::B] = (value_type)((sb * da + p[Order::B] * sa + base_mask) >> base_shift); } }; //=====================================================comp_op_rgba_dst_atop template struct comp_op_rgba_dst_atop { typedef ColorT color_type; typedef Order order_type; typedef typename color_type::value_type value_type; typedef typename color_type::calc_type calc_type; enum base_scale_e { base_shift = color_type::base_shift, base_mask = color_type::base_mask }; // Dca' = Dca.Sa + Sca.(1 - Da) // Da' = Sa static AGG_INLINE void blend_pix(value_type* p, unsigned sr, unsigned sg, unsigned sb, unsigned sa, unsigned cover) { calc_type da = base_mask - p[Order::A]; if(cover < 255) { unsigned alpha = 255 - cover; sr = (p[Order::R] * sa + sr * da + base_mask) >> base_shift; sg = (p[Order::G] * sa + sg * da + base_mask) >> base_shift; sb = (p[Order::B] * sa + sb * da + base_mask) >> base_shift; p[Order::R] = (value_type)(((p[Order::R] * alpha + 255) >> 8) + ((sr * cover + 255) >> 8)); p[Order::G] = (value_type)(((p[Order::G] * alpha + 255) >> 8) + ((sg * cover + 255) >> 8)); p[Order::B] = (value_type)(((p[Order::B] * alpha + 255) >> 8) + ((sb * cover + 255) >> 8)); p[Order::A] = (value_type)(((p[Order::A] * alpha + 255) >> 8) + ((sa * cover + 255) >> 8)); } else { p[Order::R] = (value_type)((p[Order::R] * sa + sr * da + base_mask) >> base_shift); p[Order::G] = (value_type)((p[Order::G] * sa + sg * da + base_mask) >> base_shift); p[Order::B] = (value_type)((p[Order::B] * sa + sb * da + base_mask) >> base_shift); p[Order::A] = (value_type)sa; } } }; //=========================================================comp_op_rgba_xor template struct comp_op_rgba_xor { typedef ColorT color_type; typedef Order order_type; typedef typename color_type::value_type value_type; typedef typename color_type::calc_type calc_type; enum base_scale_e { base_shift = color_type::base_shift, base_mask = color_type::base_mask }; // Dca' = Sca.(1 - Da) + Dca.(1 - Sa) // Da' = Sa + Da - 2.Sa.Da static AGG_INLINE void blend_pix(value_type* p, unsigned sr, unsigned sg, unsigned sb, unsigned sa, unsigned cover) { if(cover < 255) { sr = (sr * cover + 255) >> 8; sg = (sg * cover + 255) >> 8; sb = (sb * cover + 255) >> 8; sa = (sa * cover + 255) >> 8; } if(sa) { calc_type s1a = base_mask - sa; calc_type d1a = base_mask - p[Order::A]; p[Order::R] = (value_type)((p[Order::R] * s1a + sr * d1a + base_mask) >> base_shift); p[Order::G] = (value_type)((p[Order::G] * s1a + sg * d1a + base_mask) >> base_shift); p[Order::B] = (value_type)((p[Order::B] * s1a + sb * d1a + base_mask) >> base_shift); p[Order::A] = (value_type)(sa + p[Order::A] - ((sa * p[Order::A] + base_mask/2) >> (base_shift - 1))); } } }; //=========================================================comp_op_rgba_plus template struct comp_op_rgba_plus { typedef ColorT color_type; typedef Order order_type; typedef typename color_type::value_type value_type; typedef typename color_type::calc_type calc_type; enum base_scale_e { base_shift = color_type::base_shift, base_mask = color_type::base_mask }; // Dca' = Sca + Dca // Da' = Sa + Da static AGG_INLINE void blend_pix(value_type* p, unsigned sr, unsigned sg, unsigned sb, unsigned sa, unsigned cover) { if(cover < 255) { sr = (sr * cover + 255) >> 8; sg = (sg * cover + 255) >> 8; sb = (sb * cover + 255) >> 8; sa = (sa * cover + 255) >> 8; } if(sa) { calc_type dr = p[Order::R] + sr; calc_type dg = p[Order::G] + sg; calc_type db = p[Order::B] + sb; calc_type da = p[Order::A] + sa; p[Order::R] = (dr > base_mask) ? (value_type)base_mask : dr; p[Order::G] = (dg > base_mask) ? (value_type)base_mask : dg; p[Order::B] = (db > base_mask) ? (value_type)base_mask : db; p[Order::A] = (da > base_mask) ? (value_type)base_mask : da; } } }; //========================================================comp_op_rgba_minus template struct comp_op_rgba_minus { typedef ColorT color_type; typedef Order order_type; typedef typename color_type::value_type value_type; typedef typename color_type::calc_type calc_type; enum base_scale_e { base_shift = color_type::base_shift, base_mask = color_type::base_mask }; // Dca' = Dca - Sca // Da' = 1 - (1 - Sa).(1 - Da) static AGG_INLINE void blend_pix(value_type* p, unsigned sr, unsigned sg, unsigned sb, unsigned sa, unsigned cover) { if(cover < 255) { sr = (sr * cover + 255) >> 8; sg = (sg * cover + 255) >> 8; sb = (sb * cover + 255) >> 8; sa = (sa * cover + 255) >> 8; } if(sa) { calc_type dr = p[Order::R] - sr; calc_type dg = p[Order::G] - sg; calc_type db = p[Order::B] - sb; p[Order::R] = (dr > base_mask) ? 0 : dr; p[Order::G] = (dg > base_mask) ? 0 : dg; p[Order::B] = (db > base_mask) ? 0 : db; p[Order::A] = (value_type)(sa + p[Order::A] - ((sa * p[Order::A] + base_mask) >> base_shift)); //p[Order::A] = (value_type)(base_mask - (((base_mask - sa) * (base_mask - p[Order::A]) + base_mask) >> base_shift)); } } }; //=====================================================comp_op_rgba_multiply template struct comp_op_rgba_multiply { typedef ColorT color_type; typedef Order order_type; typedef typename color_type::value_type value_type; typedef typename color_type::calc_type calc_type; enum base_scale_e { base_shift = color_type::base_shift, base_mask = color_type::base_mask }; // Dca' = Sca.Dca + Sca.(1 - Da) + Dca.(1 - Sa) // Da' = Sa + Da - Sa.Da static AGG_INLINE void blend_pix(value_type* p, unsigned sr, unsigned sg, unsigned sb, unsigned sa, unsigned cover) { if(cover < 255) { sr = (sr * cover + 255) >> 8; sg = (sg * cover + 255) >> 8; sb = (sb * cover + 255) >> 8; sa = (sa * cover + 255) >> 8; } if(sa) { calc_type s1a = base_mask - sa; calc_type d1a = base_mask - p[Order::A]; calc_type dr = p[Order::R]; calc_type dg = p[Order::G]; calc_type db = p[Order::B]; p[Order::R] = (value_type)((sr * dr + sr * d1a + dr * s1a + base_mask) >> base_shift); p[Order::G] = (value_type)((sg * dg + sg * d1a + dg * s1a + base_mask) >> base_shift); p[Order::B] = (value_type)((sb * db + sb * d1a + db * s1a + base_mask) >> base_shift); p[Order::A] = (value_type)(sa + p[Order::A] - ((sa * p[Order::A] + base_mask) >> base_shift)); } } }; //=====================================================comp_op_rgba_screen template struct comp_op_rgba_screen { typedef ColorT color_type; typedef Order order_type; typedef typename color_type::value_type value_type; typedef typename color_type::calc_type calc_type; enum base_scale_e { base_shift = color_type::base_shift, base_mask = color_type::base_mask }; // Dca' = Sca + Dca - Sca.Dca // Da' = Sa + Da - Sa.Da static AGG_INLINE void blend_pix(value_type* p, unsigned sr, unsigned sg, unsigned sb, unsigned sa, unsigned cover) { if(cover < 255) { sr = (sr * cover + 255) >> 8; sg = (sg * cover + 255) >> 8; sb = (sb * cover + 255) >> 8; sa = (sa * cover + 255) >> 8; } if(sa) { calc_type dr = p[Order::R]; calc_type dg = p[Order::G]; calc_type db = p[Order::B]; calc_type da = p[Order::A]; p[Order::R] = (value_type)(sr + dr - ((sr * dr + base_mask) >> base_shift)); p[Order::G] = (value_type)(sg + dg - ((sg * dg + base_mask) >> base_shift)); p[Order::B] = (value_type)(sb + db - ((sb * db + base_mask) >> base_shift)); p[Order::A] = (value_type)(sa + da - ((sa * da + base_mask) >> base_shift)); } } }; //=====================================================comp_op_rgba_overlay template struct comp_op_rgba_overlay { typedef ColorT color_type; typedef Order order_type; typedef typename color_type::value_type value_type; typedef typename color_type::calc_type calc_type; enum base_scale_e { base_shift = color_type::base_shift, base_mask = color_type::base_mask }; // if 2.Dca < Da // Dca' = 2.Sca.Dca + Sca.(1 - Da) + Dca.(1 - Sa) // otherwise // Dca' = Sa.Da - 2.(Da - Dca).(Sa - Sca) + Sca.(1 - Da) + Dca.(1 - Sa) // // Da' = Sa + Da - Sa.Da static AGG_INLINE void blend_pix(value_type* p, unsigned sr, unsigned sg, unsigned sb, unsigned sa, unsigned cover) { if(cover < 255) { sr = (sr * cover + 255) >> 8; sg = (sg * cover + 255) >> 8; sb = (sb * cover + 255) >> 8; sa = (sa * cover + 255) >> 8; } if(sa) { calc_type d1a = base_mask - p[Order::A]; calc_type s1a = base_mask - sa; calc_type dr = p[Order::R]; calc_type dg = p[Order::G]; calc_type db = p[Order::B]; calc_type da = p[Order::A]; calc_type sada = sa * p[Order::A]; p[Order::R] = (value_type)(((2*dr < da) ? 2*sr*dr + sr*d1a + dr*s1a : sada - 2*(da - dr)*(sa - sr) + sr*d1a + dr*s1a + base_mask) >> base_shift); p[Order::G] = (value_type)(((2*dg < da) ? 2*sg*dg + sg*d1a + dg*s1a : sada - 2*(da - dg)*(sa - sg) + sg*d1a + dg*s1a + base_mask) >> base_shift); p[Order::B] = (value_type)(((2*db < da) ? 2*sb*db + sb*d1a + db*s1a : sada - 2*(da - db)*(sa - sb) + sb*d1a + db*s1a + base_mask) >> base_shift); p[Order::A] = (value_type)(sa + da - ((sa * da + base_mask) >> base_shift)); } } }; template inline T sd_min(T a, T b) { return (a < b) ? a : b; } template inline T sd_max(T a, T b) { return (a > b) ? a : b; } //=====================================================comp_op_rgba_darken template struct comp_op_rgba_darken { typedef ColorT color_type; typedef Order order_type; typedef typename color_type::value_type value_type; typedef typename color_type::calc_type calc_type; enum base_scale_e { base_shift = color_type::base_shift, base_mask = color_type::base_mask }; // Dca' = min(Sca.Da, Dca.Sa) + Sca.(1 - Da) + Dca.(1 - Sa) // Da' = Sa + Da - Sa.Da static AGG_INLINE void blend_pix(value_type* p, unsigned sr, unsigned sg, unsigned sb, unsigned sa, unsigned cover) { if(cover < 255) { sr = (sr * cover + 255) >> 8; sg = (sg * cover + 255) >> 8; sb = (sb * cover + 255) >> 8; sa = (sa * cover + 255) >> 8; } if(sa) { calc_type d1a = base_mask - p[Order::A]; calc_type s1a = base_mask - sa; calc_type dr = p[Order::R]; calc_type dg = p[Order::G]; calc_type db = p[Order::B]; calc_type da = p[Order::A]; p[Order::R] = (value_type)((sd_min(sr * da, dr * sa) + sr * d1a + dr * s1a + base_mask) >> base_shift); p[Order::G] = (value_type)((sd_min(sg * da, dg * sa) + sg * d1a + dg * s1a + base_mask) >> base_shift); p[Order::B] = (value_type)((sd_min(sb * da, db * sa) + sb * d1a + db * s1a + base_mask) >> base_shift); p[Order::A] = (value_type)(sa + da - ((sa * da + base_mask) >> base_shift)); } } }; //=====================================================comp_op_rgba_lighten template struct comp_op_rgba_lighten { typedef ColorT color_type; typedef Order order_type; typedef typename color_type::value_type value_type; typedef typename color_type::calc_type calc_type; enum base_scale_e { base_shift = color_type::base_shift, base_mask = color_type::base_mask }; // Dca' = max(Sca.Da, Dca.Sa) + Sca.(1 - Da) + Dca.(1 - Sa) // Da' = Sa + Da - Sa.Da static AGG_INLINE void blend_pix(value_type* p, unsigned sr, unsigned sg, unsigned sb, unsigned sa, unsigned cover) { if(cover < 255) { sr = (sr * cover + 255) >> 8; sg = (sg * cover + 255) >> 8; sb = (sb * cover + 255) >> 8; sa = (sa * cover + 255) >> 8; } if(sa) { calc_type d1a = base_mask - p[Order::A]; calc_type s1a = base_mask - sa; calc_type dr = p[Order::R]; calc_type dg = p[Order::G]; calc_type db = p[Order::B]; calc_type da = p[Order::A]; p[Order::R] = (value_type)((sd_max(sr * da, dr * sa) + sr * d1a + dr * s1a + base_mask) >> base_shift); p[Order::G] = (value_type)((sd_max(sg * da, dg * sa) + sg * d1a + dg * s1a + base_mask) >> base_shift); p[Order::B] = (value_type)((sd_max(sb * da, db * sa) + sb * d1a + db * s1a + base_mask) >> base_shift); p[Order::A] = (value_type)(sa + da - ((sa * da + base_mask) >> base_shift)); } } }; //=====================================================comp_op_rgba_color_dodge template struct comp_op_rgba_color_dodge { typedef ColorT color_type; typedef Order order_type; typedef typename color_type::value_type value_type; typedef typename color_type::calc_type calc_type; typedef typename color_type::long_type long_type; enum base_scale_e { base_shift = color_type::base_shift, base_mask = color_type::base_mask }; // if Sca.Da + Dca.Sa >= Sa.Da // Dca' = Sa.Da + Sca.(1 - Da) + Dca.(1 - Sa) // otherwise // Dca' = Dca.Sa/(1-Sca/Sa) + Sca.(1 - Da) + Dca.(1 - Sa) // // Da' = Sa + Da - Sa.Da static AGG_INLINE void blend_pix(value_type* p, unsigned sr, unsigned sg, unsigned sb, unsigned sa, unsigned cover) { if(cover < 255) { sr = (sr * cover + 255) >> 8; sg = (sg * cover + 255) >> 8; sb = (sb * cover + 255) >> 8; sa = (sa * cover + 255) >> 8; } if(sa) { calc_type d1a = base_mask - p[Order::A]; calc_type s1a = base_mask - sa; calc_type dr = p[Order::R]; calc_type dg = p[Order::G]; calc_type db = p[Order::B]; calc_type da = p[Order::A]; long_type drsa = dr * sa; long_type dgsa = dg * sa; long_type dbsa = db * sa; long_type srda = sr * da; long_type sgda = sg * da; long_type sbda = sb * da; long_type sada = sa * da; p[Order::R] = (value_type)((srda + drsa >= sada) ? (sada + sr * d1a + dr * s1a + base_mask) >> base_shift : drsa / (base_mask - (sr << base_shift) / sa) + ((sr * d1a + dr * s1a + base_mask) >> base_shift)); p[Order::G] = (value_type)((sgda + dgsa >= sada) ? (sada + sg * d1a + dg * s1a + base_mask) >> base_shift : dgsa / (base_mask - (sg << base_shift) / sa) + ((sg * d1a + dg * s1a + base_mask) >> base_shift)); p[Order::B] = (value_type)((sbda + dbsa >= sada) ? (sada + sb * d1a + db * s1a + base_mask) >> base_shift : dbsa / (base_mask - (sb << base_shift) / sa) + ((sb * d1a + db * s1a + base_mask) >> base_shift)); p[Order::A] = (value_type)(sa + da - ((sa * da + base_mask) >> base_shift)); } } }; //=====================================================comp_op_rgba_color_burn template struct comp_op_rgba_color_burn { typedef ColorT color_type; typedef Order order_type; typedef typename color_type::value_type value_type; typedef typename color_type::calc_type calc_type; typedef typename color_type::long_type long_type; enum base_scale_e { base_shift = color_type::base_shift, base_mask = color_type::base_mask }; // if Sca.Da + Dca.Sa <= Sa.Da // Dca' = Sca.(1 - Da) + Dca.(1 - Sa) // otherwise // Dca' = Sa.(Sca.Da + Dca.Sa - Sa.Da)/Sca + Sca.(1 - Da) + Dca.(1 - Sa) // // Da' = Sa + Da - Sa.Da static AGG_INLINE void blend_pix(value_type* p, unsigned sr, unsigned sg, unsigned sb, unsigned sa, unsigned cover) { if(cover < 255) { sr = (sr * cover + 255) >> 8; sg = (sg * cover + 255) >> 8; sb = (sb * cover + 255) >> 8; sa = (sa * cover + 255) >> 8; } if(sa) { calc_type d1a = base_mask - p[Order::A]; calc_type s1a = base_mask - sa; calc_type dr = p[Order::R]; calc_type dg = p[Order::G]; calc_type db = p[Order::B]; calc_type da = p[Order::A]; long_type drsa = dr * sa; long_type dgsa = dg * sa; long_type dbsa = db * sa; long_type srda = sr * da; long_type sgda = sg * da; long_type sbda = sb * da; long_type sada = sa * da; p[Order::R] = (value_type)(((srda + drsa <= sada) ? sr * d1a + dr * s1a : sa * (srda + drsa - sada) / sr + sr * d1a + dr * s1a + base_mask) >> base_shift); p[Order::G] = (value_type)(((sgda + dgsa <= sada) ? sg * d1a + dg * s1a : sa * (sgda + dgsa - sada) / sg + sg * d1a + dg * s1a + base_mask) >> base_shift); p[Order::B] = (value_type)(((sbda + dbsa <= sada) ? sb * d1a + db * s1a : sa * (sbda + dbsa - sada) / sb + sb * d1a + db * s1a + base_mask) >> base_shift); p[Order::A] = (value_type)(sa + da - ((sa * da + base_mask) >> base_shift)); } } }; //=====================================================comp_op_rgba_hard_light template struct comp_op_rgba_hard_light { typedef ColorT color_type; typedef Order order_type; typedef typename color_type::value_type value_type; typedef typename color_type::calc_type calc_type; typedef typename color_type::long_type long_type; enum base_scale_e { base_shift = color_type::base_shift, base_mask = color_type::base_mask }; // if 2.Sca < Sa // Dca' = 2.Sca.Dca + Sca.(1 - Da) + Dca.(1 - Sa) // otherwise // Dca' = Sa.Da - 2.(Da - Dca).(Sa - Sca) + Sca.(1 - Da) + Dca.(1 - Sa) // // Da' = Sa + Da - Sa.Da static AGG_INLINE void blend_pix(value_type* p, unsigned sr, unsigned sg, unsigned sb, unsigned sa, unsigned cover) { if(cover < 255) { sr = (sr * cover + 255) >> 8; sg = (sg * cover + 255) >> 8; sb = (sb * cover + 255) >> 8; sa = (sa * cover + 255) >> 8; } if(sa) { calc_type d1a = base_mask - p[Order::A]; calc_type s1a = base_mask - sa; calc_type dr = p[Order::R]; calc_type dg = p[Order::G]; calc_type db = p[Order::B]; calc_type da = p[Order::A]; calc_type sada = sa * da; p[Order::R] = (value_type)(((2*sr < sa) ? 2*sr*dr + sr*d1a + dr*s1a : sada - 2*(da - dr)*(sa - sr) + sr*d1a + dr*s1a + base_mask) >> base_shift); p[Order::G] = (value_type)(((2*sg < sa) ? 2*sg*dg + sg*d1a + dg*s1a : sada - 2*(da - dg)*(sa - sg) + sg*d1a + dg*s1a + base_mask) >> base_shift); p[Order::B] = (value_type)(((2*sb < sa) ? 2*sb*db + sb*d1a + db*s1a : sada - 2*(da - db)*(sa - sb) + sb*d1a + db*s1a + base_mask) >> base_shift); p[Order::A] = (value_type)(sa + da - ((sa * da + base_mask) >> base_shift)); } } }; //=====================================================comp_op_rgba_soft_light template struct comp_op_rgba_soft_light { typedef ColorT color_type; typedef Order order_type; typedef typename color_type::value_type value_type; typedef typename color_type::calc_type calc_type; typedef typename color_type::long_type long_type; enum base_scale_e { base_shift = color_type::base_shift, base_mask = color_type::base_mask }; // if 2.Sca < Sa // Dca' = Dca.(Sa + (1 - Dca/Da).(2.Sca - Sa)) + Sca.(1 - Da) + Dca.(1 - Sa) // otherwise if 8.Dca <= Da // Dca' = Dca.(Sa + (1 - Dca/Da).(2.Sca - Sa).(3 - 8.Dca/Da)) + Sca.(1 - Da) + Dca.(1 - Sa) // otherwise // Dca' = (Dca.Sa + ((Dca/Da)^(0.5).Da - Dca).(2.Sca - Sa)) + Sca.(1 - Da) + Dca.(1 - Sa) // // Da' = Sa + Da - Sa.Da static AGG_INLINE void blend_pix(value_type* p, unsigned r, unsigned g, unsigned b, unsigned a, unsigned cover) { double sr = double(r * cover) / (base_mask * 255); double sg = double(g * cover) / (base_mask * 255); double sb = double(b * cover) / (base_mask * 255); double sa = double(a * cover) / (base_mask * 255); if(sa > 0) { double dr = double(p[Order::R]) / base_mask; double dg = double(p[Order::G]) / base_mask; double db = double(p[Order::B]) / base_mask; double da = double(p[Order::A] ? p[Order::A] : 1) / base_mask; if(cover < 255) { a = (a * cover + 255) >> 8; } if(2*sr < sa) dr = dr*(sa + (1 - dr/da)*(2*sr - sa)) + sr*(1 - da) + dr*(1 - sa); else if(8*dr <= da) dr = dr*(sa + (1 - dr/da)*(2*sr - sa)*(3 - 8*dr/da)) + sr*(1 - da) + dr*(1 - sa); else dr = (dr*sa + (sqrt(dr/da)*da - dr)*(2*sr - sa)) + sr*(1 - da) + dr*(1 - sa); if(2*sg < sa) dg = dg*(sa + (1 - dg/da)*(2*sg - sa)) + sg*(1 - da) + dg*(1 - sa); else if(8*dg <= da) dg = dg*(sa + (1 - dg/da)*(2*sg - sa)*(3 - 8*dg/da)) + sg*(1 - da) + dg*(1 - sa); else dg = (dg*sa + (sqrt(dg/da)*da - dg)*(2*sg - sa)) + sg*(1 - da) + dg*(1 - sa); if(2*sb < sa) db = db*(sa + (1 - db/da)*(2*sb - sa)) + sb*(1 - da) + db*(1 - sa); else if(8*db <= da) db = db*(sa + (1 - db/da)*(2*sb - sa)*(3 - 8*db/da)) + sb*(1 - da) + db*(1 - sa); else db = (db*sa + (sqrt(db/da)*da - db)*(2*sb - sa)) + sb*(1 - da) + db*(1 - sa); p[Order::R] = (value_type)uround(dr * base_mask); p[Order::G] = (value_type)uround(dg * base_mask); p[Order::B] = (value_type)uround(db * base_mask); p[Order::A] = (value_type)(a + p[Order::A] - ((a * p[Order::A] + base_mask) >> base_shift)); } } }; //=====================================================comp_op_rgba_difference template struct comp_op_rgba_difference { typedef ColorT color_type; typedef Order order_type; typedef typename color_type::value_type value_type; typedef typename color_type::calc_type calc_type; typedef typename color_type::long_type long_type; enum base_scale_e { base_shift = color_type::base_shift, base_scale = color_type::base_scale, base_mask = color_type::base_mask }; // Dca' = Sca + Dca - 2.min(Sca.Da, Dca.Sa) // Da' = Sa + Da - Sa.Da static AGG_INLINE void blend_pix(value_type* p, unsigned sr, unsigned sg, unsigned sb, unsigned sa, unsigned cover) { if(cover < 255) { sr = (sr * cover + 255) >> 8; sg = (sg * cover + 255) >> 8; sb = (sb * cover + 255) >> 8; sa = (sa * cover + 255) >> 8; } if(sa) { calc_type dr = p[Order::R]; calc_type dg = p[Order::G]; calc_type db = p[Order::B]; calc_type da = p[Order::A]; p[Order::R] = (value_type)(sr + dr - ((2 * sd_min(sr*da, dr*sa) + base_mask) >> base_shift)); p[Order::G] = (value_type)(sg + dg - ((2 * sd_min(sg*da, dg*sa) + base_mask) >> base_shift)); p[Order::B] = (value_type)(sb + db - ((2 * sd_min(sb*da, db*sa) + base_mask) >> base_shift)); p[Order::A] = (value_type)(sa + da - ((sa * da + base_mask) >> base_shift)); } } }; //=====================================================comp_op_rgba_exclusion template struct comp_op_rgba_exclusion { typedef ColorT color_type; typedef Order order_type; typedef typename color_type::value_type value_type; typedef typename color_type::calc_type calc_type; typedef typename color_type::long_type long_type; enum base_scale_e { base_shift = color_type::base_shift, base_mask = color_type::base_mask }; // Dca' = (Sca.Da + Dca.Sa - 2.Sca.Dca) + Sca.(1 - Da) + Dca.(1 - Sa) // Da' = Sa + Da - Sa.Da static AGG_INLINE void blend_pix(value_type* p, unsigned sr, unsigned sg, unsigned sb, unsigned sa, unsigned cover) { if(cover < 255) { sr = (sr * cover + 255) >> 8; sg = (sg * cover + 255) >> 8; sb = (sb * cover + 255) >> 8; sa = (sa * cover + 255) >> 8; } if(sa) { calc_type d1a = base_mask - p[Order::A]; calc_type s1a = base_mask - sa; calc_type dr = p[Order::R]; calc_type dg = p[Order::G]; calc_type db = p[Order::B]; calc_type da = p[Order::A]; p[Order::R] = (value_type)((sr*da + dr*sa - 2*sr*dr + sr*d1a + dr*s1a + base_mask) >> base_shift); p[Order::G] = (value_type)((sg*da + dg*sa - 2*sg*dg + sg*d1a + dg*s1a + base_mask) >> base_shift); p[Order::B] = (value_type)((sb*da + db*sa - 2*sb*db + sb*d1a + db*s1a + base_mask) >> base_shift); p[Order::A] = (value_type)(sa + da - ((sa * da + base_mask) >> base_shift)); } } }; //=====================================================comp_op_rgba_contrast template struct comp_op_rgba_contrast { typedef ColorT color_type; typedef Order order_type; typedef typename color_type::value_type value_type; typedef typename color_type::calc_type calc_type; typedef typename color_type::long_type long_type; enum base_scale_e { base_shift = color_type::base_shift, base_mask = color_type::base_mask }; static AGG_INLINE void blend_pix(value_type* p, unsigned sr, unsigned sg, unsigned sb, unsigned sa, unsigned cover) { if(cover < 255) { sr = (sr * cover + 255) >> 8; sg = (sg * cover + 255) >> 8; sb = (sb * cover + 255) >> 8; sa = (sa * cover + 255) >> 8; } long_type dr = p[Order::R]; long_type dg = p[Order::G]; long_type db = p[Order::B]; int da = p[Order::A]; long_type d2a = da >> 1; unsigned s2a = sa >> 1; int r = (int)((((dr - d2a) * int((sr - s2a)*2 + base_mask)) >> base_shift) + d2a); int g = (int)((((dg - d2a) * int((sg - s2a)*2 + base_mask)) >> base_shift) + d2a); int b = (int)((((db - d2a) * int((sb - s2a)*2 + base_mask)) >> base_shift) + d2a); r = (r < 0) ? 0 : r; g = (g < 0) ? 0 : g; b = (b < 0) ? 0 : b; p[Order::R] = (value_type)((r > da) ? da : r); p[Order::G] = (value_type)((g > da) ? da : g); p[Order::B] = (value_type)((b > da) ? da : b); } }; //=====================================================comp_op_rgba_invert template struct comp_op_rgba_invert { typedef ColorT color_type; typedef Order order_type; typedef typename color_type::value_type value_type; typedef typename color_type::calc_type calc_type; typedef typename color_type::long_type long_type; enum base_scale_e { base_shift = color_type::base_shift, base_mask = color_type::base_mask }; // Dca' = (Da - Dca) * Sa + Dca.(1 - Sa) // Da' = Sa + Da - Sa.Da static AGG_INLINE void blend_pix(value_type* p, unsigned sr, unsigned sg, unsigned sb, unsigned sa, unsigned cover) { sa = (sa * cover + 255) >> 8; if(sa) { calc_type da = p[Order::A]; calc_type dr = ((da - p[Order::R]) * sa + base_mask) >> base_shift; calc_type dg = ((da - p[Order::G]) * sa + base_mask) >> base_shift; calc_type db = ((da - p[Order::B]) * sa + base_mask) >> base_shift; calc_type s1a = base_mask - sa; p[Order::R] = (value_type)(dr + ((p[Order::R] * s1a + base_mask) >> base_shift)); p[Order::G] = (value_type)(dg + ((p[Order::G] * s1a + base_mask) >> base_shift)); p[Order::B] = (value_type)(db + ((p[Order::B] * s1a + base_mask) >> base_shift)); p[Order::A] = (value_type)(sa + da - ((sa * da + base_mask) >> base_shift)); } } }; //=================================================comp_op_rgba_invert_rgb template struct comp_op_rgba_invert_rgb { typedef ColorT color_type; typedef Order order_type; typedef typename color_type::value_type value_type; typedef typename color_type::calc_type calc_type; typedef typename color_type::long_type long_type; enum base_scale_e { base_shift = color_type::base_shift, base_mask = color_type::base_mask }; // Dca' = (Da - Dca) * Sca + Dca.(1 - Sa) // Da' = Sa + Da - Sa.Da static AGG_INLINE void blend_pix(value_type* p, unsigned sr, unsigned sg, unsigned sb, unsigned sa, unsigned cover) { if(cover < 255) { sr = (sr * cover + 255) >> 8; sg = (sg * cover + 255) >> 8; sb = (sb * cover + 255) >> 8; sa = (sa * cover + 255) >> 8; } if(sa) { calc_type da = p[Order::A]; calc_type dr = ((da - p[Order::R]) * sr + base_mask) >> base_shift; calc_type dg = ((da - p[Order::G]) * sg + base_mask) >> base_shift; calc_type db = ((da - p[Order::B]) * sb + base_mask) >> base_shift; calc_type s1a = base_mask - sa; p[Order::R] = (value_type)(dr + ((p[Order::R] * s1a + base_mask) >> base_shift)); p[Order::G] = (value_type)(dg + ((p[Order::G] * s1a + base_mask) >> base_shift)); p[Order::B] = (value_type)(db + ((p[Order::B] * s1a + base_mask) >> base_shift)); p[Order::A] = (value_type)(sa + da - ((sa * da + base_mask) >> base_shift)); } } }; //======================================================comp_op_table_rgba template struct comp_op_table_rgba { typedef typename ColorT::value_type value_type; typedef void (*comp_op_func_type)(value_type* p, unsigned cr, unsigned cg, unsigned cb, unsigned ca, unsigned cover); static comp_op_func_type g_comp_op_func[]; }; //==========================================================g_comp_op_func template typename comp_op_table_rgba::comp_op_func_type comp_op_table_rgba::g_comp_op_func[] = { comp_op_rgba_clear ::blend_pix, comp_op_rgba_src ::blend_pix, comp_op_rgba_dst ::blend_pix, comp_op_rgba_src_over ::blend_pix, comp_op_rgba_dst_over ::blend_pix, comp_op_rgba_src_in ::blend_pix, comp_op_rgba_dst_in ::blend_pix, comp_op_rgba_src_out ::blend_pix, comp_op_rgba_dst_out ::blend_pix, comp_op_rgba_src_atop ::blend_pix, comp_op_rgba_dst_atop ::blend_pix, comp_op_rgba_xor ::blend_pix, comp_op_rgba_plus ::blend_pix, comp_op_rgba_minus ::blend_pix, comp_op_rgba_multiply ::blend_pix, comp_op_rgba_screen ::blend_pix, comp_op_rgba_overlay ::blend_pix, comp_op_rgba_darken ::blend_pix, comp_op_rgba_lighten ::blend_pix, comp_op_rgba_color_dodge::blend_pix, comp_op_rgba_color_burn ::blend_pix, comp_op_rgba_hard_light ::blend_pix, comp_op_rgba_soft_light ::blend_pix, comp_op_rgba_difference ::blend_pix, comp_op_rgba_exclusion ::blend_pix, comp_op_rgba_contrast ::blend_pix, comp_op_rgba_invert ::blend_pix, comp_op_rgba_invert_rgb ::blend_pix, 0 }; //==============================================================comp_op_e enum comp_op_e { comp_op_clear, //----comp_op_clear comp_op_src, //----comp_op_src comp_op_dst, //----comp_op_dst comp_op_src_over, //----comp_op_src_over comp_op_dst_over, //----comp_op_dst_over comp_op_src_in, //----comp_op_src_in comp_op_dst_in, //----comp_op_dst_in comp_op_src_out, //----comp_op_src_out comp_op_dst_out, //----comp_op_dst_out comp_op_src_atop, //----comp_op_src_atop comp_op_dst_atop, //----comp_op_dst_atop comp_op_xor, //----comp_op_xor comp_op_plus, //----comp_op_plus comp_op_minus, //----comp_op_minus comp_op_multiply, //----comp_op_multiply comp_op_screen, //----comp_op_screen comp_op_overlay, //----comp_op_overlay comp_op_darken, //----comp_op_darken comp_op_lighten, //----comp_op_lighten comp_op_color_dodge, //----comp_op_color_dodge comp_op_color_burn, //----comp_op_color_burn comp_op_hard_light, //----comp_op_hard_light comp_op_soft_light, //----comp_op_soft_light comp_op_difference, //----comp_op_difference comp_op_exclusion, //----comp_op_exclusion comp_op_contrast, //----comp_op_contrast comp_op_invert, //----comp_op_invert comp_op_invert_rgb, //----comp_op_invert_rgb end_of_comp_op_e }; //====================================================comp_op_adaptor_rgba template struct comp_op_adaptor_rgba { typedef Order order_type; typedef ColorT color_type; typedef typename color_type::value_type value_type; enum base_scale_e { base_shift = color_type::base_shift, base_mask = color_type::base_mask }; static AGG_INLINE void blend_pix(unsigned op, value_type* p, unsigned cr, unsigned cg, unsigned cb, unsigned ca, unsigned cover) { comp_op_table_rgba::g_comp_op_func[op] (p, (cr * ca + base_mask) >> base_shift, (cg * ca + base_mask) >> base_shift, (cb * ca + base_mask) >> base_shift, ca, cover); } }; //=========================================comp_op_adaptor_clip_to_dst_rgba template struct comp_op_adaptor_clip_to_dst_rgba { typedef Order order_type; typedef ColorT color_type; typedef typename color_type::value_type value_type; enum base_scale_e { base_shift = color_type::base_shift, base_mask = color_type::base_mask }; static AGG_INLINE void blend_pix(unsigned op, value_type* p, unsigned cr, unsigned cg, unsigned cb, unsigned ca, unsigned cover) { cr = (cr * ca + base_mask) >> base_shift; cg = (cg * ca + base_mask) >> base_shift; cb = (cb * ca + base_mask) >> base_shift; unsigned da = p[Order::A]; comp_op_table_rgba::g_comp_op_func[op] (p, (cr * da + base_mask) >> base_shift, (cg * da + base_mask) >> base_shift, (cb * da + base_mask) >> base_shift, (ca * da + base_mask) >> base_shift, cover); } }; //================================================comp_op_adaptor_rgba_pre template struct comp_op_adaptor_rgba_pre { typedef Order order_type; typedef ColorT color_type; typedef typename color_type::value_type value_type; enum base_scale_e { base_shift = color_type::base_shift, base_mask = color_type::base_mask }; static AGG_INLINE void blend_pix(unsigned op, value_type* p, unsigned cr, unsigned cg, unsigned cb, unsigned ca, unsigned cover) { comp_op_table_rgba::g_comp_op_func[op](p, cr, cg, cb, ca, cover); } }; //=====================================comp_op_adaptor_clip_to_dst_rgba_pre template struct comp_op_adaptor_clip_to_dst_rgba_pre { typedef Order order_type; typedef ColorT color_type; typedef typename color_type::value_type value_type; enum base_scale_e { base_shift = color_type::base_shift, base_mask = color_type::base_mask }; static AGG_INLINE void blend_pix(unsigned op, value_type* p, unsigned cr, unsigned cg, unsigned cb, unsigned ca, unsigned cover) { unsigned da = p[Order::A]; comp_op_table_rgba::g_comp_op_func[op] (p, (cr * da + base_mask) >> base_shift, (cg * da + base_mask) >> base_shift, (cb * da + base_mask) >> base_shift, (ca * da + base_mask) >> base_shift, cover); } }; //=======================================================comp_adaptor_rgba template struct comp_adaptor_rgba { typedef typename BlenderPre::order_type order_type; typedef typename BlenderPre::color_type color_type; typedef typename color_type::value_type value_type; enum base_scale_e { base_shift = color_type::base_shift, base_mask = color_type::base_mask }; static AGG_INLINE void blend_pix(unsigned op, value_type* p, unsigned cr, unsigned cg, unsigned cb, unsigned ca, unsigned cover) { BlenderPre::blend_pix(p, (cr * ca + base_mask) >> base_shift, (cg * ca + base_mask) >> base_shift, (cb * ca + base_mask) >> base_shift, ca, cover); } }; //==========================================comp_adaptor_clip_to_dst_rgba template struct comp_adaptor_clip_to_dst_rgba { typedef typename BlenderPre::order_type order_type; typedef typename BlenderPre::color_type color_type; typedef typename color_type::value_type value_type; enum base_scale_e { base_shift = color_type::base_shift, base_mask = color_type::base_mask }; static AGG_INLINE void blend_pix(unsigned op, value_type* p, unsigned cr, unsigned cg, unsigned cb, unsigned ca, unsigned cover) { cr = (cr * ca + base_mask) >> base_shift; cg = (cg * ca + base_mask) >> base_shift; cb = (cb * ca + base_mask) >> base_shift; unsigned da = p[order_type::A]; BlenderPre::blend_pix(p, (cr * da + base_mask) >> base_shift, (cg * da + base_mask) >> base_shift, (cb * da + base_mask) >> base_shift, (ca * da + base_mask) >> base_shift, cover); } }; //======================================comp_adaptor_clip_to_dst_rgba_pre template struct comp_adaptor_clip_to_dst_rgba_pre { typedef typename BlenderPre::order_type order_type; typedef typename BlenderPre::color_type color_type; typedef typename color_type::value_type value_type; enum base_scale_e { base_shift = color_type::base_shift, base_mask = color_type::base_mask }; static AGG_INLINE void blend_pix(unsigned op, value_type* p, unsigned cr, unsigned cg, unsigned cb, unsigned ca, unsigned cover) { unsigned da = p[order_type::A]; BlenderPre::blend_pix(p, (cr * da + base_mask) >> base_shift, (cg * da + base_mask) >> base_shift, (cb * da + base_mask) >> base_shift, (ca * da + base_mask) >> base_shift, cover); } }; //===============================================copy_or_blend_rgba_wrapper template struct copy_or_blend_rgba_wrapper { typedef typename Blender::color_type color_type; typedef typename Blender::order_type order_type; typedef typename color_type::value_type value_type; typedef typename color_type::calc_type calc_type; enum base_scale_e { base_shift = color_type::base_shift, base_scale = color_type::base_scale, base_mask = color_type::base_mask }; //-------------------------------------------------------------------- static AGG_INLINE void copy_or_blend_pix(value_type* p, unsigned cr, unsigned cg, unsigned cb, unsigned alpha) { if(alpha) { if(alpha == base_mask) { p[order_type::R] = cr; p[order_type::G] = cg; p[order_type::B] = cb; p[order_type::A] = base_mask; } else { Blender::blend_pix(p, cr, cg, cb, alpha); } } } //-------------------------------------------------------------------- static AGG_INLINE void copy_or_blend_pix(value_type* p, unsigned cr, unsigned cg, unsigned cb, unsigned alpha, unsigned cover) { if(cover == cover_mask) { copy_or_blend_pix(p, cr, cg, cb, alpha); } else { if(alpha) { //alpha = color_type::int_mult_cover(alpha, cover) if(alpha == base_mask && cover == cover_mask) { p[order_type::R] = cr; p[order_type::G] = cg; p[order_type::B] = cb; p[order_type::A] = base_mask; } else { Blender::blend_pix(p, cr, cg, cb, alpha, cover); } } } } }; //=================================================pixfmt_alpha_blend_rgba template class pixfmt_alpha_blend_rgba { public: typedef RenBuf rbuf_type; typedef typename rbuf_type::row_data row_data; typedef PixelT pixel_type; typedef Blender blender_type; typedef typename blender_type::color_type color_type; typedef typename blender_type::order_type order_type; typedef typename color_type::value_type value_type; typedef typename color_type::calc_type calc_type; typedef copy_or_blend_rgba_wrapper cob_type; enum base_scale_e { base_shift = color_type::base_shift, base_scale = color_type::base_scale, base_mask = color_type::base_mask, pix_width = sizeof(pixel_type) }; //-------------------------------------------------------------------- pixfmt_alpha_blend_rgba() : m_rbuf(0) {} explicit pixfmt_alpha_blend_rgba(rbuf_type& rb) : m_rbuf(&rb) {} void attach(rbuf_type& rb) { m_rbuf = &rb; } //-------------------------------------------------------------------- template bool attach(PixFmt& pixf, int x1, int y1, int x2, int y2) { rect_i r(x1, y1, x2, y2); if(r.clip(rect_i(0, 0, pixf.width()-1, pixf.height()-1))) { int stride = pixf.stride(); m_rbuf->attach(pixf.pix_ptr(r.x1, stride < 0 ? r.y2 : r.y1), (r.x2 - r.x1) + 1, (r.y2 - r.y1) + 1, stride); return true; } return false; } //-------------------------------------------------------------------- AGG_INLINE unsigned width() const { return m_rbuf->width(); } AGG_INLINE unsigned height() const { return m_rbuf->height(); } AGG_INLINE int stride() const { return m_rbuf->stride(); } //-------------------------------------------------------------------- AGG_INLINE int8u* row_ptr(int y) { return m_rbuf->row_ptr(y); } AGG_INLINE const int8u* row_ptr(int y) const { return m_rbuf->row_ptr(y); } AGG_INLINE row_data row(int y) const { return m_rbuf->row(y); } //-------------------------------------------------------------------- AGG_INLINE int8u* pix_ptr(int x, int y) { return m_rbuf->row_ptr(y) + x * pix_width; } AGG_INLINE const int8u* pix_ptr(int x, int y) const { return m_rbuf->row_ptr(y) + x * pix_width; } //-------------------------------------------------------------------- AGG_INLINE static void make_pix(int8u* p, const color_type& c) { ((value_type*)p)[order_type::R] = c.r; ((value_type*)p)[order_type::G] = c.g; ((value_type*)p)[order_type::B] = c.b; ((value_type*)p)[order_type::A] = c.a; } //-------------------------------------------------------------------- AGG_INLINE color_type pixel(int x, int y) const { const value_type* p = (const value_type*)m_rbuf->row_ptr(y); if(p) { p += x << 2; return color_type(p[order_type::R], p[order_type::G], p[order_type::B], p[order_type::A]); } return color_type::no_color(); } //-------------------------------------------------------------------- AGG_INLINE void copy_pixel(int x, int y, const color_type& c) { value_type* p = (value_type*)m_rbuf->row_ptr(x, y, 1) + (x << 2); p[order_type::R] = c.r; p[order_type::G] = c.g; p[order_type::B] = c.b; p[order_type::A] = c.a; } //-------------------------------------------------------------------- AGG_INLINE void blend_pixel(int x, int y, const color_type& c, int8u cover) { cob_type::copy_or_blend_pix( (value_type*)m_rbuf->row_ptr(x, y, 1) + (x << 2), c.r, c.g, c.b, c.a, cover); } //-------------------------------------------------------------------- AGG_INLINE void copy_hline(int x, int y, unsigned len, const color_type& c) { value_type* p = (value_type*)m_rbuf->row_ptr(x, y, len) + (x << 2); pixel_type v; ((value_type*)&v)[order_type::R] = c.r; ((value_type*)&v)[order_type::G] = c.g; ((value_type*)&v)[order_type::B] = c.b; ((value_type*)&v)[order_type::A] = c.a; do { *(pixel_type*)p = v; p += 4; } while(--len); } //-------------------------------------------------------------------- AGG_INLINE void copy_vline(int x, int y, unsigned len, const color_type& c) { pixel_type v; ((value_type*)&v)[order_type::R] = c.r; ((value_type*)&v)[order_type::G] = c.g; ((value_type*)&v)[order_type::B] = c.b; ((value_type*)&v)[order_type::A] = c.a; do { value_type* p = (value_type*)m_rbuf->row_ptr(x, y++, 1) + (x << 2); *(pixel_type*)p = v; } while(--len); } //-------------------------------------------------------------------- void blend_hline(int x, int y, unsigned len, const color_type& c, int8u cover) { if (c.a) { value_type* p = (value_type*)m_rbuf->row_ptr(x, y, len) + (x << 2); if(c.a == base_mask && cover == cover_mask) { pixel_type v; ((value_type*)&v)[order_type::R] = c.r; ((value_type*)&v)[order_type::G] = c.g; ((value_type*)&v)[order_type::B] = c.b; ((value_type*)&v)[order_type::A] = c.a; do { *(pixel_type*)p = v; p += 4; } while(--len); } else { if(cover == cover_mask) { do { blender_type::blend_pix(p, c.r, c.g, c.b, c.a); p += 4; } while(--len); } else { do { blender_type::blend_pix(p, c.r, c.g, c.b, c.a, cover); p += 4; } while(--len); } } } } //-------------------------------------------------------------------- void blend_vline(int x, int y, unsigned len, const color_type& c, int8u cover) { if (c.a) { value_type* p; if(c.a == base_mask && cover == cover_mask) { pixel_type v; ((value_type*)&v)[order_type::R] = c.r; ((value_type*)&v)[order_type::G] = c.g; ((value_type*)&v)[order_type::B] = c.b; ((value_type*)&v)[order_type::A] = c.a; do { p = (value_type*)m_rbuf->row_ptr(x, y++, 1) + (x << 2); *(pixel_type*)p = v; } while(--len); } else { if(cover == cover_mask) { do { p = (value_type*)m_rbuf->row_ptr(x, y++, 1) + (x << 2); blender_type::blend_pix(p, c.r, c.g, c.b, c.a); } while(--len); } else { do { p = (value_type*)m_rbuf->row_ptr(x, y++, 1) + (x << 2); blender_type::blend_pix(p, c.r, c.g, c.b, c.a, cover); } while(--len); } } } } //-------------------------------------------------------------------- void blend_solid_hspan(int x, int y, unsigned len, const color_type& c, const int8u* covers) { if (c.a) { value_type* p = (value_type*)m_rbuf->row_ptr(x, y, len) + (x << 2); do { if(c.a == base_mask && *covers == cover_mask) { p[order_type::R] = c.r; p[order_type::G] = c.g; p[order_type::B] = c.b; p[order_type::A] = base_mask; } else { blender_type::blend_pix(p, c.r, c.g, c.b, c.a, *covers); } p += 4; ++covers; } while(--len); } } //-------------------------------------------------------------------- void blend_solid_vspan(int x, int y, unsigned len, const color_type& c, const int8u* covers) { if (c.a) { do { value_type* p = (value_type*)m_rbuf->row_ptr(x, y++, 1) + (x << 2); if(c.a == base_mask && *covers == cover_mask) { p[order_type::R] = c.r; p[order_type::G] = c.g; p[order_type::B] = c.b; p[order_type::A] = base_mask; } else { blender_type::blend_pix(p, c.r, c.g, c.b, c.a, *covers); } ++covers; } while(--len); } } //-------------------------------------------------------------------- void copy_color_hspan(int x, int y, unsigned len, const color_type* colors) { value_type* p = (value_type*)m_rbuf->row_ptr(x, y, len) + (x << 2); do { p[order_type::R] = colors->r; p[order_type::G] = colors->g; p[order_type::B] = colors->b; p[order_type::A] = colors->a; ++colors; p += 4; } while(--len); } //-------------------------------------------------------------------- void copy_color_vspan(int x, int y, unsigned len, const color_type* colors) { do { value_type* p = (value_type*)m_rbuf->row_ptr(x, y++, 1) + (x << 2); p[order_type::R] = colors->r; p[order_type::G] = colors->g; p[order_type::B] = colors->b; p[order_type::A] = colors->a; ++colors; } while(--len); } //-------------------------------------------------------------------- void blend_color_hspan(int x, int y, unsigned len, const color_type* colors, const int8u* covers, int8u cover) { value_type* p = (value_type*)m_rbuf->row_ptr(x, y, len) + (x << 2); if(covers) { do { cob_type::copy_or_blend_pix(p, colors->r, colors->g, colors->b, colors->a, *covers++); p += 4; ++colors; } while(--len); } else { if(cover == cover_mask) { do { cob_type::copy_or_blend_pix(p, colors->r, colors->g, colors->b, colors->a); p += 4; ++colors; } while(--len); } else { do { cob_type::copy_or_blend_pix(p, colors->r, colors->g, colors->b, colors->a, cover); p += 4; ++colors; } while(--len); } } } //-------------------------------------------------------------------- void blend_color_vspan(int x, int y, unsigned len, const color_type* colors, const int8u* covers, int8u cover) { value_type* p; if(covers) { do { p = (value_type*)m_rbuf->row_ptr(x, y++, 1) + (x << 2); cob_type::copy_or_blend_pix(p, colors->r, colors->g, colors->b, colors->a, *covers++); ++colors; } while(--len); } else { if(cover == cover_mask) { do { p = (value_type*)m_rbuf->row_ptr(x, y++, 1) + (x << 2); cob_type::copy_or_blend_pix(p, colors->r, colors->g, colors->b, colors->a); ++colors; } while(--len); } else { do { p = (value_type*)m_rbuf->row_ptr(x, y++, 1) + (x << 2); cob_type::copy_or_blend_pix(p, colors->r, colors->g, colors->b, colors->a, cover); ++colors; } while(--len); } } } //-------------------------------------------------------------------- template void for_each_pixel(Function f) { unsigned y; for(y = 0; y < height(); ++y) { row_data r = m_rbuf->row(y); if(r.ptr) { unsigned len = r.x2 - r.x1 + 1; value_type* p = (value_type*)m_rbuf->row_ptr(r.x1, y, len) + (r.x1 << 2); do { f(p); p += 4; } while(--len); } } } //-------------------------------------------------------------------- void premultiply() { for_each_pixel(multiplier_rgba::premultiply); } //-------------------------------------------------------------------- void demultiply() { for_each_pixel(multiplier_rgba::demultiply); } //-------------------------------------------------------------------- template void apply_gamma_dir(const GammaLut& g) { for_each_pixel(apply_gamma_dir_rgba(g)); } //-------------------------------------------------------------------- template void apply_gamma_inv(const GammaLut& g) { for_each_pixel(apply_gamma_inv_rgba(g)); } //-------------------------------------------------------------------- template void copy_from(const RenBuf2& from, int xdst, int ydst, int xsrc, int ysrc, unsigned len) { const int8u* p = from.row_ptr(ysrc); if(p) { memmove(m_rbuf->row_ptr(xdst, ydst, len) + xdst * pix_width, p + xsrc * pix_width, len * pix_width); } } //-------------------------------------------------------------------- template void blend_from(const SrcPixelFormatRenderer& from, int xdst, int ydst, int xsrc, int ysrc, unsigned len, int8u cover) { typedef typename SrcPixelFormatRenderer::order_type src_order; const value_type* psrc = (value_type*)from.row_ptr(ysrc); if(psrc) { psrc += xsrc << 2; value_type* pdst = (value_type*)m_rbuf->row_ptr(xdst, ydst, len) + (xdst << 2); int incp = 4; if(xdst > xsrc) { psrc += (len-1) << 2; pdst += (len-1) << 2; incp = -4; } if(cover == cover_mask) { do { cob_type::copy_or_blend_pix(pdst, psrc[src_order::R], psrc[src_order::G], psrc[src_order::B], psrc[src_order::A]); psrc += incp; pdst += incp; } while(--len); } else { do { cob_type::copy_or_blend_pix(pdst, psrc[src_order::R], psrc[src_order::G], psrc[src_order::B], psrc[src_order::A], cover); psrc += incp; pdst += incp; } while(--len); } } } //-------------------------------------------------------------------- template void blend_from_color(const SrcPixelFormatRenderer& from, const color_type& color, int xdst, int ydst, int xsrc, int ysrc, unsigned len, int8u cover) { typedef typename SrcPixelFormatRenderer::value_type src_value_type; const src_value_type* psrc = (src_value_type*)from.row_ptr(ysrc); if(psrc) { value_type* pdst = (value_type*)m_rbuf->row_ptr(xdst, ydst, len) + (xdst << 2); do { cob_type::copy_or_blend_pix(pdst, color.r, color.g, color.b, color.a, color_type::int_mult_cover(*psrc, cover)); ++psrc; pdst += 4; } while(--len); } } //-------------------------------------------------------------------- template void blend_from_lut(const SrcPixelFormatRenderer& from, const color_type* color_lut, int xdst, int ydst, int xsrc, int ysrc, unsigned len, int8u cover) { typedef typename SrcPixelFormatRenderer::value_type src_value_type; const src_value_type* psrc = (src_value_type*)from.row_ptr(ysrc); if(psrc) { value_type* pdst = (value_type*)m_rbuf->row_ptr(xdst, ydst, len) + (xdst << 2); if(cover == cover_mask) { do { const color_type& color = color_lut[*psrc]; cob_type::copy_or_blend_pix(pdst, color.r, color.g, color.b, color.a); ++psrc; pdst += 4; } while(--len); } else { do { const color_type& color = color_lut[*psrc]; cob_type::copy_or_blend_pix(pdst, color.r, color.g, color.b, color.a, cover); ++psrc; pdst += 4; } while(--len); } } } private: rbuf_type* m_rbuf; }; //================================================pixfmt_custom_blend_rgba template class pixfmt_custom_blend_rgba { public: typedef RenBuf rbuf_type; typedef typename rbuf_type::row_data row_data; typedef Blender blender_type; typedef typename blender_type::color_type color_type; typedef typename blender_type::order_type order_type; typedef typename color_type::value_type value_type; typedef typename color_type::calc_type calc_type; enum base_scale_e { base_shift = color_type::base_shift, base_scale = color_type::base_scale, base_mask = color_type::base_mask, pix_width = sizeof(value_type) * 4 }; //-------------------------------------------------------------------- pixfmt_custom_blend_rgba() : m_rbuf(0), m_comp_op(3) {} explicit pixfmt_custom_blend_rgba(rbuf_type& rb, unsigned comp_op=3) : m_rbuf(&rb), m_comp_op(comp_op) {} void attach(rbuf_type& rb) { m_rbuf = &rb; } //-------------------------------------------------------------------- template bool attach(PixFmt& pixf, int x1, int y1, int x2, int y2) { rect_i r(x1, y1, x2, y2); if(r.clip(rect_i(0, 0, pixf.width()-1, pixf.height()-1))) { int stride = pixf.stride(); m_rbuf->attach(pixf.pix_ptr(r.x1, stride < 0 ? r.y2 : r.y1), (r.x2 - r.x1) + 1, (r.y2 - r.y1) + 1, stride); return true; } return false; } //-------------------------------------------------------------------- AGG_INLINE unsigned width() const { return m_rbuf->width(); } AGG_INLINE unsigned height() const { return m_rbuf->height(); } AGG_INLINE int stride() const { return m_rbuf->stride(); } //-------------------------------------------------------------------- AGG_INLINE int8u* row_ptr(int y) { return m_rbuf->row_ptr(y); } AGG_INLINE const int8u* row_ptr(int y) const { return m_rbuf->row_ptr(y); } AGG_INLINE row_data row(int y) const { return m_rbuf->row(y); } //-------------------------------------------------------------------- AGG_INLINE int8u* pix_ptr(int x, int y) { return m_rbuf->row_ptr(y) + x * pix_width; } AGG_INLINE const int8u* pix_ptr(int x, int y) const { return m_rbuf->row_ptr(y) + x * pix_width; } //-------------------------------------------------------------------- void comp_op(unsigned op) { m_comp_op = op; } unsigned comp_op() const { return m_comp_op; } //-------------------------------------------------------------------- AGG_INLINE static void make_pix(int8u* p, const color_type& c) { ((value_type*)p)[order_type::R] = c.r; ((value_type*)p)[order_type::G] = c.g; ((value_type*)p)[order_type::B] = c.b; ((value_type*)p)[order_type::A] = c.a; } //-------------------------------------------------------------------- color_type pixel(int x, int y) const { const value_type* p = (value_type*)m_rbuf->row_ptr(y) + (x << 2); return color_type(p[order_type::R], p[order_type::G], p[order_type::B], p[order_type::A]); } //-------------------------------------------------------------------- void copy_pixel(int x, int y, const color_type& c) { blender_type::blend_pix( m_comp_op, (value_type*)m_rbuf->row_ptr(x, y, 1) + (x << 2), c.r, c.g, c.b, c.a, cover_mask); } //-------------------------------------------------------------------- void blend_pixel(int x, int y, const color_type& c, int8u cover) { blender_type::blend_pix( m_comp_op, (value_type*)m_rbuf->row_ptr(x, y, 1) + (x << 2), c.r, c.g, c.b, c.a, cover); } //-------------------------------------------------------------------- void copy_hline(int x, int y, unsigned len, const color_type& c) { value_type* p = (value_type*)m_rbuf->row_ptr(x, y, len) + (x << 2);; do { blender_type::blend_pix(m_comp_op, p, c.r, c.g, c.b, c.a, cover_mask); p += 4; } while(--len); } //-------------------------------------------------------------------- void copy_vline(int x, int y, unsigned len, const color_type& c) { do { blender_type::blend_pix( m_comp_op, (value_type*)m_rbuf->row_ptr(x, y++, 1) + (x << 2), c.r, c.g, c.b, c.a, cover_mask); } while(--len); } //-------------------------------------------------------------------- void blend_hline(int x, int y, unsigned len, const color_type& c, int8u cover) { value_type* p = (value_type*)m_rbuf->row_ptr(x, y, len) + (x << 2); do { blender_type::blend_pix(m_comp_op, p, c.r, c.g, c.b, c.a, cover); p += 4; } while(--len); } //-------------------------------------------------------------------- void blend_vline(int x, int y, unsigned len, const color_type& c, int8u cover) { do { blender_type::blend_pix( m_comp_op, (value_type*)m_rbuf->row_ptr(x, y++, 1) + (x << 2), c.r, c.g, c.b, c.a, cover); } while(--len); } //-------------------------------------------------------------------- void blend_solid_hspan(int x, int y, unsigned len, const color_type& c, const int8u* covers) { value_type* p = (value_type*)m_rbuf->row_ptr(x, y, len) + (x << 2); do { blender_type::blend_pix(m_comp_op, p, c.r, c.g, c.b, c.a, *covers++); p += 4; } while(--len); } //-------------------------------------------------------------------- void blend_solid_vspan(int x, int y, unsigned len, const color_type& c, const int8u* covers) { do { blender_type::blend_pix( m_comp_op, (value_type*)m_rbuf->row_ptr(x, y++, 1) + (x << 2), c.r, c.g, c.b, c.a, *covers++); } while(--len); } //-------------------------------------------------------------------- void copy_color_hspan(int x, int y, unsigned len, const color_type* colors) { value_type* p = (value_type*)m_rbuf->row_ptr(x, y, len) + (x << 2); do { p[order_type::R] = colors->r; p[order_type::G] = colors->g; p[order_type::B] = colors->b; p[order_type::A] = colors->a; ++colors; p += 4; } while(--len); } //-------------------------------------------------------------------- void copy_color_vspan(int x, int y, unsigned len, const color_type* colors) { do { value_type* p = (value_type*)m_rbuf->row_ptr(x, y++, 1) + (x << 2); p[order_type::R] = colors->r; p[order_type::G] = colors->g; p[order_type::B] = colors->b; p[order_type::A] = colors->a; ++colors; } while(--len); } //-------------------------------------------------------------------- void blend_color_hspan(int x, int y, unsigned len, const color_type* colors, const int8u* covers, int8u cover) { value_type* p = (value_type*)m_rbuf->row_ptr(x, y, len) + (x << 2); do { blender_type::blend_pix(m_comp_op, p, colors->r, colors->g, colors->b, colors->a, covers ? *covers++ : cover); p += 4; ++colors; } while(--len); } //-------------------------------------------------------------------- void blend_color_vspan(int x, int y, unsigned len, const color_type* colors, const int8u* covers, int8u cover) { do { blender_type::blend_pix( m_comp_op, (value_type*)m_rbuf->row_ptr(x, y++, 1) + (x << 2), colors->r, colors->g, colors->b, colors->a, covers ? *covers++ : cover); ++colors; } while(--len); } //-------------------------------------------------------------------- template void for_each_pixel(Function f) { unsigned y; for(y = 0; y < height(); ++y) { row_data r = m_rbuf->row(y); if(r.ptr) { unsigned len = r.x2 - r.x1 + 1; value_type* p = (value_type*)m_rbuf->row_ptr(r.x1, y, len) + (r.x1 << 2); do { f(p); p += 4; } while(--len); } } } //-------------------------------------------------------------------- void premultiply() { for_each_pixel(multiplier_rgba::premultiply); } //-------------------------------------------------------------------- void demultiply() { for_each_pixel(multiplier_rgba::demultiply); } //-------------------------------------------------------------------- template void apply_gamma_dir(const GammaLut& g) { for_each_pixel(apply_gamma_dir_rgba(g)); } //-------------------------------------------------------------------- template void apply_gamma_inv(const GammaLut& g) { for_each_pixel(apply_gamma_inv_rgba(g)); } //-------------------------------------------------------------------- template void copy_from(const RenBuf2& from, int xdst, int ydst, int xsrc, int ysrc, unsigned len) { const int8u* p = from.row_ptr(ysrc); if(p) { memmove(m_rbuf->row_ptr(xdst, ydst, len) + xdst * pix_width, p + xsrc * pix_width, len * pix_width); } } //-------------------------------------------------------------------- template void blend_from(const SrcPixelFormatRenderer& from, int xdst, int ydst, int xsrc, int ysrc, unsigned len, int8u cover) { typedef typename SrcPixelFormatRenderer::order_type src_order; const value_type* psrc = (const value_type*)from.row_ptr(ysrc); if(psrc) { psrc += xsrc << 2; value_type* pdst = (value_type*)m_rbuf->row_ptr(xdst, ydst, len) + (xdst << 2); int incp = 4; if(xdst > xsrc) { psrc += (len-1) << 2; pdst += (len-1) << 2; incp = -4; } do { blender_type::blend_pix(m_comp_op, pdst, psrc[src_order::R], psrc[src_order::G], psrc[src_order::B], psrc[src_order::A], cover); psrc += incp; pdst += incp; } while(--len); } } //-------------------------------------------------------------------- template void blend_from_color(const SrcPixelFormatRenderer& from, const color_type& color, int xdst, int ydst, int xsrc, int ysrc, unsigned len, int8u cover) { typedef typename SrcPixelFormatRenderer::value_type src_value_type; const src_value_type* psrc = (src_value_type*)from.row_ptr(ysrc); if(psrc) { value_type* pdst = (value_type*)m_rbuf->row_ptr(xdst, ydst, len) + (xdst << 2); do { blender_type::blend_pix(m_comp_op, pdst, color.r, color.g, color.b, color.a, (*psrc * cover + base_mask) >> base_shift); ++psrc; pdst += 4; } while(--len); } } //-------------------------------------------------------------------- template void blend_from_lut(const SrcPixelFormatRenderer& from, const color_type* color_lut, int xdst, int ydst, int xsrc, int ysrc, unsigned len, int8u cover) { typedef typename SrcPixelFormatRenderer::value_type src_value_type; const src_value_type* psrc = (src_value_type*)from.row_ptr(ysrc); if(psrc) { value_type* pdst = (value_type*)m_rbuf->row_ptr(xdst, ydst, len) + (xdst << 2); do { const color_type& color = color_lut[*psrc]; blender_type::blend_pix(m_comp_op, pdst, color.r, color.g, color.b, color.a, cover); ++psrc; pdst += 4; } while(--len); } } private: rbuf_type* m_rbuf; unsigned m_comp_op; }; //----------------------------------------------------------------------- typedef blender_rgba blender_rgba32; //----blender_rgba32 typedef blender_rgba blender_argb32; //----blender_argb32 typedef blender_rgba blender_abgr32; //----blender_abgr32 typedef blender_rgba blender_bgra32; //----blender_bgra32 typedef blender_rgba_pre blender_rgba32_pre; //----blender_rgba32_pre typedef blender_rgba_pre blender_argb32_pre; //----blender_argb32_pre typedef blender_rgba_pre blender_abgr32_pre; //----blender_abgr32_pre typedef blender_rgba_pre blender_bgra32_pre; //----blender_bgra32_pre typedef blender_rgba_plain blender_rgba32_plain; //----blender_rgba32_plain typedef blender_rgba_plain blender_argb32_plain; //----blender_argb32_plain typedef blender_rgba_plain blender_abgr32_plain; //----blender_abgr32_plain typedef blender_rgba_plain blender_bgra32_plain; //----blender_bgra32_plain typedef blender_rgba blender_rgba64; //----blender_rgba64 typedef blender_rgba blender_argb64; //----blender_argb64 typedef blender_rgba blender_abgr64; //----blender_abgr64 typedef blender_rgba blender_bgra64; //----blender_bgra64 typedef blender_rgba_pre blender_rgba64_pre; //----blender_rgba64_pre typedef blender_rgba_pre blender_argb64_pre; //----blender_argb64_pre typedef blender_rgba_pre blender_abgr64_pre; //----blender_abgr64_pre typedef blender_rgba_pre blender_bgra64_pre; //----blender_bgra64_pre //----------------------------------------------------------------------- typedef int32u pixel32_type; typedef pixfmt_alpha_blend_rgba pixfmt_rgba32; //----pixfmt_rgba32 typedef pixfmt_alpha_blend_rgba pixfmt_argb32; //----pixfmt_argb32 typedef pixfmt_alpha_blend_rgba pixfmt_abgr32; //----pixfmt_abgr32 typedef pixfmt_alpha_blend_rgba pixfmt_bgra32; //----pixfmt_bgra32 typedef pixfmt_alpha_blend_rgba pixfmt_rgba32_pre; //----pixfmt_rgba32_pre typedef pixfmt_alpha_blend_rgba pixfmt_argb32_pre; //----pixfmt_argb32_pre typedef pixfmt_alpha_blend_rgba pixfmt_abgr32_pre; //----pixfmt_abgr32_pre typedef pixfmt_alpha_blend_rgba pixfmt_bgra32_pre; //----pixfmt_bgra32_pre typedef pixfmt_alpha_blend_rgba pixfmt_rgba32_plain; //----pixfmt_rgba32_plain typedef pixfmt_alpha_blend_rgba pixfmt_argb32_plain; //----pixfmt_argb32_plain typedef pixfmt_alpha_blend_rgba pixfmt_abgr32_plain; //----pixfmt_abgr32_plain typedef pixfmt_alpha_blend_rgba pixfmt_bgra32_plain; //----pixfmt_bgra32_plain struct pixel64_type { int16u c[4]; }; typedef pixfmt_alpha_blend_rgba pixfmt_rgba64; //----pixfmt_rgba64 typedef pixfmt_alpha_blend_rgba pixfmt_argb64; //----pixfmt_argb64 typedef pixfmt_alpha_blend_rgba pixfmt_abgr64; //----pixfmt_abgr64 typedef pixfmt_alpha_blend_rgba pixfmt_bgra64; //----pixfmt_bgra64 typedef pixfmt_alpha_blend_rgba pixfmt_rgba64_pre; //----pixfmt_rgba64_pre typedef pixfmt_alpha_blend_rgba pixfmt_argb64_pre; //----pixfmt_argb64_pre typedef pixfmt_alpha_blend_rgba pixfmt_abgr64_pre; //----pixfmt_abgr64_pre typedef pixfmt_alpha_blend_rgba pixfmt_bgra64_pre; //----pixfmt_bgra64_pre } #endif contextfree-3.0.5+dfsg1.orig/src-agg/include/agg_color_gray.h0000644000175000017500000003774312076364074022554 0ustar brambram//---------------------------------------------------------------------------- // Anti-Grain Geometry - Version 2.4 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) // // Permission to copy, use, modify, sell and distribute this software // is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // //---------------------------------------------------------------------------- // Contact: mcseem@antigrain.com // mcseemagg@yahoo.com // http://www.antigrain.com //---------------------------------------------------------------------------- // // Adaptation for high precision colors has been sponsored by // Liberty Technology Systems, Inc., visit http://lib-sys.com // // Liberty Technology Systems, Inc. is the provider of // PostScript and PDF technology for software developers. // //---------------------------------------------------------------------------- // // color types gray8, gray16 // //---------------------------------------------------------------------------- #ifndef AGG_COLOR_GRAY_INCLUDED #define AGG_COLOR_GRAY_INCLUDED #include "agg_basics.h" #include "agg_color_rgba.h" namespace agg { //===================================================================gray8 struct gray8 { typedef int8u value_type; typedef int32u calc_type; typedef int32 long_type; enum base_scale_e { base_shift = 8, base_scale = 1 << base_shift, base_mask = base_scale - 1, base_MSB = 1 << (base_shift - 1) }; typedef gray8 self_type; value_type v; value_type a; //-------------------------------------------------------------------- gray8() {} //-------------------------------------------------------------------- gray8(unsigned v_, unsigned a_=base_mask) : v(int8u(v_)), a(int8u(a_)) {} //-------------------------------------------------------------------- gray8(const self_type& c, unsigned a_) : v(c.v), a(value_type(a_)) {} //-------------------------------------------------------------------- gray8(const rgba& c) : v((value_type)uround((0.299*c.r + 0.587*c.g + 0.114*c.b) * double(base_mask))), a((value_type)uround(c.a * double(base_mask))) {} //-------------------------------------------------------------------- gray8(const rgba& c, double a_) : v((value_type)uround((0.299*c.r + 0.587*c.g + 0.114*c.b) * double(base_mask))), a((value_type)uround(a_ * double(base_mask))) {} //-------------------------------------------------------------------- gray8(const rgba8& c) : v((c.r*77 + c.g*150 + c.b*29) >> 8), a(c.a) {} //-------------------------------------------------------------------- gray8(const rgba8& c, unsigned a_) : v((value_type)((c.r*77 + c.g*150 + c.b*29) >> 8)), a((value_type)a_) {} //-------------------------------------------------------------------- // fixed-point multiply, exact over uint8 static AGG_INLINE calc_type int_mult(calc_type a, calc_type b) { calc_type t = a * b + base_MSB; return ((t >> base_shift) + t) >> base_shift; } //-------------------------------------------------------------------- // fixed-point multiply, exact over uint8 // specifically for multiplying a color component by a cover static AGG_INLINE calc_type int_mult_cover(calc_type a, calc_type b) { return int_mult(a, b); } //-------------------------------------------------------------------- // linear interpolate q over p by a, assuming q is pre-muliplied by a static AGG_INLINE calc_type int_prelerp(calc_type p, calc_type q, calc_type a) { return p + q - int_mult(p, a); } //-------------------------------------------------------------------- // linear interpolate q over p by a static AGG_INLINE calc_type int_lerp(calc_type p, calc_type q, calc_type a) { return p + int_mult(q - p, a); } //-------------------------------------------------------------------- void clear() { v = a = 0; } //-------------------------------------------------------------------- const self_type& transparent() { a = 0; return *this; } //-------------------------------------------------------------------- void opacity(double a_) { if(a_ < 0.0) a_ = 0.0; if(a_ > 1.0) a_ = 1.0; a = (value_type)uround(a_ * double(base_mask)); } //-------------------------------------------------------------------- double opacity() const { return double(a) / double(base_mask); } //-------------------------------------------------------------------- const self_type& premultiply() { if(a == base_mask) return *this; if(a == 0) { v = 0; return *this; } v = (value_type)int_mult(v, a); return *this; } //-------------------------------------------------------------------- const self_type& premultiply(unsigned a_) { if(a == base_mask && a_ >= base_mask) return *this; if(a == 0 || a_ == 0) { v = a = 0; return *this; } calc_type v_ = (calc_type(v) * a_) / a; v = value_type((v_ > a_) ? a_ : v_); a = value_type(a_); return *this; } //-------------------------------------------------------------------- const self_type& demultiply() { if(a == base_mask) return *this; if(a == 0) { v = 0; return *this; } calc_type v_ = (calc_type(v) * base_mask) / a; v = value_type((v_ > base_mask) ? (value_type)base_mask : v_); return *this; } //-------------------------------------------------------------------- self_type gradient(self_type c, double k) const { self_type ret; calc_type ik = uround(k * base_scale); ret.v = (value_type)int_lerp(v, c.v, ik); ret.a = (value_type)int_lerp(a, c.a, ik); return ret; } //-------------------------------------------------------------------- AGG_INLINE void add(const self_type& c, unsigned cover) { calc_type cv, ca; if(cover == cover_mask) { if(c.a == base_mask) { *this = c; return; } else { cv = v + c.v; ca = a + c.a; } } else { cv = v + int_mult_cover(c.v, cover); ca = a + int_mult_cover(c.a, cover); } v = (value_type)((cv > calc_type(base_mask)) ? calc_type(base_mask) : cv); a = (value_type)((ca > calc_type(base_mask)) ? calc_type(base_mask) : ca); } //-------------------------------------------------------------------- static self_type no_color() { return self_type(0,0); } }; //-------------------------------------------------------------gray8_pre inline gray8 gray8_pre(unsigned v, unsigned a = gray8::base_mask) { return gray8(v,a).premultiply(); } inline gray8 gray8_pre(const gray8& c, unsigned a) { return gray8(c,a).premultiply(); } inline gray8 gray8_pre(const rgba& c) { return gray8(c).premultiply(); } inline gray8 gray8_pre(const rgba& c, double a) { return gray8(c,a).premultiply(); } inline gray8 gray8_pre(const rgba8& c) { return gray8(c).premultiply(); } inline gray8 gray8_pre(const rgba8& c, unsigned a) { return gray8(c,a).premultiply(); } //==================================================================gray16 struct gray16 { typedef int16u value_type; typedef int32u calc_type; typedef int64 long_type; enum base_scale_e { base_shift = 16, base_scale = 1 << base_shift, base_mask = base_scale - 1, base_MSB = 1 << (base_shift - 1) }; typedef gray16 self_type; value_type v; value_type a; //-------------------------------------------------------------------- gray16() {} //-------------------------------------------------------------------- gray16(unsigned v_, unsigned a_=base_mask) : v(int16u(v_)), a(int16u(a_)) {} //-------------------------------------------------------------------- gray16(const self_type& c, unsigned a_) : v(c.v), a(value_type(a_)) {} //-------------------------------------------------------------------- gray16(const rgba& c) : v((value_type)uround((0.299*c.r + 0.587*c.g + 0.114*c.b) * double(base_mask))), a((value_type)uround(c.a * double(base_mask))) {} //-------------------------------------------------------------------- gray16(const rgba& c, double a_) : v((value_type)uround((0.299*c.r + 0.587*c.g + 0.114*c.b) * double(base_mask))), a((value_type)uround(a_ * double(base_mask))) {} //-------------------------------------------------------------------- gray16(const rgba8& c) : v(c.r*77 + c.g*150 + c.b*29), a((value_type(c.a) << 8) | c.a) {} //-------------------------------------------------------------------- gray16(const rgba8& c, unsigned a_) : v(c.r*77 + c.g*150 + c.b*29), a((value_type(a_) << 8) | c.a) {} //-------------------------------------------------------------------- gray16(const rgba16& c) : v((c.r*19595 + c.g*38470 + c.b*7471) >> 16), a(c.a) {} //-------------------------------------------------------------------- gray16(const rgba16& c, unsigned a_) : v((value_type)((c.r*19595 + c.g*38470 + c.b*7471) >> 16)), a((value_type)a_) {} //-------------------------------------------------------------------- // fixed-point multiply, exact over uint16 static AGG_INLINE calc_type int_mult(calc_type a, calc_type b) { calc_type t = a * b + base_MSB; return ((t >> base_shift) + t) >> base_shift; } //-------------------------------------------------------------------- // fixed-point multiply, almost exact over uint16 // specifically for multiplying a color component by a cover static AGG_INLINE calc_type int_mult_cover(calc_type a, calc_type b) { return int_mult(a, b << 8 | b); } //-------------------------------------------------------------------- // linear interpolate q over p by a, assuming q is pre-muliplied by a static AGG_INLINE calc_type int_prelerp(calc_type p, calc_type q, calc_type a) { return p + q - int_mult(p, a); } //-------------------------------------------------------------------- // linear interpolate q over p by a static AGG_INLINE calc_type int_lerp(calc_type p, calc_type q, calc_type a) { return p + int_mult(q - p, a); } //-------------------------------------------------------------------- void clear() { v = a = 0; } //-------------------------------------------------------------------- const self_type& transparent() { a = 0; return *this; } //-------------------------------------------------------------------- void opacity(double a_) { if(a_ < 0.0) a_ = 0.0; if(a_ > 1.0) a_ = 1.0; a = (value_type)uround(a_ * double(base_mask)); } //-------------------------------------------------------------------- double opacity() const { return double(a) / double(base_mask); } //-------------------------------------------------------------------- const self_type& premultiply() { if(a == base_mask) return *this; if(a == 0) { v = 0; return *this; } v = (value_type)int_mult(v, a); return *this; } //-------------------------------------------------------------------- const self_type& premultiply(unsigned a_) { if(a == base_mask && a_ >= base_mask) return *this; if(a == 0 || a_ == 0) { v = a = 0; return *this; } calc_type v_ = (calc_type(v) * a_) / a; v = value_type((v_ > a_) ? a_ : v_); a = value_type(a_); return *this; } //-------------------------------------------------------------------- const self_type& demultiply() { if(a == base_mask) return *this; if(a == 0) { v = 0; return *this; } calc_type v_ = (calc_type(v) * base_mask) / a; v = value_type((v_ > base_mask) ? base_mask : v_); return *this; } //-------------------------------------------------------------------- self_type gradient(self_type c, double k) const { self_type ret; calc_type ik = uround(k * base_scale); ret.v = (value_type)int_lerp(v, c.v, ik); ret.a = (value_type)int_lerp(a, c.a, ik); return ret; } //-------------------------------------------------------------------- AGG_INLINE void add(const self_type& c, unsigned cover) { calc_type cv, ca; if(cover == cover_mask) { if(c.a == base_mask) { *this = c; return; } else { cv = v + c.v; ca = a + c.a; } } else { cv = v + int_mult_cover(c.v, cover); ca = a + int_mult_cover(c.a, cover); } v = (value_type)((cv > calc_type(base_mask)) ? calc_type(base_mask) : cv); a = (value_type)((ca > calc_type(base_mask)) ? calc_type(base_mask) : ca); } //-------------------------------------------------------------------- static self_type no_color() { return self_type(0,0); } }; //------------------------------------------------------------gray16_pre inline gray16 gray16_pre(unsigned v, unsigned a = gray16::base_mask) { return gray16(v,a).premultiply(); } inline gray16 gray16_pre(const gray16& c, unsigned a) { return gray16(c,a).premultiply(); } inline gray16 gray16_pre(const rgba& c) { return gray16(c).premultiply(); } inline gray16 gray16_pre(const rgba& c, double a) { return gray16(c,a).premultiply(); } inline gray16 gray16_pre(const rgba8& c) { return gray16(c).premultiply(); } inline gray16 gray16_pre(const rgba8& c, unsigned a) { return gray16(c,a).premultiply(); } } #endif contextfree-3.0.5+dfsg1.orig/src-agg/include/agg_conv_transform.h0000644000175000017500000000401612076364074023437 0ustar brambram//---------------------------------------------------------------------------- // Anti-Grain Geometry - Version 2.4 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) // // Permission to copy, use, modify, sell and distribute this software // is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // //---------------------------------------------------------------------------- // Contact: mcseem@antigrain.com // mcseemagg@yahoo.com // http://www.antigrain.com //---------------------------------------------------------------------------- // // class conv_transform // //---------------------------------------------------------------------------- #ifndef AGG_CONV_TRANSFORM_INCLUDED #define AGG_CONV_TRANSFORM_INCLUDED #include "agg_basics.h" #include "agg_trans_affine.h" namespace agg { //----------------------------------------------------------conv_transform template class conv_transform { public: conv_transform(VertexSource& source, const Transformer& tr) : m_source(&source), m_trans(&tr) {} void attach(VertexSource& source) { m_source = &source; } void rewind(unsigned path_id) { m_source->rewind(path_id); } unsigned vertex(double* x, double* y) { unsigned cmd = m_source->vertex(x, y); if(is_vertex(cmd)) { m_trans->transform(x, y); } return cmd; } void transformer(const Transformer& tr) { m_trans = &tr; } private: conv_transform(const conv_transform&); const conv_transform& operator = (const conv_transform&); VertexSource* m_source; const Transformer* m_trans; }; } #endif contextfree-3.0.5+dfsg1.orig/src-agg/include/agg_path_storage.h0000644000175000017500000014217712076364074023072 0ustar brambram//---------------------------------------------------------------------------- // Anti-Grain Geometry - Version 2.4 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) // // Permission to copy, use, modify, sell and distribute this software // is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // //---------------------------------------------------------------------------- // Contact: mcseem@antigrain.com // mcseemagg@yahoo.com // http://www.antigrain.com //---------------------------------------------------------------------------- #ifndef AGG_PATH_STORAGE_INCLUDED #define AGG_PATH_STORAGE_INCLUDED #include #include #include "agg_math.h" #include "agg_array.h" #include "agg_bezier_arc.h" namespace agg { //----------------------------------------------------vertex_block_storage template class vertex_block_storage { public: // Allocation parameters enum block_scale_e { block_shift = BlockShift, block_size = 1 << block_shift, block_mask = block_size - 1, block_pool = BlockPool }; typedef T value_type; typedef vertex_block_storage self_type; ~vertex_block_storage(); vertex_block_storage(); vertex_block_storage(const self_type& v); const self_type& operator = (const self_type& ps); void remove_all(); void free_all(); void add_vertex(double x, double y, unsigned cmd); void modify_vertex(unsigned idx, double x, double y); void modify_vertex(unsigned idx, double x, double y, unsigned cmd); void modify_command(unsigned idx, unsigned cmd); void swap_vertices(unsigned v1, unsigned v2); unsigned last_command() const; unsigned last_vertex(double* x, double* y) const; unsigned prev_vertex(double* x, double* y) const; double last_x() const; double last_y() const; unsigned total_vertices() const; unsigned vertex(unsigned idx, double* x, double* y) const; unsigned command(unsigned idx) const; private: void allocate_block(unsigned nb); int8u* storage_ptrs(T** xy_ptr); private: unsigned m_total_vertices; unsigned m_total_blocks; unsigned m_max_blocks; T** m_coord_blocks; int8u** m_cmd_blocks; }; //------------------------------------------------------------------------ template void vertex_block_storage::free_all() { if(m_total_blocks) { T** coord_blk = m_coord_blocks + m_total_blocks - 1; while(m_total_blocks--) { pod_allocator::deallocate( *coord_blk, block_size * 2 + block_size / (sizeof(T) / sizeof(unsigned char))); --coord_blk; } pod_allocator::deallocate(m_coord_blocks, m_max_blocks * 2); m_total_blocks = 0; m_max_blocks = 0; m_coord_blocks = 0; m_cmd_blocks = 0; m_total_vertices = 0; } } //------------------------------------------------------------------------ template vertex_block_storage::~vertex_block_storage() { free_all(); } //------------------------------------------------------------------------ template vertex_block_storage::vertex_block_storage() : m_total_vertices(0), m_total_blocks(0), m_max_blocks(0), m_coord_blocks(0), m_cmd_blocks(0) { } //------------------------------------------------------------------------ template vertex_block_storage::vertex_block_storage(const vertex_block_storage& v) : m_total_vertices(0), m_total_blocks(0), m_max_blocks(0), m_coord_blocks(0), m_cmd_blocks(0) { *this = v; } //------------------------------------------------------------------------ template const vertex_block_storage& vertex_block_storage::operator = (const vertex_block_storage& v) { remove_all(); unsigned i; for(i = 0; i < v.total_vertices(); i++) { double x, y; unsigned cmd = v.vertex(i, &x, &y); add_vertex(x, y, cmd); } return *this; } //------------------------------------------------------------------------ template inline void vertex_block_storage::remove_all() { m_total_vertices = 0; } //------------------------------------------------------------------------ template inline void vertex_block_storage::add_vertex(double x, double y, unsigned cmd) { T* coord_ptr = 0; *storage_ptrs(&coord_ptr) = (int8u)cmd; coord_ptr[0] = T(x); coord_ptr[1] = T(y); m_total_vertices++; } //------------------------------------------------------------------------ template inline void vertex_block_storage::modify_vertex(unsigned idx, double x, double y) { T* pv = m_coord_blocks[idx >> block_shift] + ((idx & block_mask) << 1); pv[0] = T(x); pv[1] = T(y); } //------------------------------------------------------------------------ template inline void vertex_block_storage::modify_vertex(unsigned idx, double x, double y, unsigned cmd) { unsigned block = idx >> block_shift; unsigned offset = idx & block_mask; T* pv = m_coord_blocks[block] + (offset << 1); pv[0] = T(x); pv[1] = T(y); m_cmd_blocks[block][offset] = (int8u)cmd; } //------------------------------------------------------------------------ template inline void vertex_block_storage::modify_command(unsigned idx, unsigned cmd) { m_cmd_blocks[idx >> block_shift][idx & block_mask] = (int8u)cmd; } //------------------------------------------------------------------------ template inline void vertex_block_storage::swap_vertices(unsigned v1, unsigned v2) { unsigned b1 = v1 >> block_shift; unsigned b2 = v2 >> block_shift; unsigned o1 = v1 & block_mask; unsigned o2 = v2 & block_mask; T* pv1 = m_coord_blocks[b1] + (o1 << 1); T* pv2 = m_coord_blocks[b2] + (o2 << 1); T val; val = pv1[0]; pv1[0] = pv2[0]; pv2[0] = val; val = pv1[1]; pv1[1] = pv2[1]; pv2[1] = val; int8u cmd = m_cmd_blocks[b1][o1]; m_cmd_blocks[b1][o1] = m_cmd_blocks[b2][o2]; m_cmd_blocks[b2][o2] = cmd; } //------------------------------------------------------------------------ template inline unsigned vertex_block_storage::last_command() const { if(m_total_vertices) return command(m_total_vertices - 1); return path_cmd_stop; } //------------------------------------------------------------------------ template inline unsigned vertex_block_storage::last_vertex(double* x, double* y) const { if(m_total_vertices) return vertex(m_total_vertices - 1, x, y); return path_cmd_stop; } //------------------------------------------------------------------------ template inline unsigned vertex_block_storage::prev_vertex(double* x, double* y) const { if(m_total_vertices > 1) return vertex(m_total_vertices - 2, x, y); return path_cmd_stop; } //------------------------------------------------------------------------ template inline double vertex_block_storage::last_x() const { if(m_total_vertices) { unsigned idx = m_total_vertices - 1; return m_coord_blocks[idx >> block_shift][(idx & block_mask) << 1]; } return 0.0; } //------------------------------------------------------------------------ template inline double vertex_block_storage::last_y() const { if(m_total_vertices) { unsigned idx = m_total_vertices - 1; return m_coord_blocks[idx >> block_shift][((idx & block_mask) << 1) + 1]; } return 0.0; } //------------------------------------------------------------------------ template inline unsigned vertex_block_storage::total_vertices() const { return m_total_vertices; } //------------------------------------------------------------------------ template inline unsigned vertex_block_storage::vertex(unsigned idx, double* x, double* y) const { unsigned nb = idx >> block_shift; const T* pv = m_coord_blocks[nb] + ((idx & block_mask) << 1); *x = pv[0]; *y = pv[1]; return m_cmd_blocks[nb][idx & block_mask]; } //------------------------------------------------------------------------ template inline unsigned vertex_block_storage::command(unsigned idx) const { return m_cmd_blocks[idx >> block_shift][idx & block_mask]; } //------------------------------------------------------------------------ template void vertex_block_storage::allocate_block(unsigned nb) { if(nb >= m_max_blocks) { T** new_coords = pod_allocator::allocate((m_max_blocks + block_pool) * 2); unsigned char** new_cmds = (unsigned char**)(new_coords + m_max_blocks + block_pool); if(m_coord_blocks) { memcpy(new_coords, m_coord_blocks, m_max_blocks * sizeof(T*)); memcpy(new_cmds, m_cmd_blocks, m_max_blocks * sizeof(unsigned char*)); pod_allocator::deallocate(m_coord_blocks, m_max_blocks * 2); } m_coord_blocks = new_coords; m_cmd_blocks = new_cmds; m_max_blocks += block_pool; } m_coord_blocks[nb] = pod_allocator::allocate(block_size * 2 + block_size / (sizeof(T) / sizeof(unsigned char))); m_cmd_blocks[nb] = (unsigned char*)(m_coord_blocks[nb] + block_size * 2); m_total_blocks++; } //------------------------------------------------------------------------ template int8u* vertex_block_storage::storage_ptrs(T** xy_ptr) { unsigned nb = m_total_vertices >> block_shift; if(nb >= m_total_blocks) { allocate_block(nb); } *xy_ptr = m_coord_blocks[nb] + ((m_total_vertices & block_mask) << 1); return m_cmd_blocks[nb] + (m_total_vertices & block_mask); } //-----------------------------------------------------poly_plain_adaptor template class poly_plain_adaptor { public: typedef T value_type; poly_plain_adaptor() : m_data(0), m_ptr(0), m_end(0), m_closed(false), m_stop(false) {} poly_plain_adaptor(const T* data, unsigned num_points, bool closed) : m_data(data), m_ptr(data), m_end(data + num_points * 2), m_closed(closed), m_stop(false) {} void init(const T* data, unsigned num_points, bool closed) { m_data = data; m_ptr = data; m_end = data + num_points * 2; m_closed = closed; m_stop = false; } void rewind(unsigned) { m_ptr = m_data; m_stop = false; } unsigned vertex(double* x, double* y) { if(m_ptr < m_end) { bool first = m_ptr == m_data; *x = *m_ptr++; *y = *m_ptr++; return first ? path_cmd_move_to : path_cmd_line_to; } *x = *y = 0.0; if(m_closed && !m_stop) { m_stop = true; return path_cmd_end_poly | path_flags_close; } return path_cmd_stop; } private: const T* m_data; const T* m_ptr; const T* m_end; bool m_closed; bool m_stop; }; //-------------------------------------------------poly_container_adaptor template class poly_container_adaptor { public: typedef typename Container::value_type vertex_type; poly_container_adaptor() : m_container(0), m_index(0), m_closed(false), m_stop(false) {} poly_container_adaptor(const Container& data, bool closed) : m_container(&data), m_index(0), m_closed(closed), m_stop(false) {} void init(const Container& data, bool closed) { m_container = &data; m_index = 0; m_closed = closed; m_stop = false; } void rewind(unsigned) { m_index = 0; m_stop = false; } unsigned vertex(double* x, double* y) { if(m_index < m_container->size()) { bool first = m_index == 0; const vertex_type& v = (*m_container)[m_index++]; *x = v.x; *y = v.y; return first ? path_cmd_move_to : path_cmd_line_to; } *x = *y = 0.0; if(m_closed && !m_stop) { m_stop = true; return path_cmd_end_poly | path_flags_close; } return path_cmd_stop; } private: const Container* m_container; unsigned m_index; bool m_closed; bool m_stop; }; //-----------------------------------------poly_container_reverse_adaptor template class poly_container_reverse_adaptor { public: typedef typename Container::value_type vertex_type; poly_container_reverse_adaptor() : m_container(0), m_index(-1), m_closed(false), m_stop(false) {} poly_container_reverse_adaptor(const Container& data, bool closed) : m_container(&data), m_index(-1), m_closed(closed), m_stop(false) {} void init(const Container& data, bool closed) { m_container = &data; m_index = m_container->size() - 1; m_closed = closed; m_stop = false; } void rewind(unsigned) { m_index = m_container->size() - 1; m_stop = false; } unsigned vertex(double* x, double* y) { if(m_index >= 0) { bool first = m_index == int(m_container->size() - 1); const vertex_type& v = (*m_container)[m_index--]; *x = v.x; *y = v.y; return first ? path_cmd_move_to : path_cmd_line_to; } *x = *y = 0.0; if(m_closed && !m_stop) { m_stop = true; return path_cmd_end_poly | path_flags_close; } return path_cmd_stop; } private: const Container* m_container; int m_index; bool m_closed; bool m_stop; }; //--------------------------------------------------------line_adaptor class line_adaptor { public: typedef double value_type; line_adaptor() : m_line(m_coord, 2, false) {} line_adaptor(double x1, double y1, double x2, double y2) : m_line(m_coord, 2, false) { m_coord[0] = x1; m_coord[1] = y1; m_coord[2] = x2; m_coord[3] = y2; } void init(double x1, double y1, double x2, double y2) { m_coord[0] = x1; m_coord[1] = y1; m_coord[2] = x2; m_coord[3] = y2; m_line.rewind(0); } void rewind(unsigned) { m_line.rewind(0); } unsigned vertex(double* x, double* y) { return m_line.vertex(x, y); } private: double m_coord[4]; poly_plain_adaptor m_line; }; //---------------------------------------------------------------path_base // A container to store vertices with their flags. // A path consists of a number of contours separated with "move_to" // commands. The path storage can keep and maintain more than one // path. // To navigate to the beginning of a particular path, use rewind(path_id); // Where path_id is what start_new_path() returns. So, when you call // start_new_path() you need to store its return value somewhere else // to navigate to the path afterwards. // // See also: vertex_source concept //------------------------------------------------------------------------ template class path_base { public: typedef VertexContainer container_type; typedef path_base self_type; //-------------------------------------------------------------------- path_base() : m_vertices(), m_iterator(0) {} void remove_all() { m_vertices.remove_all(); m_iterator = 0; } void free_all() { m_vertices.free_all(); m_iterator = 0; } // Make path functions //-------------------------------------------------------------------- unsigned start_new_path(); void move_to(double x, double y); void move_rel(double dx, double dy); void line_to(double x, double y); void line_rel(double dx, double dy); void hline_to(double x); void hline_rel(double dx); void vline_to(double y); void vline_rel(double dy); void arc_to(double rx, double ry, double angle, bool large_arc_flag, bool sweep_flag, double x, double y); void arc_rel(double rx, double ry, double angle, bool large_arc_flag, bool sweep_flag, double dx, double dy); void curve3(double x_ctrl, double y_ctrl, double x_to, double y_to); void curve3_rel(double dx_ctrl, double dy_ctrl, double dx_to, double dy_to); void curve3(double x_to, double y_to); void curve3_rel(double dx_to, double dy_to); void curve4(double x_ctrl1, double y_ctrl1, double x_ctrl2, double y_ctrl2, double x_to, double y_to); void curve4_rel(double dx_ctrl1, double dy_ctrl1, double dx_ctrl2, double dy_ctrl2, double dx_to, double dy_to); void curve4(double x_ctrl2, double y_ctrl2, double x_to, double y_to); void curve4_rel(double x_ctrl2, double y_ctrl2, double x_to, double y_to); void end_poly(unsigned flags = path_flags_close); void close_polygon(unsigned flags = path_flags_none); // Accessors //-------------------------------------------------------------------- const container_type& vertices() const { return m_vertices; } container_type& vertices() { return m_vertices; } unsigned total_vertices() const; void rel_to_abs(double* x, double* y) const; unsigned last_vertex(double* x, double* y) const; unsigned prev_vertex(double* x, double* y) const; double last_x() const; double last_y() const; unsigned vertex(unsigned idx, double* x, double* y) const; unsigned command(unsigned idx) const; void modify_vertex(unsigned idx, double x, double y); void modify_vertex(unsigned idx, double x, double y, unsigned cmd); void modify_command(unsigned idx, unsigned cmd); // VertexSource interface //-------------------------------------------------------------------- void rewind(unsigned path_id); unsigned vertex(double* x, double* y); // Arrange the orientation of a polygon, all polygons in a path, // or in all paths. After calling arrange_orientations() or // arrange_orientations_all_paths(), all the polygons will have // the same orientation, i.e. path_flags_cw or path_flags_ccw //-------------------------------------------------------------------- unsigned arrange_polygon_orientation(unsigned start, path_flags_e orientation); unsigned arrange_orientations(unsigned path_id, path_flags_e orientation); void arrange_orientations_all_paths(path_flags_e orientation); void invert_polygon(unsigned start); // Flip all vertices horizontally or vertically, // between x1 and x2, or between y1 and y2 respectively //-------------------------------------------------------------------- void flip_x(double x1, double x2); void flip_y(double y1, double y2); // Concatenate path. The path is added as is. //-------------------------------------------------------------------- template void concat_path(VertexSource& vs, unsigned path_id = 0) { double x, y; unsigned cmd; vs.rewind(path_id); while(!is_stop(cmd = vs.vertex(&x, &y))) { m_vertices.add_vertex(x, y, cmd); } } //-------------------------------------------------------------------- // Join path. The path is joined with the existing one, that is, // it behaves as if the pen of a plotter was always down (drawing) template void join_path(VertexSource& vs, unsigned path_id = 0) { double x, y; unsigned cmd; vs.rewind(path_id); cmd = vs.vertex(&x, &y); if(!is_stop(cmd)) { if(is_vertex(cmd)) { double x0, y0; unsigned cmd0 = last_vertex(&x0, &y0); if(is_vertex(cmd0)) { if(calc_distance(x, y, x0, y0) > vertex_dist_epsilon) { if(is_move_to(cmd)) cmd = path_cmd_line_to; m_vertices.add_vertex(x, y, cmd); } } else { if(is_stop(cmd0)) { cmd = path_cmd_move_to; } else { if(is_move_to(cmd)) cmd = path_cmd_line_to; } m_vertices.add_vertex(x, y, cmd); } } while(!is_stop(cmd = vs.vertex(&x, &y))) { m_vertices.add_vertex(x, y, is_move_to(cmd) ? unsigned(path_cmd_line_to) : cmd); } } } // Concatenate polygon/polyline. //-------------------------------------------------------------------- template void concat_poly(const T* data, unsigned num_points, bool closed) { poly_plain_adaptor poly(data, num_points, closed); concat_path(poly); } // Join polygon/polyline continuously. //-------------------------------------------------------------------- template void join_poly(const T* data, unsigned num_points, bool closed) { poly_plain_adaptor poly(data, num_points, closed); join_path(poly); } //-------------------------------------------------------------------- void translate(double dx, double dy, unsigned path_id=0); void translate_all_paths(double dx, double dy); //-------------------------------------------------------------------- template void transform(const Trans& trans, unsigned path_id=0) { unsigned num_ver = m_vertices.total_vertices(); for(; path_id < num_ver; path_id++) { double x, y; unsigned cmd = m_vertices.vertex(path_id, &x, &y); if(is_stop(cmd)) break; if(is_vertex(cmd)) { trans.transform(&x, &y); m_vertices.modify_vertex(path_id, x, y); } } } //-------------------------------------------------------------------- template void transform_all_paths(const Trans& trans) { unsigned idx; unsigned num_ver = m_vertices.total_vertices(); for(idx = 0; idx < num_ver; idx++) { double x, y; if(is_vertex(m_vertices.vertex(idx, &x, &y))) { trans.transform(&x, &y); m_vertices.modify_vertex(idx, x, y); } } } private: unsigned perceive_polygon_orientation(unsigned start, unsigned end); void invert_polygon(unsigned start, unsigned end); VertexContainer m_vertices; unsigned m_iterator; }; //------------------------------------------------------------------------ template unsigned path_base::start_new_path() { if(!is_stop(m_vertices.last_command())) { m_vertices.add_vertex(0.0, 0.0, path_cmd_stop); } return m_vertices.total_vertices(); } //------------------------------------------------------------------------ template inline void path_base::rel_to_abs(double* x, double* y) const { if(m_vertices.total_vertices()) { double x2; double y2; if(is_vertex(m_vertices.last_vertex(&x2, &y2))) { *x += x2; *y += y2; } } } //------------------------------------------------------------------------ template inline void path_base::move_to(double x, double y) { m_vertices.add_vertex(x, y, path_cmd_move_to); } //------------------------------------------------------------------------ template inline void path_base::move_rel(double dx, double dy) { rel_to_abs(&dx, &dy); m_vertices.add_vertex(dx, dy, path_cmd_move_to); } //------------------------------------------------------------------------ template inline void path_base::line_to(double x, double y) { m_vertices.add_vertex(x, y, path_cmd_line_to); } //------------------------------------------------------------------------ template inline void path_base::line_rel(double dx, double dy) { rel_to_abs(&dx, &dy); m_vertices.add_vertex(dx, dy, path_cmd_line_to); } //------------------------------------------------------------------------ template inline void path_base::hline_to(double x) { m_vertices.add_vertex(x, last_y(), path_cmd_line_to); } //------------------------------------------------------------------------ template inline void path_base::hline_rel(double dx) { double dy = 0; rel_to_abs(&dx, &dy); m_vertices.add_vertex(dx, dy, path_cmd_line_to); } //------------------------------------------------------------------------ template inline void path_base::vline_to(double y) { m_vertices.add_vertex(last_x(), y, path_cmd_line_to); } //------------------------------------------------------------------------ template inline void path_base::vline_rel(double dy) { double dx = 0; rel_to_abs(&dx, &dy); m_vertices.add_vertex(dx, dy, path_cmd_line_to); } //------------------------------------------------------------------------ template void path_base::arc_to(double rx, double ry, double angle, bool large_arc_flag, bool sweep_flag, double x, double y) { if(m_vertices.total_vertices() && is_vertex(m_vertices.last_command())) { const double epsilon = 1e-30; double x0 = 0.0; double y0 = 0.0; m_vertices.last_vertex(&x0, &y0); rx = fabs(rx); ry = fabs(ry); // Ensure radii are valid //------------------------- if(rx < epsilon || ry < epsilon) { line_to(x, y); return; } if(calc_distance(x0, y0, x, y) < epsilon) { // If the endpoints (x, y) and (x0, y0) are identical, then this // is equivalent to omitting the elliptical arc segment entirely. return; } bezier_arc_svg a(x0, y0, rx, ry, angle, large_arc_flag, sweep_flag, x, y); if(a.radii_ok()) { join_path(a); } else { line_to(x, y); } } else { move_to(x, y); } } //------------------------------------------------------------------------ template void path_base::arc_rel(double rx, double ry, double angle, bool large_arc_flag, bool sweep_flag, double dx, double dy) { rel_to_abs(&dx, &dy); arc_to(rx, ry, angle, large_arc_flag, sweep_flag, dx, dy); } //------------------------------------------------------------------------ template void path_base::curve3(double x_ctrl, double y_ctrl, double x_to, double y_to) { m_vertices.add_vertex(x_ctrl, y_ctrl, path_cmd_curve3); m_vertices.add_vertex(x_to, y_to, path_cmd_curve3); } //------------------------------------------------------------------------ template void path_base::curve3_rel(double dx_ctrl, double dy_ctrl, double dx_to, double dy_to) { rel_to_abs(&dx_ctrl, &dy_ctrl); rel_to_abs(&dx_to, &dy_to); m_vertices.add_vertex(dx_ctrl, dy_ctrl, path_cmd_curve3); m_vertices.add_vertex(dx_to, dy_to, path_cmd_curve3); } //------------------------------------------------------------------------ template void path_base::curve3(double x_to, double y_to) { double x0; double y0; if(is_vertex(m_vertices.last_vertex(&x0, &y0))) { double x_ctrl; double y_ctrl; unsigned cmd = m_vertices.prev_vertex(&x_ctrl, &y_ctrl); if(is_curve(cmd)) { x_ctrl = x0 + x0 - x_ctrl; y_ctrl = y0 + y0 - y_ctrl; } else { x_ctrl = x0; y_ctrl = y0; } curve3(x_ctrl, y_ctrl, x_to, y_to); } } //------------------------------------------------------------------------ template void path_base::curve3_rel(double dx_to, double dy_to) { rel_to_abs(&dx_to, &dy_to); curve3(dx_to, dy_to); } //------------------------------------------------------------------------ template void path_base::curve4(double x_ctrl1, double y_ctrl1, double x_ctrl2, double y_ctrl2, double x_to, double y_to) { m_vertices.add_vertex(x_ctrl1, y_ctrl1, path_cmd_curve4); m_vertices.add_vertex(x_ctrl2, y_ctrl2, path_cmd_curve4); m_vertices.add_vertex(x_to, y_to, path_cmd_curve4); } //------------------------------------------------------------------------ template void path_base::curve4_rel(double dx_ctrl1, double dy_ctrl1, double dx_ctrl2, double dy_ctrl2, double dx_to, double dy_to) { rel_to_abs(&dx_ctrl1, &dy_ctrl1); rel_to_abs(&dx_ctrl2, &dy_ctrl2); rel_to_abs(&dx_to, &dy_to); m_vertices.add_vertex(dx_ctrl1, dy_ctrl1, path_cmd_curve4); m_vertices.add_vertex(dx_ctrl2, dy_ctrl2, path_cmd_curve4); m_vertices.add_vertex(dx_to, dy_to, path_cmd_curve4); } //------------------------------------------------------------------------ template void path_base::curve4(double x_ctrl2, double y_ctrl2, double x_to, double y_to) { double x0; double y0; if(is_vertex(last_vertex(&x0, &y0))) { double x_ctrl1; double y_ctrl1; unsigned cmd = prev_vertex(&x_ctrl1, &y_ctrl1); if(is_curve(cmd)) { x_ctrl1 = x0 + x0 - x_ctrl1; y_ctrl1 = y0 + y0 - y_ctrl1; } else { x_ctrl1 = x0; y_ctrl1 = y0; } curve4(x_ctrl1, y_ctrl1, x_ctrl2, y_ctrl2, x_to, y_to); } } //------------------------------------------------------------------------ template void path_base::curve4_rel(double dx_ctrl2, double dy_ctrl2, double dx_to, double dy_to) { rel_to_abs(&dx_ctrl2, &dy_ctrl2); rel_to_abs(&dx_to, &dy_to); curve4(dx_ctrl2, dy_ctrl2, dx_to, dy_to); } //------------------------------------------------------------------------ template inline void path_base::end_poly(unsigned flags) { if(is_vertex(m_vertices.last_command())) { m_vertices.add_vertex(0.0, 0.0, path_cmd_end_poly | flags); } } //------------------------------------------------------------------------ template inline void path_base::close_polygon(unsigned flags) { end_poly(path_flags_close | flags); } //------------------------------------------------------------------------ template inline unsigned path_base::total_vertices() const { return m_vertices.total_vertices(); } //------------------------------------------------------------------------ template inline unsigned path_base::last_vertex(double* x, double* y) const { return m_vertices.last_vertex(x, y); } //------------------------------------------------------------------------ template inline unsigned path_base::prev_vertex(double* x, double* y) const { return m_vertices.prev_vertex(x, y); } //------------------------------------------------------------------------ template inline double path_base::last_x() const { return m_vertices.last_x(); } //------------------------------------------------------------------------ template inline double path_base::last_y() const { return m_vertices.last_y(); } //------------------------------------------------------------------------ template inline unsigned path_base::vertex(unsigned idx, double* x, double* y) const { return m_vertices.vertex(idx, x, y); } //------------------------------------------------------------------------ template inline unsigned path_base::command(unsigned idx) const { return m_vertices.command(idx); } //------------------------------------------------------------------------ template void path_base::modify_vertex(unsigned idx, double x, double y) { m_vertices.modify_vertex(idx, x, y); } //------------------------------------------------------------------------ template void path_base::modify_vertex(unsigned idx, double x, double y, unsigned cmd) { m_vertices.modify_vertex(idx, x, y, cmd); } //------------------------------------------------------------------------ template void path_base::modify_command(unsigned idx, unsigned cmd) { m_vertices.modify_command(idx, cmd); } //------------------------------------------------------------------------ template inline void path_base::rewind(unsigned path_id) { m_iterator = path_id; } //------------------------------------------------------------------------ template inline unsigned path_base::vertex(double* x, double* y) { if(m_iterator >= m_vertices.total_vertices()) return path_cmd_stop; return m_vertices.vertex(m_iterator++, x, y); } //------------------------------------------------------------------------ template unsigned path_base::perceive_polygon_orientation(unsigned start, unsigned end) { // Calculate signed area (double area to be exact) //--------------------- unsigned np = end - start; double area = 0.0; unsigned i; for(i = 0; i < np; i++) { double x1, y1, x2, y2; m_vertices.vertex(start + i, &x1, &y1); m_vertices.vertex(start + (i + 1) % np, &x2, &y2); area += x1 * y2 - y1 * x2; } return (area < 0.0) ? path_flags_cw : path_flags_ccw; } //------------------------------------------------------------------------ template void path_base::invert_polygon(unsigned start, unsigned end) { unsigned i; unsigned tmp_cmd = m_vertices.command(start); --end; // Make "end" inclusive // Shift all commands to one position for(i = start; i < end; i++) { m_vertices.modify_command(i, m_vertices.command(i + 1)); } // Assign starting command to the ending command m_vertices.modify_command(end, tmp_cmd); // Reverse the polygon while(end > start) { m_vertices.swap_vertices(start++, end--); } } //------------------------------------------------------------------------ template void path_base::invert_polygon(unsigned start) { // Skip all non-vertices at the beginning while(start < m_vertices.total_vertices() && !is_vertex(m_vertices.command(start))) ++start; // Skip all insignificant move_to while(start+1 < m_vertices.total_vertices() && is_move_to(m_vertices.command(start)) && is_move_to(m_vertices.command(start+1))) ++start; // Find the last vertex unsigned end = start + 1; while(end < m_vertices.total_vertices() && !is_next_poly(m_vertices.command(end))) ++end; invert_polygon(start, end); } //------------------------------------------------------------------------ template unsigned path_base::arrange_polygon_orientation(unsigned start, path_flags_e orientation) { if(orientation == path_flags_none) return start; // Skip all non-vertices at the beginning while(start < m_vertices.total_vertices() && !is_vertex(m_vertices.command(start))) ++start; // Skip all insignificant move_to while(start+1 < m_vertices.total_vertices() && is_move_to(m_vertices.command(start)) && is_move_to(m_vertices.command(start+1))) ++start; // Find the last vertex unsigned end = start + 1; while(end < m_vertices.total_vertices() && !is_next_poly(m_vertices.command(end))) ++end; if(end - start > 2) { if(perceive_polygon_orientation(start, end) != unsigned(orientation)) { // Invert polygon, set orientation flag, and skip all end_poly invert_polygon(start, end); unsigned cmd; while(end < m_vertices.total_vertices() && is_end_poly(cmd = m_vertices.command(end))) { m_vertices.modify_command(end++, set_orientation(cmd, orientation)); } } } return end; } //------------------------------------------------------------------------ template unsigned path_base::arrange_orientations(unsigned start, path_flags_e orientation) { if(orientation != path_flags_none) { while(start < m_vertices.total_vertices()) { start = arrange_polygon_orientation(start, orientation); if(is_stop(m_vertices.command(start))) { ++start; break; } } } return start; } //------------------------------------------------------------------------ template void path_base::arrange_orientations_all_paths(path_flags_e orientation) { if(orientation != path_flags_none) { unsigned start = 0; while(start < m_vertices.total_vertices()) { start = arrange_orientations(start, orientation); } } } //------------------------------------------------------------------------ template void path_base::flip_x(double x1, double x2) { unsigned i; double x, y; for(i = 0; i < m_vertices.total_vertices(); i++) { unsigned cmd = m_vertices.vertex(i, &x, &y); if(is_vertex(cmd)) { m_vertices.modify_vertex(i, x2 - x + x1, y); } } } //------------------------------------------------------------------------ template void path_base::flip_y(double y1, double y2) { unsigned i; double x, y; for(i = 0; i < m_vertices.total_vertices(); i++) { unsigned cmd = m_vertices.vertex(i, &x, &y); if(is_vertex(cmd)) { m_vertices.modify_vertex(i, x, y2 - y + y1); } } } //------------------------------------------------------------------------ template void path_base::translate(double dx, double dy, unsigned path_id) { unsigned num_ver = m_vertices.total_vertices(); for(; path_id < num_ver; path_id++) { double x, y; unsigned cmd = m_vertices.vertex(path_id, &x, &y); if(is_stop(cmd)) break; if(is_vertex(cmd)) { x += dx; y += dy; m_vertices.modify_vertex(path_id, x, y); } } } //------------------------------------------------------------------------ template void path_base::translate_all_paths(double dx, double dy) { unsigned idx; unsigned num_ver = m_vertices.total_vertices(); for(idx = 0; idx < num_ver; idx++) { double x, y; if(is_vertex(m_vertices.vertex(idx, &x, &y))) { x += dx; y += dy; m_vertices.modify_vertex(idx, x, y); } } } //-----------------------------------------------------vertex_stl_storage template class vertex_stl_storage { public: typedef typename Container::value_type vertex_type; typedef typename vertex_type::value_type value_type; void remove_all() { m_vertices.clear(); } void free_all() { m_vertices.clear(); } void add_vertex(double x, double y, unsigned cmd) { m_vertices.push_back(vertex_type(value_type(x), value_type(y), int8u(cmd))); } void modify_vertex(unsigned idx, double x, double y) { vertex_type& v = m_vertices[idx]; v.x = value_type(x); v.y = value_type(y); } void modify_vertex(unsigned idx, double x, double y, unsigned cmd) { vertex_type& v = m_vertices[idx]; v.x = value_type(x); v.y = value_type(y); v.cmd = int8u(cmd); } void modify_command(unsigned idx, unsigned cmd) { m_vertices[idx].cmd = int8u(cmd); } void swap_vertices(unsigned v1, unsigned v2) { vertex_type t = m_vertices[v1]; m_vertices[v1] = m_vertices[v2]; m_vertices[v2] = t; } unsigned last_command() const { return m_vertices.size() ? m_vertices[m_vertices.size() - 1].cmd : path_cmd_stop; } unsigned last_vertex(double* x, double* y) const { if(m_vertices.size() == 0) { *x = *y = 0.0; return path_cmd_stop; } return vertex(m_vertices.size() - 1, x, y); } unsigned prev_vertex(double* x, double* y) const { if(m_vertices.size() < 2) { *x = *y = 0.0; return path_cmd_stop; } return vertex(m_vertices.size() - 2, x, y); } double last_x() const { return m_vertices.size() ? m_vertices[m_vertices.size() - 1].x : 0.0; } double last_y() const { return m_vertices.size() ? m_vertices[m_vertices.size() - 1].y : 0.0; } unsigned total_vertices() const { return m_vertices.size(); } unsigned vertex(unsigned idx, double* x, double* y) const { const vertex_type& v = m_vertices[idx]; *x = v.x; *y = v.y; return v.cmd; } unsigned command(unsigned idx) const { return m_vertices[idx].cmd; } private: Container m_vertices; }; //-----------------------------------------------------------path_storage typedef path_base > path_storage; // Example of declarations path_storage with pod_bvector as a container //----------------------------------------------------------------------- //typedef path_base > > path_storage; } // Example of declarations path_storage with std::vector as a container //--------------------------------------------------------------------------- //#include //namespace agg //{ // typedef path_base > > stl_path_storage; //} #endif contextfree-3.0.5+dfsg1.orig/src-agg/include/agg_conv_adaptor_vcgen.h0000644000175000017500000001155012076364074024241 0ustar brambram//---------------------------------------------------------------------------- // Anti-Grain Geometry - Version 2.4 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) // // Permission to copy, use, modify, sell and distribute this software // is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // //---------------------------------------------------------------------------- // Contact: mcseem@antigrain.com // mcseemagg@yahoo.com // http://www.antigrain.com //---------------------------------------------------------------------------- #ifndef AGG_CONV_ADAPTOR_VCGEN_INCLUDED #define AGG_CONV_ADAPTOR_VCGEN_INCLUDED #include "agg_basics.h" namespace agg { //------------------------------------------------------------null_markers struct null_markers { void remove_all() {} void add_vertex(double, double, unsigned) {} void prepare_src() {} void rewind(unsigned) {} unsigned vertex(double*, double*) { return path_cmd_stop; } }; //------------------------------------------------------conv_adaptor_vcgen template class conv_adaptor_vcgen { enum status { initial, accumulate, generate }; public: explicit conv_adaptor_vcgen(VertexSource& source) : m_source(&source), m_status(initial) {} void attach(VertexSource& source) { m_source = &source; } Generator& generator() { return m_generator; } const Generator& generator() const { return m_generator; } Markers& markers() { return m_markers; } const Markers& markers() const { return m_markers; } void rewind(unsigned path_id) { m_source->rewind(path_id); m_status = initial; } unsigned vertex(double* x, double* y); private: // Prohibit copying conv_adaptor_vcgen(const conv_adaptor_vcgen&); const conv_adaptor_vcgen& operator = (const conv_adaptor_vcgen&); VertexSource* m_source; Generator m_generator; Markers m_markers; status m_status; unsigned m_last_cmd; double m_start_x; double m_start_y; }; //------------------------------------------------------------------------ template unsigned conv_adaptor_vcgen::vertex(double* x, double* y) { unsigned cmd = path_cmd_stop; bool done = false; while(!done) { switch(m_status) { case initial: m_markers.remove_all(); m_last_cmd = m_source->vertex(&m_start_x, &m_start_y); m_status = accumulate; case accumulate: if(is_stop(m_last_cmd)) return path_cmd_stop; m_generator.remove_all(); m_generator.add_vertex(m_start_x, m_start_y, path_cmd_move_to); m_markers.add_vertex(m_start_x, m_start_y, path_cmd_move_to); for(;;) { cmd = m_source->vertex(x, y); if(is_vertex(cmd)) { m_last_cmd = cmd; if(is_move_to(cmd)) { m_start_x = *x; m_start_y = *y; break; } m_generator.add_vertex(*x, *y, cmd); m_markers.add_vertex(*x, *y, path_cmd_line_to); } else { if(is_stop(cmd)) { m_last_cmd = path_cmd_stop; break; } if(is_end_poly(cmd)) { m_generator.add_vertex(*x, *y, cmd); break; } } } m_generator.rewind(0); m_status = generate; case generate: cmd = m_generator.vertex(x, y); if(is_stop(cmd)) { m_status = accumulate; break; } done = true; break; } } return cmd; } } #endif contextfree-3.0.5+dfsg1.orig/src-agg/include/agg_bezier_arc.h0000644000175000017500000001321712076364074022507 0ustar brambram//---------------------------------------------------------------------------- // Anti-Grain Geometry - Version 2.4 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) // // Permission to copy, use, modify, sell and distribute this software // is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // //---------------------------------------------------------------------------- // Contact: mcseem@antigrain.com // mcseemagg@yahoo.com // http://www.antigrain.com //---------------------------------------------------------------------------- // // Arc generator. Produces at most 4 consecutive cubic bezier curves, i.e., // 4, 7, 10, or 13 vertices. // //---------------------------------------------------------------------------- #ifndef AGG_BEZIER_ARC_INCLUDED #define AGG_BEZIER_ARC_INCLUDED #include "agg_conv_transform.h" namespace agg { //----------------------------------------------------------------------- void arc_to_bezier(double cx, double cy, double rx, double ry, double start_angle, double sweep_angle, double* curve); //==============================================================bezier_arc // // See implemantaion agg_bezier_arc.cpp // class bezier_arc { public: //-------------------------------------------------------------------- bezier_arc() : m_vertex(26), m_num_vertices(0), m_cmd(path_cmd_line_to) {} bezier_arc(double x, double y, double rx, double ry, double start_angle, double sweep_angle) { init(x, y, rx, ry, start_angle, sweep_angle); } //-------------------------------------------------------------------- void init(double x, double y, double rx, double ry, double start_angle, double sweep_angle); //-------------------------------------------------------------------- void rewind(unsigned) { m_vertex = 0; } //-------------------------------------------------------------------- unsigned vertex(double* x, double* y) { if(m_vertex >= m_num_vertices) return path_cmd_stop; *x = m_vertices[m_vertex]; *y = m_vertices[m_vertex + 1]; m_vertex += 2; return (m_vertex == 2) ? path_cmd_move_to : m_cmd; } // Supplemantary functions. num_vertices() actually returns doubled // number of vertices. That is, for 1 vertex it returns 2. //-------------------------------------------------------------------- unsigned num_vertices() const { return m_num_vertices; } const double* vertices() const { return m_vertices; } double* vertices() { return m_vertices; } private: unsigned m_vertex; unsigned m_num_vertices; double m_vertices[26]; unsigned m_cmd; }; //==========================================================bezier_arc_svg // Compute an SVG-style bezier arc. // // Computes an elliptical arc from (x1, y1) to (x2, y2). The size and // orientation of the ellipse are defined by two radii (rx, ry) // and an x-axis-rotation, which indicates how the ellipse as a whole // is rotated relative to the current coordinate system. The center // (cx, cy) of the ellipse is calculated automatically to satisfy the // constraints imposed by the other parameters. // large-arc-flag and sweep-flag contribute to the automatic calculations // and help determine how the arc is drawn. class bezier_arc_svg { public: //-------------------------------------------------------------------- bezier_arc_svg() : m_arc(), m_radii_ok(false) {} bezier_arc_svg(double x1, double y1, double rx, double ry, double angle, bool large_arc_flag, bool sweep_flag, double x2, double y2) : m_arc(), m_radii_ok(false) { init(x1, y1, rx, ry, angle, large_arc_flag, sweep_flag, x2, y2); } //-------------------------------------------------------------------- void init(double x1, double y1, double rx, double ry, double angle, bool large_arc_flag, bool sweep_flag, double x2, double y2); //-------------------------------------------------------------------- bool radii_ok() const { return m_radii_ok; } //-------------------------------------------------------------------- void rewind(unsigned) { m_arc.rewind(0); } //-------------------------------------------------------------------- unsigned vertex(double* x, double* y) { return m_arc.vertex(x, y); } // Supplemantary functions. num_vertices() actually returns doubled // number of vertices. That is, for 1 vertex it returns 2. //-------------------------------------------------------------------- unsigned num_vertices() const { return m_arc.num_vertices(); } const double* vertices() const { return m_arc.vertices(); } double* vertices() { return m_arc.vertices(); } private: bezier_arc m_arc; bool m_radii_ok; }; } #endif contextfree-3.0.5+dfsg1.orig/src-agg/include/agg_color_rgba.h0000644000175000017500000006662212076364074022523 0ustar brambram//---------------------------------------------------------------------------- // Anti-Grain Geometry - Version 2.4 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) // // Permission to copy, use, modify, sell and distribute this software // is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // //---------------------------------------------------------------------------- // // Adaptation for high precision colors has been sponsored by // Liberty Technology Systems, Inc., visit http://lib-sys.com // // Liberty Technology Systems, Inc. is the provider of // PostScript and PDF technology for software developers. // //---------------------------------------------------------------------------- // Contact: mcseem@antigrain.com // mcseemagg@yahoo.com // http://www.antigrain.com //---------------------------------------------------------------------------- #ifndef AGG_COLOR_RGBA_INCLUDED #define AGG_COLOR_RGBA_INCLUDED #include #include "agg_basics.h" namespace agg { struct gray8; struct gray16; // Supported byte orders for RGB and RGBA pixel formats //======================================================================= struct order_rgb { enum rgb_e { R=0, G=1, B=2, rgb_tag, hasAlpha=false }; }; //----order_rgb struct order_bgr { enum bgr_e { B=0, G=1, R=2, rgb_tag, hasAlpha=false }; }; //----order_bgr struct order_rgba { enum rgba_e { R=0, G=1, B=2, A=3, rgba_tag, hasAlpha=true }; }; //----order_rgba struct order_argb { enum argb_e { A=0, R=1, G=2, B=3, rgba_tag, hasAlpha=true }; }; //----order_argb struct order_abgr { enum abgr_e { A=0, B=1, G=2, R=3, rgba_tag, hasAlpha=true }; }; //----order_abgr struct order_bgra { enum bgra_e { B=0, G=1, R=2, A=3, rgba_tag, hasAlpha=true }; }; //----order_bgra //====================================================================rgba struct rgba { typedef double value_type; double r; double g; double b; double a; //-------------------------------------------------------------------- rgba() {} //-------------------------------------------------------------------- rgba(double r_, double g_, double b_, double a_=1.0) : r(r_), g(g_), b(b_), a(a_) {} //-------------------------------------------------------------------- rgba(const rgba& c, double a_) : r(c.r), g(c.g), b(c.b), a(a_) {} //-------------------------------------------------------------------- void clear() { r = g = b = a = 0; } //-------------------------------------------------------------------- const rgba& transparent() { a = 0.0; return *this; } //-------------------------------------------------------------------- const rgba& opacity(double a_) { if(a_ < 0.0) a_ = 0.0; if(a_ > 1.0) a_ = 1.0; a = a_; return *this; } //-------------------------------------------------------------------- double opacity() const { return a; } //-------------------------------------------------------------------- const rgba& premultiply() { r *= a; g *= a; b *= a; return *this; } //-------------------------------------------------------------------- const rgba& premultiply(double a_) { if(a <= 0.0 || a_ <= 0.0) { r = g = b = a = 0.0; return *this; } a_ /= a; r *= a_; g *= a_; b *= a_; a = a_; return *this; } //-------------------------------------------------------------------- const rgba& demultiply() { if(a == 0) { r = g = b = 0; return *this; } double a_ = 1.0 / a; r *= a_; g *= a_; b *= a_; return *this; } //-------------------------------------------------------------------- rgba gradient(rgba c, double k) const { rgba ret; ret.r = r + (c.r - r) * k; ret.g = g + (c.g - g) * k; ret.b = b + (c.b - b) * k; ret.a = a + (c.a - a) * k; return ret; } //-------------------------------------------------------------------- static rgba no_color() { return rgba(0,0,0,0); } //-------------------------------------------------------------------- static rgba from_wavelength(double wl, double gamma = 1.0); //-------------------------------------------------------------------- explicit rgba(double wavelen, double gamma=1.0) { *this = from_wavelength(wavelen, gamma); } }; //----------------------------------------------------------------rgba_pre inline rgba rgba_pre(double r, double g, double b, double a=1.0) { return rgba(r, g, b, a).premultiply(); } inline rgba rgba_pre(const rgba& c) { return rgba(c).premultiply(); } inline rgba rgba_pre(const rgba& c, double a) { return rgba(c, a).premultiply(); } //------------------------------------------------------------------------ inline rgba rgba::from_wavelength(double wl, double gamma) { rgba t(0.0, 0.0, 0.0); if(wl >= 380.0 && wl <= 440.0) { t.r = -1.0 * (wl - 440.0) / (440.0 - 380.0); t.b = 1.0; } else if(wl >= 440.0 && wl <= 490.0) { t.g = (wl - 440.0) / (490.0 - 440.0); t.b = 1.0; } else if(wl >= 490.0 && wl <= 510.0) { t.g = 1.0; t.b = -1.0 * (wl - 510.0) / (510.0 - 490.0); } else if(wl >= 510.0 && wl <= 580.0) { t.r = (wl - 510.0) / (580.0 - 510.0); t.g = 1.0; } else if(wl >= 580.0 && wl <= 645.0) { t.r = 1.0; t.g = -1.0 * (wl - 645.0) / (645.0 - 580.0); } else if(wl >= 645.0 && wl <= 780.0) { t.r = 1.0; } double s = 1.0; if(wl > 700.0) s = 0.3 + 0.7 * (780.0 - wl) / (780.0 - 700.0); else if(wl < 420.0) s = 0.3 + 0.7 * (wl - 380.0) / (420.0 - 380.0); t.r = pow(t.r * s, gamma); t.g = pow(t.g * s, gamma); t.b = pow(t.b * s, gamma); return t; } //===================================================================rgba8 struct rgba8 { typedef int8u value_type; typedef int32u calc_type; typedef int32 long_type; enum base_scale_e { base_shift = 8, base_scale = 1 << base_shift, base_mask = base_scale - 1, base_MSB = 1 << (base_shift - 1) }; typedef rgba8 self_type; value_type r; value_type g; value_type b; value_type a; //-------------------------------------------------------------------- rgba8() {} //-------------------------------------------------------------------- rgba8(unsigned r_, unsigned g_, unsigned b_, unsigned a_=base_mask) : r(value_type(r_)), g(value_type(g_)), b(value_type(b_)), a(value_type(a_)) {} //-------------------------------------------------------------------- rgba8(const rgba& c, double a_) : r((value_type)uround(c.r * double(base_mask))), g((value_type)uround(c.g * double(base_mask))), b((value_type)uround(c.b * double(base_mask))), a((value_type)uround(a_ * double(base_mask))) {} //-------------------------------------------------------------------- rgba8(const self_type& c, unsigned a_) : r(c.r), g(c.g), b(c.b), a(value_type(a_)) {} //-------------------------------------------------------------------- rgba8(const rgba& c) : r((value_type)uround(c.r * double(base_mask))), g((value_type)uround(c.g * double(base_mask))), b((value_type)uround(c.b * double(base_mask))), a((value_type)uround(c.a * double(base_mask))) {} //-------------------------------------------------------------------- rgba8(const gray8& c); //-------------------------------------------------------------------- // fixed-point multiply, exact over uint8 static AGG_INLINE calc_type int_mult(calc_type a, calc_type b) { calc_type t = a * b + base_MSB; return ((t >> base_shift) + t) >> base_shift; } //-------------------------------------------------------------------- // fixed-point multiply, exact over uint8 // specifically for multiplying a color component by a cover static AGG_INLINE calc_type int_mult_cover(calc_type a, calc_type b) { return int_mult(a, b); } //-------------------------------------------------------------------- // linear interpolate q over p by a, assuming q is pre-muliplied by a static AGG_INLINE calc_type int_prelerp(calc_type p, calc_type q, calc_type a) { return p + q - int_mult(p, a); } //-------------------------------------------------------------------- // linear interpolate q over p by a static AGG_INLINE calc_type int_lerp(calc_type p, calc_type q, calc_type a) { return p + int_mult(q - p, a); } //-------------------------------------------------------------------- void clear() { r = g = b = a = 0; } //-------------------------------------------------------------------- const self_type& transparent() { a = 0; return *this; } //-------------------------------------------------------------------- const self_type& opacity(double a_) { if(a_ < 0.0) a_ = 0.0; if(a_ > 1.0) a_ = 1.0; a = (value_type)uround(a_ * double(base_mask)); return *this; } //-------------------------------------------------------------------- double opacity() const { return double(a) / double(base_mask); } //-------------------------------------------------------------------- AGG_INLINE const self_type& premultiply() { if(a == base_mask) return *this; if(a == 0) { r = g = b = 0; return *this; } r = (value_type)int_mult(r, a); g = (value_type)int_mult(g, a); b = (value_type)int_mult(b, a); return *this; } //-------------------------------------------------------------------- AGG_INLINE const self_type& premultiply(unsigned a_) { if(a == base_mask && a_ >= base_mask) return *this; if(a == 0 || a_ == 0) { r = g = b = a = 0; return *this; } calc_type r_ = (calc_type(r) * a_) / a; calc_type g_ = (calc_type(g) * a_) / a; calc_type b_ = (calc_type(b) * a_) / a; r = value_type((r_ > a_) ? a_ : r_); g = value_type((g_ > a_) ? a_ : g_); b = value_type((b_ > a_) ? a_ : b_); a = value_type(a_); return *this; } //-------------------------------------------------------------------- AGG_INLINE const self_type& demultiply() { if(a == base_mask) return *this; if(a == 0) { r = g = b = 0; return *this; } calc_type r_ = (calc_type(r) * base_mask) / a; calc_type g_ = (calc_type(g) * base_mask) / a; calc_type b_ = (calc_type(b) * base_mask) / a; r = value_type((r_ > calc_type(base_mask)) ? calc_type(base_mask) : r_); g = value_type((g_ > calc_type(base_mask)) ? calc_type(base_mask) : g_); b = value_type((b_ > calc_type(base_mask)) ? calc_type(base_mask) : b_); return *this; } //-------------------------------------------------------------------- AGG_INLINE self_type gradient(const self_type& c, double k) const { self_type ret; calc_type ik = uround(k * base_mask); ret.r = (value_type)int_lerp(r, c.r, ik); ret.g = (value_type)int_lerp(g, c.g, ik); ret.b = (value_type)int_lerp(b, c.b, ik); ret.a = (value_type)int_lerp(a, c.a, ik); return ret; } //-------------------------------------------------------------------- AGG_INLINE void add(const self_type& c, unsigned cover) { calc_type cr, cg, cb, ca; if(cover == cover_mask) { if(c.a == base_mask) { *this = c; return; } else { cr = r + c.r; cg = g + c.g; cb = b + c.b; ca = a + c.a; } } else { cr = r + int_mult_cover(c.r, cover); cg = g + int_mult_cover(c.g, cover); cb = b + int_mult_cover(c.b, cover); ca = a + int_mult_cover(c.a, cover); } r = (value_type)((cr > calc_type(base_mask)) ? calc_type(base_mask) : cr); g = (value_type)((cg > calc_type(base_mask)) ? calc_type(base_mask) : cg); b = (value_type)((cb > calc_type(base_mask)) ? calc_type(base_mask) : cb); a = (value_type)((ca > calc_type(base_mask)) ? calc_type(base_mask) : ca); } //-------------------------------------------------------------------- template AGG_INLINE void apply_gamma_dir(const GammaLUT& gamma) { r = gamma.dir(r); g = gamma.dir(g); b = gamma.dir(b); } //-------------------------------------------------------------------- template AGG_INLINE void apply_gamma_inv(const GammaLUT& gamma) { r = gamma.inv(r); g = gamma.inv(g); b = gamma.inv(b); } //-------------------------------------------------------------------- static self_type no_color() { return self_type(0,0,0,0); } //-------------------------------------------------------------------- static self_type from_wavelength(double wl, double gamma = 1.0) { return self_type(rgba::from_wavelength(wl, gamma)); } }; //-------------------------------------------------------------rgba8_pre inline rgba8 rgba8_pre(unsigned r, unsigned g, unsigned b, unsigned a = rgba8::base_mask) { return rgba8(r,g,b,a).premultiply(); } inline rgba8 rgba8_pre(const rgba8& c) { return rgba8(c).premultiply(); } inline rgba8 rgba8_pre(const rgba8& c, unsigned a) { return rgba8(c,a).premultiply(); } inline rgba8 rgba8_pre(const rgba& c) { return rgba8(c).premultiply(); } inline rgba8 rgba8_pre(const rgba& c, double a) { return rgba8(c,a).premultiply(); } //-------------------------------------------------------------rgb8_packed inline rgba8 rgb8_packed(unsigned v) { return rgba8((v >> 16) & 0xFF, (v >> 8) & 0xFF, v & 0xFF); } //-------------------------------------------------------------bgr8_packed inline rgba8 bgr8_packed(unsigned v) { return rgba8(v & 0xFF, (v >> 8) & 0xFF, (v >> 16) & 0xFF); } //------------------------------------------------------------argb8_packed inline rgba8 argb8_packed(unsigned v) { return rgba8((v >> 16) & 0xFF, (v >> 8) & 0xFF, v & 0xFF, v >> 24); } //---------------------------------------------------------rgba8_gamma_dir template rgba8 rgba8_gamma_dir(rgba8 c, const GammaLUT& gamma) { return rgba8(gamma.dir(c.r), gamma.dir(c.g), gamma.dir(c.b), c.a); } //---------------------------------------------------------rgba8_gamma_inv template rgba8 rgba8_gamma_inv(rgba8 c, const GammaLUT& gamma) { return rgba8(gamma.inv(c.r), gamma.inv(c.g), gamma.inv(c.b), c.a); } //==================================================================rgba16 struct rgba16 { typedef int16u value_type; typedef int32u calc_type; typedef int64 long_type; enum base_scale_e { base_shift = 16, base_scale = 1 << base_shift, base_mask = base_scale - 1, base_MSB = 1 << (base_shift - 1) }; typedef rgba16 self_type; value_type r; value_type g; value_type b; value_type a; //-------------------------------------------------------------------- rgba16() {} //-------------------------------------------------------------------- rgba16(unsigned r_, unsigned g_, unsigned b_, unsigned a_=base_mask) : r(value_type(r_)), g(value_type(g_)), b(value_type(b_)), a(value_type(a_)) {} //-------------------------------------------------------------------- rgba16(const self_type& c, unsigned a_) : r(c.r), g(c.g), b(c.b), a(value_type(a_)) {} //-------------------------------------------------------------------- rgba16(const rgba& c) : r((value_type)uround(c.r * double(base_mask))), g((value_type)uround(c.g * double(base_mask))), b((value_type)uround(c.b * double(base_mask))), a((value_type)uround(c.a * double(base_mask))) {} //-------------------------------------------------------------------- rgba16(const rgba& c, double a_) : r((value_type)uround(c.r * double(base_mask))), g((value_type)uround(c.g * double(base_mask))), b((value_type)uround(c.b * double(base_mask))), a((value_type)uround(a_ * double(base_mask))) {} //-------------------------------------------------------------------- rgba16(const rgba8& c) : r(value_type((value_type(c.r) << 8) | c.r)), g(value_type((value_type(c.g) << 8) | c.g)), b(value_type((value_type(c.b) << 8) | c.b)), a(value_type((value_type(c.a) << 8) | c.a)) {} //-------------------------------------------------------------------- rgba16(const rgba8& c, unsigned a_) : r(value_type((value_type(c.r) << 8) | c.r)), g(value_type((value_type(c.g) << 8) | c.g)), b(value_type((value_type(c.b) << 8) | c.b)), a(value_type(( a_ << 8) | c.a)) {} //-------------------------------------------------------------------- rgba16(const gray16& c); //-------------------------------------------------------------------- // fixed-point multiply, exact over uint16 static AGG_INLINE calc_type int_mult(calc_type a, calc_type b) { calc_type t = a * b + base_MSB; return ((t >> base_shift) + t) >> base_shift; } //-------------------------------------------------------------------- // fixed-point multiply, almost exact over uint16 // specifically for multiplying a color component by a cover static AGG_INLINE calc_type int_mult_cover(calc_type a, calc_type b) { return int_mult(a, (b << 8) | b); } //-------------------------------------------------------------------- // linear interpolate q over p by a, assuming q is pre-muliplied by a static AGG_INLINE calc_type int_prelerp(calc_type p, calc_type q, calc_type a) { return p + q - int_mult(p, a); } //-------------------------------------------------------------------- // linear interpolate q over p by a static AGG_INLINE calc_type int_lerp(calc_type p, calc_type q, calc_type a) { return p + int_mult(q - p, a); } //-------------------------------------------------------------------- void clear() { r = g = b = a = 0; } //-------------------------------------------------------------------- const self_type& transparent() { a = 0; return *this; } //-------------------------------------------------------------------- AGG_INLINE const self_type& opacity(double a_) { if(a_ < 0.0) a_ = 0.0; if(a_ > 1.0) a_ = 1.0; a = (value_type)uround(a_ * double(base_mask)); return *this; } //-------------------------------------------------------------------- double opacity() const { return double(a) / double(base_mask); } //-------------------------------------------------------------------- AGG_INLINE const self_type& premultiply() { if(a == base_mask) return *this; if(a == 0) { r = g = b = 0; return *this; } r = (value_type)int_mult(r, a); g = (value_type)int_mult(g, a); b = (value_type)int_mult(b, a); return *this; } //-------------------------------------------------------------------- AGG_INLINE const self_type& premultiply(unsigned a_) { if(a == base_mask && a_ >= base_mask) return *this; if(a == 0 || a_ == 0) { r = g = b = a = 0; return *this; } calc_type r_ = (calc_type(r) * a_) / a; calc_type g_ = (calc_type(g) * a_) / a; calc_type b_ = (calc_type(b) * a_) / a; r = value_type((r_ > a_) ? a_ : r_); g = value_type((g_ > a_) ? a_ : g_); b = value_type((b_ > a_) ? a_ : b_); a = value_type(a_); return *this; } //-------------------------------------------------------------------- AGG_INLINE const self_type& demultiply() { if(a == base_mask) return *this; if(a == 0) { r = g = b = 0; return *this; } calc_type r_ = (calc_type(r) * base_mask) / a; calc_type g_ = (calc_type(g) * base_mask) / a; calc_type b_ = (calc_type(b) * base_mask) / a; r = value_type((r_ > calc_type(base_mask)) ? calc_type(base_mask) : r_); g = value_type((g_ > calc_type(base_mask)) ? calc_type(base_mask) : g_); b = value_type((b_ > calc_type(base_mask)) ? calc_type(base_mask) : b_); return *this; } //-------------------------------------------------------------------- AGG_INLINE self_type gradient(const self_type& c, double k) const { self_type ret; calc_type ik = uround(k * base_mask); ret.r = (value_type)int_lerp(r, c.r, ik); ret.g = (value_type)int_lerp(g, c.g, ik); ret.b = (value_type)int_lerp(b, c.b, ik); ret.a = (value_type)int_lerp(a, c.a, ik); return ret; } //-------------------------------------------------------------------- AGG_INLINE void add(const self_type& c, unsigned cover) { calc_type cr, cg, cb, ca; if(cover == cover_mask) { if(c.a == base_mask) { *this = c; return; } else { cr = r + c.r; cg = g + c.g; cb = b + c.b; ca = a + c.a; } } else { cr = r + int_mult_cover(c.r, cover); cg = g + int_mult_cover(c.g, cover); cb = b + int_mult_cover(c.b, cover); ca = a + int_mult_cover(c.a, cover); } r = (value_type)((cr > calc_type(base_mask)) ? calc_type(base_mask) : cr); g = (value_type)((cg > calc_type(base_mask)) ? calc_type(base_mask) : cg); b = (value_type)((cb > calc_type(base_mask)) ? calc_type(base_mask) : cb); a = (value_type)((ca > calc_type(base_mask)) ? calc_type(base_mask) : ca); } //-------------------------------------------------------------------- template AGG_INLINE void apply_gamma_dir(const GammaLUT& gamma) { r = gamma.dir(r); g = gamma.dir(g); b = gamma.dir(b); } //-------------------------------------------------------------------- template AGG_INLINE void apply_gamma_inv(const GammaLUT& gamma) { r = gamma.inv(r); g = gamma.inv(g); b = gamma.inv(b); } //-------------------------------------------------------------------- static self_type no_color() { return self_type(0,0,0,0); } //-------------------------------------------------------------------- static self_type from_wavelength(double wl, double gamma = 1.0) { return self_type(rgba::from_wavelength(wl, gamma)); } }; //--------------------------------------------------------------rgba16_pre inline rgba16 rgba16_pre(unsigned r, unsigned g, unsigned b, unsigned a = rgba16::base_mask) { return rgba16(r,g,b,a).premultiply(); } inline rgba16 rgba16_pre(const rgba16& c, unsigned a) { return rgba16(c,a).premultiply(); } inline rgba16 rgba16_pre(const rgba& c) { return rgba16(c).premultiply(); } inline rgba16 rgba16_pre(const rgba& c, double a) { return rgba16(c,a).premultiply(); } inline rgba16 rgba16_pre(const rgba8& c) { return rgba16(c).premultiply(); } inline rgba16 rgba16_pre(const rgba8& c, unsigned a) { return rgba16(c,a).premultiply(); } //------------------------------------------------------rgba16_gamma_dir template rgba16 rgba16_gamma_dir(rgba16 c, const GammaLUT& gamma) { return rgba16(gamma.dir(c.r), gamma.dir(c.g), gamma.dir(c.b), c.a); } //------------------------------------------------------rgba16_gamma_inv template rgba16 rgba16_gamma_inv(rgba16 c, const GammaLUT& gamma) { return rgba16(gamma.inv(c.r), gamma.inv(c.g), gamma.inv(c.b), c.a); } } #endif contextfree-3.0.5+dfsg1.orig/src-agg/include/agg_clip_liang_barsky.h0000644000175000017500000002263212076364074024057 0ustar brambram//---------------------------------------------------------------------------- // Anti-Grain Geometry - Version 2.4 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) // // Permission to copy, use, modify, sell and distribute this software // is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // //---------------------------------------------------------------------------- // Contact: mcseem@antigrain.com // mcseemagg@yahoo.com // http://www.antigrain.com //---------------------------------------------------------------------------- // // Liang-Barsky clipping // //---------------------------------------------------------------------------- #ifndef AGG_CLIP_LIANG_BARSKY_INCLUDED #define AGG_CLIP_LIANG_BARSKY_INCLUDED #include "agg_basics.h" namespace agg { //------------------------------------------------------------------------ enum clipping_flags_e { clipping_flags_x1_clipped = 4, clipping_flags_x2_clipped = 1, clipping_flags_y1_clipped = 8, clipping_flags_y2_clipped = 2, clipping_flags_x_clipped = clipping_flags_x1_clipped | clipping_flags_x2_clipped, clipping_flags_y_clipped = clipping_flags_y1_clipped | clipping_flags_y2_clipped }; //----------------------------------------------------------clipping_flags // Determine the clipping code of the vertex according to the // Cyrus-Beck line clipping algorithm // // | | // 0110 | 0010 | 0011 // | | // -------+--------+-------- clip_box.y2 // | | // 0100 | 0000 | 0001 // | | // -------+--------+-------- clip_box.y1 // | | // 1100 | 1000 | 1001 // | | // clip_box.x1 clip_box.x2 // // template inline unsigned clipping_flags(T x, T y, const rect_base& clip_box) { return (x > clip_box.x2) | ((y > clip_box.y2) << 1) | ((x < clip_box.x1) << 2) | ((y < clip_box.y1) << 3); } //--------------------------------------------------------clipping_flags_x template inline unsigned clipping_flags_x(T x, const rect_base& clip_box) { return (x > clip_box.x2) | ((x < clip_box.x1) << 2); } //--------------------------------------------------------clipping_flags_y template inline unsigned clipping_flags_y(T y, const rect_base& clip_box) { return ((y > clip_box.y2) << 1) | ((y < clip_box.y1) << 3); } //-------------------------------------------------------clip_liang_barsky template inline unsigned clip_liang_barsky(T x1, T y1, T x2, T y2, const rect_base& clip_box, T* x, T* y) { const double nearzero = 1e-30; double deltax = x2 - x1; double deltay = y2 - y1; double xin; double xout; double yin; double yout; double tinx; double tiny; double toutx; double touty; double tin1; double tin2; double tout1; unsigned np = 0; if(deltax == 0.0) { // bump off of the vertical deltax = (x1 > clip_box.x1) ? -nearzero : nearzero; } if(deltay == 0.0) { // bump off of the horizontal deltay = (y1 > clip_box.y1) ? -nearzero : nearzero; } if(deltax > 0.0) { // points to right xin = clip_box.x1; xout = clip_box.x2; } else { xin = clip_box.x2; xout = clip_box.x1; } if(deltay > 0.0) { // points up yin = clip_box.y1; yout = clip_box.y2; } else { yin = clip_box.y2; yout = clip_box.y1; } tinx = (xin - x1) / deltax; tiny = (yin - y1) / deltay; if (tinx < tiny) { // hits x first tin1 = tinx; tin2 = tiny; } else { // hits y first tin1 = tiny; tin2 = tinx; } if(tin1 <= 1.0) { if(0.0 < tin1) { *x++ = (T)xin; *y++ = (T)yin; ++np; } if(tin2 <= 1.0) { toutx = (xout - x1) / deltax; touty = (yout - y1) / deltay; tout1 = (toutx < touty) ? toutx : touty; if(tin2 > 0.0 || tout1 > 0.0) { if(tin2 <= tout1) { if(tin2 > 0.0) { if(tinx > tiny) { *x++ = (T)xin; *y++ = (T)(y1 + tinx * deltay); } else { *x++ = (T)(x1 + tiny * deltax); *y++ = (T)yin; } ++np; } if(tout1 < 1.0) { if(toutx < touty) { *x++ = (T)xout; *y++ = (T)(y1 + toutx * deltay); } else { *x++ = (T)(x1 + touty * deltax); *y++ = (T)yout; } } else { *x++ = x2; *y++ = y2; } ++np; } else { if(tinx > tiny) { *x++ = (T)xin; *y++ = (T)yout; } else { *x++ = (T)xout; *y++ = (T)yin; } ++np; } } } } return np; } //---------------------------------------------------------------------------- template bool clip_move_point(T x1, T y1, T x2, T y2, const rect_base& clip_box, T* x, T* y, unsigned flags) { T bound; if(flags & clipping_flags_x_clipped) { if(x1 == x2) { return false; } bound = (flags & clipping_flags_x1_clipped) ? clip_box.x1 : clip_box.x2; *y = (T)(double(bound - x1) * (y2 - y1) / (x2 - x1) + y1); *x = bound; } flags = clipping_flags_y(*y, clip_box); if(flags & clipping_flags_y_clipped) { if(y1 == y2) { return false; } bound = (flags & clipping_flags_y1_clipped) ? clip_box.y1 : clip_box.y2; *x = (T)(double(bound - y1) * (x2 - x1) / (y2 - y1) + x1); *y = bound; } return true; } //-------------------------------------------------------clip_line_segment // Returns: ret >= 4 - Fully clipped // (ret & 1) != 0 - First point has been moved // (ret & 2) != 0 - Second point has been moved // template unsigned clip_line_segment(T* x1, T* y1, T* x2, T* y2, const rect_base& clip_box) { unsigned f1 = clipping_flags(*x1, *y1, clip_box); unsigned f2 = clipping_flags(*x2, *y2, clip_box); unsigned ret = 0; if((f2 | f1) == 0) { // Fully visible return 0; } if((f1 & clipping_flags_x_clipped) != 0 && (f1 & clipping_flags_x_clipped) == (f2 & clipping_flags_x_clipped)) { // Fully clipped return 4; } if((f1 & clipping_flags_y_clipped) != 0 && (f1 & clipping_flags_y_clipped) == (f2 & clipping_flags_y_clipped)) { // Fully clipped return 4; } T tx1 = *x1; T ty1 = *y1; T tx2 = *x2; T ty2 = *y2; if(f1) { if(!clip_move_point(tx1, ty1, tx2, ty2, clip_box, x1, y1, f1)) { return 4; } if(*x1 == *x2 && *y1 == *y2) { return 4; } ret |= 1; } if(f2) { if(!clip_move_point(tx1, ty1, tx2, ty2, clip_box, x2, y2, f2)) { return 4; } if(*x1 == *x2 && *y1 == *y2) { return 4; } ret |= 2; } return ret; } } #endif contextfree-3.0.5+dfsg1.orig/src-agg/include/agg_math.h0000644000175000017500000003475612076364074021346 0ustar brambram//---------------------------------------------------------------------------- // Anti-Grain Geometry - Version 2.4 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) // // Permission to copy, use, modify, sell and distribute this software // is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // //---------------------------------------------------------------------------- // Contact: mcseem@antigrain.com // mcseemagg@yahoo.com // http://www.antigrain.com //---------------------------------------------------------------------------- // Bessel function (besj) was adapted for use in AGG library by Andy Wilk // Contact: castor.vulgaris@gmail.com //---------------------------------------------------------------------------- #ifndef AGG_MATH_INCLUDED #define AGG_MATH_INCLUDED #include #include "agg_basics.h" namespace agg { //------------------------------------------------------vertex_dist_epsilon // Coinciding points maximal distance (Epsilon) const double vertex_dist_epsilon = 1e-14; //-----------------------------------------------------intersection_epsilon // See calc_intersection const double intersection_epsilon = 1.0e-30; //------------------------------------------------------------cross_product AGG_INLINE double cross_product(double x1, double y1, double x2, double y2, double x, double y) { return (x - x2) * (y2 - y1) - (y - y2) * (x2 - x1); } //--------------------------------------------------------point_in_triangle AGG_INLINE bool point_in_triangle(double x1, double y1, double x2, double y2, double x3, double y3, double x, double y) { bool cp1 = cross_product(x1, y1, x2, y2, x, y) < 0.0; bool cp2 = cross_product(x2, y2, x3, y3, x, y) < 0.0; bool cp3 = cross_product(x3, y3, x1, y1, x, y) < 0.0; return cp1 == cp2 && cp2 == cp3 && cp3 == cp1; } //-----------------------------------------------------------calc_distance AGG_INLINE double calc_distance(double x1, double y1, double x2, double y2) { double dx = x2-x1; double dy = y2-y1; return sqrt(dx * dx + dy * dy); } //--------------------------------------------------------calc_sq_distance AGG_INLINE double calc_sq_distance(double x1, double y1, double x2, double y2) { double dx = x2-x1; double dy = y2-y1; return dx * dx + dy * dy; } //------------------------------------------------calc_line_point_distance AGG_INLINE double calc_line_point_distance(double x1, double y1, double x2, double y2, double x, double y) { double dx = x2-x1; double dy = y2-y1; double d = sqrt(dx * dx + dy * dy); if(d < vertex_dist_epsilon) { return calc_distance(x1, y1, x, y); } return ((x - x2) * dy - (y - y2) * dx) / d; } //-------------------------------------------------------calc_line_point_u AGG_INLINE double calc_segment_point_u(double x1, double y1, double x2, double y2, double x, double y) { double dx = x2 - x1; double dy = y2 - y1; if(dx == 0 && dy == 0) { return 0; } double pdx = x - x1; double pdy = y - y1; return (pdx * dx + pdy * dy) / (dx * dx + dy * dy); } //---------------------------------------------calc_line_point_sq_distance AGG_INLINE double calc_segment_point_sq_distance(double x1, double y1, double x2, double y2, double x, double y, double u) { if(u <= 0) { return calc_sq_distance(x, y, x1, y1); } else if(u >= 1) { return calc_sq_distance(x, y, x2, y2); } return calc_sq_distance(x, y, x1 + u * (x2 - x1), y1 + u * (y2 - y1)); } //---------------------------------------------calc_line_point_sq_distance AGG_INLINE double calc_segment_point_sq_distance(double x1, double y1, double x2, double y2, double x, double y) { return calc_segment_point_sq_distance( x1, y1, x2, y2, x, y, calc_segment_point_u(x1, y1, x2, y2, x, y)); } //-------------------------------------------------------calc_intersection AGG_INLINE bool calc_intersection(double ax, double ay, double bx, double by, double cx, double cy, double dx, double dy, double* x, double* y) { double num = (ay-cy) * (dx-cx) - (ax-cx) * (dy-cy); double den = (bx-ax) * (dy-cy) - (by-ay) * (dx-cx); if(fabs(den) < intersection_epsilon) return false; double r = num / den; *x = ax + r * (bx-ax); *y = ay + r * (by-ay); return true; } //-----------------------------------------------------intersection_exists AGG_INLINE bool intersection_exists(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4) { // It's less expensive but you can't control the // boundary conditions: Less or LessEqual double dx1 = x2 - x1; double dy1 = y2 - y1; double dx2 = x4 - x3; double dy2 = y4 - y3; return ((x3 - x2) * dy1 - (y3 - y2) * dx1 < 0.0) != ((x4 - x2) * dy1 - (y4 - y2) * dx1 < 0.0) && ((x1 - x4) * dy2 - (y1 - y4) * dx2 < 0.0) != ((x2 - x4) * dy2 - (y2 - y4) * dx2 < 0.0); // It's is more expensive but more flexible // in terms of boundary conditions. //-------------------- //double den = (x2-x1) * (y4-y3) - (y2-y1) * (x4-x3); //if(fabs(den) < intersection_epsilon) return false; //double nom1 = (x4-x3) * (y1-y3) - (y4-y3) * (x1-x3); //double nom2 = (x2-x1) * (y1-y3) - (y2-y1) * (x1-x3); //double ua = nom1 / den; //double ub = nom2 / den; //return ua >= 0.0 && ua <= 1.0 && ub >= 0.0 && ub <= 1.0; } //--------------------------------------------------------calc_orthogonal AGG_INLINE void calc_orthogonal(double thickness, double x1, double y1, double x2, double y2, double* x, double* y) { double dx = x2 - x1; double dy = y2 - y1; double d = sqrt(dx*dx + dy*dy); *x = thickness * dy / d; *y = -thickness * dx / d; } //--------------------------------------------------------dilate_triangle AGG_INLINE void dilate_triangle(double x1, double y1, double x2, double y2, double x3, double y3, double *x, double* y, double d) { double dx1=0.0; double dy1=0.0; double dx2=0.0; double dy2=0.0; double dx3=0.0; double dy3=0.0; double loc = cross_product(x1, y1, x2, y2, x3, y3); if(fabs(loc) > intersection_epsilon) { if(cross_product(x1, y1, x2, y2, x3, y3) > 0.0) { d = -d; } calc_orthogonal(d, x1, y1, x2, y2, &dx1, &dy1); calc_orthogonal(d, x2, y2, x3, y3, &dx2, &dy2); calc_orthogonal(d, x3, y3, x1, y1, &dx3, &dy3); } *x++ = x1 + dx1; *y++ = y1 + dy1; *x++ = x2 + dx1; *y++ = y2 + dy1; *x++ = x2 + dx2; *y++ = y2 + dy2; *x++ = x3 + dx2; *y++ = y3 + dy2; *x++ = x3 + dx3; *y++ = y3 + dy3; *x++ = x1 + dx3; *y++ = y1 + dy3; } //------------------------------------------------------calc_triangle_area AGG_INLINE double calc_triangle_area(double x1, double y1, double x2, double y2, double x3, double y3) { return (x1*y2 - x2*y1 + x2*y3 - x3*y2 + x3*y1 - x1*y3) * 0.5; } //-------------------------------------------------------calc_polygon_area template double calc_polygon_area(const Storage& st) { unsigned i; double sum = 0.0; double x = st[0].x; double y = st[0].y; double xs = x; double ys = y; for(i = 1; i < st.size(); i++) { const typename Storage::value_type& v = st[i]; sum += x * v.y - y * v.x; x = v.x; y = v.y; } return (sum + x * ys - y * xs) * 0.5; } //------------------------------------------------------------------------ // Tables for fast sqrt extern int16u g_sqrt_table[1024]; extern int8 g_elder_bit_table[256]; //---------------------------------------------------------------fast_sqrt //Fast integer Sqrt - really fast: no cycles, divisions or multiplications #if defined(_MSC_VER) #pragma warning(push) #pragma warning(disable : 4035) //Disable warning "no return value" #endif AGG_INLINE unsigned fast_sqrt(unsigned val) { #if defined(_M_IX86) && defined(_MSC_VER) && !defined(AGG_NO_ASM) //For Ix86 family processors this assembler code is used. //The key command here is bsr - determination the number of the most //significant bit of the value. For other processors //(and maybe compilers) the pure C "#else" section is used. __asm { mov ebx, val mov edx, 11 bsr ecx, ebx sub ecx, 9 jle less_than_9_bits shr ecx, 1 adc ecx, 0 sub edx, ecx shl ecx, 1 shr ebx, cl less_than_9_bits: xor eax, eax mov ax, g_sqrt_table[ebx*2] mov ecx, edx shr eax, cl } #else //This code is actually pure C and portable to most //arcitectures including 64bit ones. unsigned t = val; int bit=0; unsigned shift = 11; //The following piece of code is just an emulation of the //Ix86 assembler command "bsr" (see above). However on old //Intels (like Intel MMX 233MHz) this code is about twice //faster (sic!) then just one "bsr". On PIII and PIV the //bsr is optimized quite well. bit = t >> 24; if(bit) { bit = g_elder_bit_table[bit] + 24; } else { bit = (t >> 16) & 0xFF; if(bit) { bit = g_elder_bit_table[bit] + 16; } else { bit = (t >> 8) & 0xFF; if(bit) { bit = g_elder_bit_table[bit] + 8; } else { bit = g_elder_bit_table[t]; } } } //This code calculates the sqrt. bit -= 9; if(bit > 0) { bit = (bit >> 1) + (bit & 1); shift -= bit; val >>= (bit << 1); } return g_sqrt_table[val] >> shift; #endif } #if defined(_MSC_VER) #pragma warning(pop) #endif //--------------------------------------------------------------------besj // Function BESJ calculates Bessel function of first kind of order n // Arguments: // n - an integer (>=0), the order // x - value at which the Bessel function is required //-------------------- // C++ Mathematical Library // Convereted from equivalent FORTRAN library // Converetd by Gareth Walker for use by course 392 computational project // All functions tested and yield the same results as the corresponding // FORTRAN versions. // // If you have any problems using these functions please report them to // M.Muldoon@UMIST.ac.uk // // Documentation available on the web // http://www.ma.umist.ac.uk/mrm/Teaching/392/libs/392.html // Version 1.0 8/98 // 29 October, 1999 //-------------------- // Adapted for use in AGG library by Andy Wilk (castor.vulgaris@gmail.com) //------------------------------------------------------------------------ inline double besj(double x, int n) { if(n < 0) { return 0; } double d = 1E-6; double b = 0; if(fabs(x) <= d) { if(n != 0) return 0; return 1; } double b1 = 0; // b1 is the value from the previous iteration // Set up a starting order for recurrence int m1 = (int)fabs(x) + 6; if(fabs(x) > 5) { m1 = (int)(fabs(1.4 * x + 60 / x)); } int m2 = (int)(n + 2 + fabs(x) / 4); if (m1 > m2) { m2 = m1; } // Apply recurrence down from curent max order for(;;) { double c3 = 0; double c2 = 1E-30; double c4 = 0; int m8 = 1; if (m2 / 2 * 2 == m2) { m8 = -1; } int imax = m2 - 2; for (int i = 1; i <= imax; i++) { double c6 = 2 * (m2 - i) * c2 / x - c3; c3 = c2; c2 = c6; if(m2 - i - 1 == n) { b = c6; } m8 = -1 * m8; if (m8 > 0) { c4 = c4 + 2 * c6; } } double c6 = 2 * c2 / x - c3; if(n == 0) { b = c6; } c4 += c6; b /= c4; if(fabs(b - b1) < d) { return b; } b1 = b; m2 += 3; } } } #endif contextfree-3.0.5+dfsg1.orig/src-agg/include/agg_bounding_rect.h0000644000175000017500000000700212076364074023217 0ustar brambram//---------------------------------------------------------------------------- // Anti-Grain Geometry - Version 2.4 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) // // Permission to copy, use, modify, sell and distribute this software // is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // //---------------------------------------------------------------------------- // Contact: mcseem@antigrain.com // mcseemagg@yahoo.com // http://www.antigrain.com //---------------------------------------------------------------------------- // // bounding_rect function template // //---------------------------------------------------------------------------- #ifndef AGG_BOUNDING_RECT_INCLUDED #define AGG_BOUNDING_RECT_INCLUDED #include "agg_basics.h" namespace agg { //-----------------------------------------------------------bounding_rect template bool bounding_rect(VertexSource& vs, GetId& gi, unsigned start, unsigned num, CoordT* x1, CoordT* y1, CoordT* x2, CoordT* y2) { unsigned i; double x; double y; bool first = true; *x1 = CoordT(1); *y1 = CoordT(1); *x2 = CoordT(0); *y2 = CoordT(0); for(i = 0; i < num; i++) { vs.rewind(gi[start + i]); unsigned cmd; while(!is_stop(cmd = vs.vertex(&x, &y))) { if(is_vertex(cmd)) { if(first) { *x1 = CoordT(x); *y1 = CoordT(y); *x2 = CoordT(x); *y2 = CoordT(y); first = false; } else { if(CoordT(x) < *x1) *x1 = CoordT(x); if(CoordT(y) < *y1) *y1 = CoordT(y); if(CoordT(x) > *x2) *x2 = CoordT(x); if(CoordT(y) > *y2) *y2 = CoordT(y); } } } } return *x1 <= *x2 && *y1 <= *y2; } //-----------------------------------------------------bounding_rect_single template bool bounding_rect_single(VertexSource& vs, unsigned path_id, CoordT* x1, CoordT* y1, CoordT* x2, CoordT* y2) { double x; double y; bool first = true; *x1 = CoordT(1); *y1 = CoordT(1); *x2 = CoordT(0); *y2 = CoordT(0); vs.rewind(path_id); unsigned cmd; while(!is_stop(cmd = vs.vertex(&x, &y))) { if(is_vertex(cmd)) { if(first) { *x1 = CoordT(x); *y1 = CoordT(y); *x2 = CoordT(x); *y2 = CoordT(y); first = false; } else { if(CoordT(x) < *x1) *x1 = CoordT(x); if(CoordT(y) < *y1) *y1 = CoordT(y); if(CoordT(x) > *x2) *x2 = CoordT(x); if(CoordT(y) > *y2) *y2 = CoordT(y); } } } return *x1 <= *x2 && *y1 <= *y2; } } #endif contextfree-3.0.5+dfsg1.orig/src-agg/include/agg_shorten_path.h0000644000175000017500000000376012076364074023102 0ustar brambram//---------------------------------------------------------------------------- // Anti-Grain Geometry - Version 2.4 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) // // Permission to copy, use, modify, sell and distribute this software // is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // //---------------------------------------------------------------------------- // Contact: mcseem@antigrain.com // mcseemagg@yahoo.com // http://www.antigrain.com //---------------------------------------------------------------------------- #ifndef AGG_SHORTEN_PATH_INCLUDED #define AGG_SHORTEN_PATH_INCLUDED #include "agg_basics.h" #include "agg_vertex_sequence.h" namespace agg { //===========================================================shorten_path template void shorten_path(VertexSequence& vs, double s, unsigned closed = 0) { typedef typename VertexSequence::value_type vertex_type; if(s > 0.0 && vs.size() > 1) { double d; int n = int(vs.size() - 2); while(n) { d = vs[n].dist; if(d > s) break; vs.remove_last(); s -= d; --n; } if(vs.size() < 2) { vs.remove_all(); } else { n = vs.size() - 1; vertex_type& prev = vs[n-1]; vertex_type& last = vs[n]; d = (prev.dist - s) / prev.dist; double x = prev.x + (last.x - prev.x) * d; double y = prev.y + (last.y - prev.y) * d; last.x = x; last.y = y; if(!prev(last)) vs.remove_last(); vs.close(closed != 0); } } } } #endif contextfree-3.0.5+dfsg1.orig/src-agg/include/agg_scanline_p.h0000644000175000017500000002445112076364074022517 0ustar brambram//---------------------------------------------------------------------------- // Anti-Grain Geometry - Version 2.4 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) // // Permission to copy, use, modify, sell and distribute this software // is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // //---------------------------------------------------------------------------- // Contact: mcseem@antigrain.com // mcseemagg@yahoo.com // http://www.antigrain.com //---------------------------------------------------------------------------- // // Class scanline_p - a general purpose scanline container with packed spans. // //---------------------------------------------------------------------------- // // Adaptation for 32-bit screen coordinates (scanline32_p) has been sponsored by // Liberty Technology Systems, Inc., visit http://lib-sys.com // // Liberty Technology Systems, Inc. is the provider of // PostScript and PDF technology for software developers. // //---------------------------------------------------------------------------- #ifndef AGG_SCANLINE_P_INCLUDED #define AGG_SCANLINE_P_INCLUDED #include "agg_array.h" namespace agg { //=============================================================scanline_p8 // // This is a general purpose scaline container which supports the interface // used in the rasterizer::render(). See description of scanline_u8 // for details. // //------------------------------------------------------------------------ class scanline_p8 { public: typedef scanline_p8 self_type; typedef int8u cover_type; typedef int16 coord_type; //-------------------------------------------------------------------- struct span { coord_type x; coord_type len; // If negative, it's a solid span, covers is valid const cover_type* covers; }; typedef span* iterator; typedef const span* const_iterator; scanline_p8() : m_last_x(0x7FFFFFF0), m_covers(), m_cover_ptr(0), m_spans(), m_cur_span(0) { } //-------------------------------------------------------------------- void reset(int min_x, int max_x) { unsigned max_len = max_x - min_x + 3; if(max_len > m_spans.size()) { m_spans.resize(max_len); m_covers.resize(max_len); } m_last_x = 0x7FFFFFF0; m_cover_ptr = &m_covers[0]; m_cur_span = &m_spans[0]; m_cur_span->len = 0; } //-------------------------------------------------------------------- void add_cell(int x, unsigned cover) { *m_cover_ptr = (cover_type)cover; if(x == m_last_x+1 && m_cur_span->len > 0) { m_cur_span->len++; } else { m_cur_span++; m_cur_span->covers = m_cover_ptr; m_cur_span->x = (int16)x; m_cur_span->len = 1; } m_last_x = x; m_cover_ptr++; } //-------------------------------------------------------------------- void add_cells(int x, unsigned len, const cover_type* covers) { memcpy(m_cover_ptr, covers, len * sizeof(cover_type)); if(x == m_last_x+1 && m_cur_span->len > 0) { m_cur_span->len += (int16)len; } else { m_cur_span++; m_cur_span->covers = m_cover_ptr; m_cur_span->x = (int16)x; m_cur_span->len = (int16)len; } m_cover_ptr += len; m_last_x = x + len - 1; } //-------------------------------------------------------------------- void add_span(int x, unsigned len, unsigned cover) { if(x == m_last_x+1 && m_cur_span->len < 0 && cover == *m_cur_span->covers) { m_cur_span->len -= (int16)len; } else { *m_cover_ptr = (cover_type)cover; m_cur_span++; m_cur_span->covers = m_cover_ptr++; m_cur_span->x = (int16)x; m_cur_span->len = (int16)(-int(len)); } m_last_x = x + len - 1; } //-------------------------------------------------------------------- void finalize(int y) { m_y = y; } //-------------------------------------------------------------------- void reset_spans() { m_last_x = 0x7FFFFFF0; m_cover_ptr = &m_covers[0]; m_cur_span = &m_spans[0]; m_cur_span->len = 0; } //-------------------------------------------------------------------- int y() const { return m_y; } unsigned num_spans() const { return unsigned(m_cur_span - &m_spans[0]); } const_iterator begin() const { return &m_spans[1]; } private: scanline_p8(const self_type&); const self_type& operator = (const self_type&); int m_last_x; int m_y; pod_array m_covers; cover_type* m_cover_ptr; pod_array m_spans; span* m_cur_span; }; //==========================================================scanline32_p8 class scanline32_p8 { public: typedef scanline32_p8 self_type; typedef int8u cover_type; typedef int32 coord_type; struct span { span() {} span(coord_type x_, coord_type len_, const cover_type* covers_) : x(x_), len(len_), covers(covers_) {} coord_type x; coord_type len; // If negative, it's a solid span, covers is valid const cover_type* covers; }; typedef pod_bvector span_array_type; //-------------------------------------------------------------------- class const_iterator { public: const_iterator(const span_array_type& spans) : m_spans(spans), m_span_idx(0) {} const span& operator*() const { return m_spans[m_span_idx]; } const span* operator->() const { return &m_spans[m_span_idx]; } void operator ++ () { ++m_span_idx; } private: const span_array_type& m_spans; unsigned m_span_idx; const_iterator& operator=(const const_iterator&); }; //-------------------------------------------------------------------- scanline32_p8() : m_max_len(0), m_last_x(0x7FFFFFF0), m_covers(), m_cover_ptr(0) { } //-------------------------------------------------------------------- void reset(int min_x, int max_x) { unsigned max_len = max_x - min_x + 3; if(max_len > m_covers.size()) { m_covers.resize(max_len); } m_last_x = 0x7FFFFFF0; m_cover_ptr = &m_covers[0]; m_spans.remove_all(); } //-------------------------------------------------------------------- void add_cell(int x, unsigned cover) { *m_cover_ptr = cover_type(cover); if(x == m_last_x+1 && m_spans.size() && m_spans.last().len > 0) { m_spans.last().len++; } else { m_spans.add(span(coord_type(x), 1, m_cover_ptr)); } m_last_x = x; m_cover_ptr++; } //-------------------------------------------------------------------- void add_cells(int x, unsigned len, const cover_type* covers) { memcpy(m_cover_ptr, covers, len * sizeof(cover_type)); if(x == m_last_x+1 && m_spans.size() && m_spans.last().len > 0) { m_spans.last().len += coord_type(len); } else { m_spans.add(span(coord_type(x), coord_type(len), m_cover_ptr)); } m_cover_ptr += len; m_last_x = x + len - 1; } //-------------------------------------------------------------------- void add_span(int x, unsigned len, unsigned cover) { if(x == m_last_x+1 && m_spans.size() && m_spans.last().len < 0 && cover == *m_spans.last().covers) { m_spans.last().len -= coord_type(len); } else { *m_cover_ptr = cover_type(cover); m_spans.add(span(coord_type(x), -coord_type(len), m_cover_ptr++)); } m_last_x = x + len - 1; } //-------------------------------------------------------------------- void finalize(int y) { m_y = y; } //-------------------------------------------------------------------- void reset_spans() { m_last_x = 0x7FFFFFF0; m_cover_ptr = &m_covers[0]; m_spans.remove_all(); } //-------------------------------------------------------------------- int y() const { return m_y; } unsigned num_spans() const { return m_spans.size(); } const_iterator begin() const { return const_iterator(m_spans); } private: scanline32_p8(const self_type&); const self_type& operator = (const self_type&); unsigned m_max_len; int m_last_x; int m_y; pod_array m_covers; cover_type* m_cover_ptr; span_array_type m_spans; }; } #endif contextfree-3.0.5+dfsg1.orig/src-agg/include/agg_trans_affine.h0000644000175000017500000004463112076364074023045 0ustar brambram//---------------------------------------------------------------------------- // Anti-Grain Geometry - Version 2.4 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) // // Permission to copy, use, modify, sell and distribute this software // is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // //---------------------------------------------------------------------------- // Contact: mcseem@antigrain.com // mcseemagg@yahoo.com // http://www.antigrain.com //---------------------------------------------------------------------------- // // Affine transformation classes. // //---------------------------------------------------------------------------- #ifndef AGG_TRANS_AFFINE_INCLUDED #define AGG_TRANS_AFFINE_INCLUDED #include #include "agg_basics.h" namespace agg { const double affine_epsilon = 1e-14; //============================================================trans_affine // // See Implementation agg_trans_affine.cpp // // Affine transformation are linear transformations in Cartesian coordinates // (strictly speaking not only in Cartesian, but for the beginning we will // think so). They are rotation, scaling, translation and skewing. // After any affine transformation a line segment remains a line segment // and it will never become a curve. // // There will be no math about matrix calculations, since it has been // described many times. Ask yourself a very simple question: // "why do we need to understand and use some matrix stuff instead of just // rotating, scaling and so on". The answers are: // // 1. Any combination of transformations can be done by only 4 multiplications // and 4 additions in floating point. // 2. One matrix transformation is equivalent to the number of consecutive // discrete transformations, i.e. the matrix "accumulates" all transformations // in the order of their settings. Suppose we have 4 transformations: // * rotate by 30 degrees, // * scale X to 2.0, // * scale Y to 1.5, // * move to (100, 100). // The result will depend on the order of these transformations, // and the advantage of matrix is that the sequence of discret calls: // rotate(30), scaleX(2.0), scaleY(1.5), move(100,100) // will have exactly the same result as the following matrix transformations: // // affine_matrix m; // m *= rotate_matrix(30); // m *= scaleX_matrix(2.0); // m *= scaleY_matrix(1.5); // m *= move_matrix(100,100); // // m.transform_my_point_at_last(x, y); // // What is the good of it? In real life we will set-up the matrix only once // and then transform many points, let alone the convenience to set any // combination of transformations. // // So, how to use it? Very easy - literally as it's shown above. Not quite, // let us write a correct example: // // agg::trans_affine m; // m *= agg::trans_affine_rotation(30.0 * 3.1415926 / 180.0); // m *= agg::trans_affine_scaling(2.0, 1.5); // m *= agg::trans_affine_translation(100.0, 100.0); // m.transform(&x, &y); // // The affine matrix is all you need to perform any linear transformation, // but all transformations have origin point (0,0). It means that we need to // use 2 translations if we want to rotate someting around (100,100): // // m *= agg::trans_affine_translation(-100.0, -100.0); // move to (0,0) // m *= agg::trans_affine_rotation(30.0 * 3.1415926 / 180.0); // rotate // m *= agg::trans_affine_translation(100.0, 100.0); // move back to (100,100) //---------------------------------------------------------------------- struct trans_affine { double sx, shy, shx, sy, tx, ty; //------------------------------------------ Construction // Identity matrix trans_affine() : sx(1.0), shy(0.0), shx(0.0), sy(1.0), tx(0.0), ty(0.0) {} // Custom matrix. Usually used in derived classes trans_affine(double v0, double v1, double v2, double v3, double v4, double v5) : sx(v0), shy(v1), shx(v2), sy(v3), tx(v4), ty(v5) {} // Custom matrix from m[6] explicit trans_affine(const double* m) : sx(m[0]), shy(m[1]), shx(m[2]), sy(m[3]), tx(m[4]), ty(m[5]) {} // Rectangle to a parallelogram. trans_affine(double x1, double y1, double x2, double y2, const double* parl) { rect_to_parl(x1, y1, x2, y2, parl); } // Parallelogram to a rectangle. trans_affine(const double* parl, double x1, double y1, double x2, double y2) { parl_to_rect(parl, x1, y1, x2, y2); } // Arbitrary parallelogram transformation. trans_affine(const double* src, const double* dst) { parl_to_parl(src, dst); } //---------------------------------- Parellelogram transformations // transform a parallelogram to another one. Src and dst are // pointers to arrays of three points (double[6], x1,y1,...) that // identify three corners of the parallelograms assuming implicit // fourth point. The arguments are arrays of double[6] mapped // to x1,y1, x2,y2, x3,y3 where the coordinates are: // *-----------------* // / (x3,y3)/ // / / // /(x1,y1) (x2,y2)/ // *-----------------* const trans_affine& parl_to_parl(const double* src, const double* dst); const trans_affine& rect_to_parl(double x1, double y1, double x2, double y2, const double* parl); const trans_affine& parl_to_rect(const double* parl, double x1, double y1, double x2, double y2); //------------------------------------------ Operations // Reset - load an identity matrix const trans_affine& reset(); // Direct transformations operations const trans_affine& translate(double x, double y); const trans_affine& rotate(double a); const trans_affine& scale(double s); const trans_affine& scale(double x, double y); // Multiply matrix to another one const trans_affine& multiply(const trans_affine& m); // Multiply "m" to "this" and assign the result to "this" const trans_affine& premultiply(const trans_affine& m); // Multiply matrix to inverse of another one const trans_affine& multiply_inv(const trans_affine& m); // Multiply inverse of "m" to "this" and assign the result to "this" const trans_affine& premultiply_inv(const trans_affine& m); // Invert matrix. Do not try to invert degenerate matrices, // there's no check for validity. If you set scale to 0 and // then try to invert matrix, expect unpredictable result. const trans_affine& invert(); // Mirroring around X const trans_affine& flip_x(); // Mirroring around Y const trans_affine& flip_y(); //------------------------------------------- Load/Store // Store matrix to an array [6] of double void store_to(double* m) const { *m++ = sx; *m++ = shy; *m++ = shx; *m++ = sy; *m++ = tx; *m++ = ty; } // Load matrix from an array [6] of double const trans_affine& load_from(const double* m) { sx = *m++; shy = *m++; shx = *m++; sy = *m++; tx = *m++; ty = *m++; return *this; } //------------------------------------------- Operators // Multiply the matrix by another one const trans_affine& operator *= (const trans_affine& m) { return multiply(m); } // Multiply the matrix by inverse of another one const trans_affine& operator /= (const trans_affine& m) { return multiply_inv(m); } // Multiply the matrix by another one and return // the result in a separete matrix. trans_affine operator * (const trans_affine& m) const { return trans_affine(*this).multiply(m); } // Multiply the matrix by inverse of another one // and return the result in a separete matrix. trans_affine operator / (const trans_affine& m) const { return trans_affine(*this).multiply_inv(m); } // Calculate and return the inverse matrix trans_affine operator ~ () const { trans_affine ret = *this; return ret.invert(); } // Equal operator with default epsilon bool operator == (const trans_affine& m) const { return is_equal(m, affine_epsilon); } // Not Equal operator with default epsilon bool operator != (const trans_affine& m) const { return !is_equal(m, affine_epsilon); } //-------------------------------------------- Transformations // Direct transformation of x and y void transform(double* x, double* y) const; // Direct transformation of x and y, 2x2 matrix only, no translation void transform_2x2(double* x, double* y) const; // Inverse transformation of x and y. It works slower than the // direct transformation. For massive operations it's better to // invert() the matrix and then use direct transformations. void inverse_transform(double* x, double* y) const; //-------------------------------------------- Auxiliary // Calculate the determinant of matrix double determinant() const { return sx * sy - shy * shx; } // Calculate the reciprocal of the determinant double determinant_reciprocal() const { return 1.0 / (sx * sy - shy * shx); } // Get the average scale (by X and Y). // Basically used to calculate the approximation_scale when // decomposinting curves into line segments. double scale() const; // Check to see if the matrix is not degenerate bool is_valid(double epsilon = affine_epsilon) const; // Check to see if it's an identity matrix bool is_identity(double epsilon = affine_epsilon) const; // Check to see if two matrices are equal bool is_equal(const trans_affine& m, double epsilon = affine_epsilon) const; // Determine the major parameters. Use with caution considering // possible degenerate cases. double rotation() const; void translation(double* dx, double* dy) const; void scaling(double* x, double* y) const; void scaling_abs(double* x, double* y) const; }; //------------------------------------------------------------------------ inline void trans_affine::transform(double* x, double* y) const { register double tmp = *x; *x = tmp * sx + *y * shx + tx; *y = tmp * shy + *y * sy + ty; } //------------------------------------------------------------------------ inline void trans_affine::transform_2x2(double* x, double* y) const { register double tmp = *x; *x = tmp * sx + *y * shx; *y = tmp * shy + *y * sy; } //------------------------------------------------------------------------ inline void trans_affine::inverse_transform(double* x, double* y) const { register double d = determinant_reciprocal(); register double a = (*x - tx) * d; register double b = (*y - ty) * d; *x = a * sy - b * shx; *y = b * sx - a * shy; } //------------------------------------------------------------------------ inline double trans_affine::scale() const { double x = 0.707106781 * sx + 0.707106781 * shx; double y = 0.707106781 * shy + 0.707106781 * sy; return sqrt(x*x + y*y); } //------------------------------------------------------------------------ inline const trans_affine& trans_affine::translate(double x, double y) { tx += x; ty += y; return *this; } //------------------------------------------------------------------------ inline const trans_affine& trans_affine::rotate(double a) { double ca = cos(a); double sa = sin(a); double t0 = sx * ca - shy * sa; double t2 = shx * ca - sy * sa; double t4 = tx * ca - ty * sa; shy = sx * sa + shy * ca; sy = shx * sa + sy * ca; ty = tx * sa + ty * ca; sx = t0; shx = t2; tx = t4; return *this; } //------------------------------------------------------------------------ inline const trans_affine& trans_affine::scale(double x, double y) { double mm0 = x; // Possible hint for the optimizer double mm3 = y; sx *= mm0; shx *= mm0; tx *= mm0; shy *= mm3; sy *= mm3; ty *= mm3; return *this; } //------------------------------------------------------------------------ inline const trans_affine& trans_affine::scale(double s) { double m = s; // Possible hint for the optimizer sx *= m; shx *= m; tx *= m; shy *= m; sy *= m; ty *= m; return *this; } //------------------------------------------------------------------------ inline const trans_affine& trans_affine::premultiply(const trans_affine& m) { trans_affine t = m; return *this = t.multiply(*this); } //------------------------------------------------------------------------ inline const trans_affine& trans_affine::multiply_inv(const trans_affine& m) { trans_affine t = m; t.invert(); return multiply(t); } //------------------------------------------------------------------------ inline const trans_affine& trans_affine::premultiply_inv(const trans_affine& m) { trans_affine t = m; t.invert(); return *this = t.multiply(*this); } //------------------------------------------------------------------------ inline void trans_affine::scaling_abs(double* x, double* y) const { // Used to calculate scaling coefficients in image resampling. // When there is considerable shear this method gives us much // better estimation than just sx, sy. *x = sqrt(sx * sx + shx * shx); *y = sqrt(shy * shy + sy * sy); } //====================================================trans_affine_rotation // Rotation matrix. sin() and cos() are calculated twice for the same angle. // There's no harm because the performance of sin()/cos() is very good on all // modern processors. Besides, this operation is not going to be invoked too // often. class trans_affine_rotation : public trans_affine { public: trans_affine_rotation(double a) : trans_affine(cos(a), sin(a), -sin(a), cos(a), 0.0, 0.0) {} }; //====================================================trans_affine_scaling // Scaling matrix. x, y - scale coefficients by X and Y respectively class trans_affine_scaling : public trans_affine { public: trans_affine_scaling(double x, double y) : trans_affine(x, 0.0, 0.0, y, 0.0, 0.0) {} trans_affine_scaling(double s) : trans_affine(s, 0.0, 0.0, s, 0.0, 0.0) {} }; //================================================trans_affine_translation // Translation matrix class trans_affine_translation : public trans_affine { public: trans_affine_translation(double x, double y) : trans_affine(1.0, 0.0, 0.0, 1.0, x, y) {} }; //====================================================trans_affine_skewing // Sckewing (shear) matrix class trans_affine_skewing : public trans_affine { public: trans_affine_skewing(double x, double y) : trans_affine(1.0, tan(y), tan(x), 1.0, 0.0, 0.0) {} }; //===============================================trans_affine_line_segment // Rotate, Scale and Translate, associating 0...dist with line segment // x1,y1,x2,y2 class trans_affine_line_segment : public trans_affine { public: trans_affine_line_segment(double x1, double y1, double x2, double y2, double dist) { double dx = x2 - x1; double dy = y2 - y1; if(dist > 0.0) { multiply(trans_affine_scaling(sqrt(dx * dx + dy * dy) / dist)); } multiply(trans_affine_rotation(atan2(dy, dx))); multiply(trans_affine_translation(x1, y1)); } }; //============================================trans_affine_reflection_unit // Reflection matrix. Reflect coordinates across the line through // the origin containing the unit vector (ux, uy). // Contributed by John Horigan class trans_affine_reflection_unit : public trans_affine { public: trans_affine_reflection_unit(double ux, double uy) : trans_affine(2.0 * ux * ux - 1.0, 2.0 * ux * uy, 2.0 * ux * uy, 2.0 * uy * uy - 1.0, 0.0, 0.0) {} }; //=================================================trans_affine_reflection // Reflection matrix. Reflect coordinates across the line through // the origin at the angle a or containing the non-unit vector (x, y). // Contributed by John Horigan class trans_affine_reflection : public trans_affine_reflection_unit { public: trans_affine_reflection(double a) : trans_affine_reflection_unit(cos(a), sin(a)) {} trans_affine_reflection(double x, double y) : trans_affine_reflection_unit(x / sqrt(x * x + y * y), y / sqrt(x * x + y * y)) {} }; } #endif contextfree-3.0.5+dfsg1.orig/src-agg/include/agg_renderer_scanline.h0000644000175000017500000010256612076364074024072 0ustar brambram//---------------------------------------------------------------------------- // Anti-Grain Geometry - Version 2.4 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) // // Permission to copy, use, modify, sell and distribute this software // is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // //---------------------------------------------------------------------------- // Contact: mcseem@antigrain.com // mcseemagg@yahoo.com // http://www.antigrain.com //---------------------------------------------------------------------------- #ifndef AGG_RENDERER_SCANLINE_INCLUDED #define AGG_RENDERER_SCANLINE_INCLUDED #include "agg_basics.h" #include "agg_renderer_base.h" namespace agg { //================================================render_scanline_aa_solid template void render_scanline_aa_solid(const Scanline& sl, BaseRenderer& ren, const ColorT& color) { int y = sl.y(); unsigned num_spans = sl.num_spans(); typename Scanline::const_iterator span = sl.begin(); for(;;) { int x = span->x; if(span->len > 0) { ren.blend_solid_hspan(x, y, (unsigned)span->len, color, span->covers); } else { ren.blend_hline(x, y, (unsigned)(x - span->len - 1), color, *(span->covers)); } if(--num_spans == 0) break; ++span; } } //===============================================render_scanlines_aa_solid template void render_scanlines_aa_solid(Rasterizer& ras, Scanline& sl, BaseRenderer& ren, const ColorT& color) { if(ras.rewind_scanlines()) { // Explicitly convert "color" to the BaseRenderer color type. // For example, it can be called with color type "rgba", while // "rgba8" is needed. Otherwise it will be implicitly // converted in the loop many times. //---------------------- typename BaseRenderer::color_type ren_color(color); sl.reset(ras.min_x(), ras.max_x()); while(ras.sweep_scanline(sl)) { //render_scanline_aa_solid(sl, ren, ren_color); // This code is equivalent to the above call (copy/paste). // It's just a "manual" optimization for old compilers, // like Microsoft Visual C++ v6.0 //------------------------------- int y = sl.y(); unsigned num_spans = sl.num_spans(); typename Scanline::const_iterator span = sl.begin(); for(;;) { int x = span->x; if(span->len > 0) { ren.blend_solid_hspan(x, y, (unsigned)span->len, ren_color, span->covers); } else { ren.blend_hline(x, y, (unsigned)(x - span->len - 1), ren_color, *(span->covers)); } if(--num_spans == 0) break; ++span; } } } } //==============================================renderer_scanline_aa_solid template class renderer_scanline_aa_solid { public: typedef BaseRenderer base_ren_type; typedef typename base_ren_type::color_type color_type; //-------------------------------------------------------------------- renderer_scanline_aa_solid() : m_ren(0) {} explicit renderer_scanline_aa_solid(base_ren_type& ren) : m_ren(&ren) {} void attach(base_ren_type& ren) { m_ren = &ren; } //-------------------------------------------------------------------- void color(const color_type& c) { m_color = c; } const color_type& color() const { return m_color; } //-------------------------------------------------------------------- void prepare() {} //-------------------------------------------------------------------- template void render(const Scanline& sl) { render_scanline_aa_solid(sl, *m_ren, m_color); } private: base_ren_type* m_ren; color_type m_color; }; //======================================================render_scanline_aa template void render_scanline_aa(const Scanline& sl, BaseRenderer& ren, SpanAllocator& alloc, SpanGenerator& span_gen) { int y = sl.y(); unsigned num_spans = sl.num_spans(); typename Scanline::const_iterator span = sl.begin(); for(;;) { int x = span->x; int len = span->len; const typename Scanline::cover_type* covers = span->covers; if(len < 0) len = -len; typename BaseRenderer::color_type* colors = alloc.allocate(len); span_gen.generate(colors, x, y, len); ren.blend_color_hspan(x, y, len, colors, (span->len < 0) ? 0 : covers, *covers); if(--num_spans == 0) break; ++span; } } //=====================================================render_scanlines_aa template void render_scanlines_aa(Rasterizer& ras, Scanline& sl, BaseRenderer& ren, SpanAllocator& alloc, SpanGenerator& span_gen) { if(ras.rewind_scanlines()) { sl.reset(ras.min_x(), ras.max_x()); span_gen.prepare(); while(ras.sweep_scanline(sl)) { render_scanline_aa(sl, ren, alloc, span_gen); } } } //====================================================renderer_scanline_aa template class renderer_scanline_aa { public: typedef BaseRenderer base_ren_type; typedef SpanAllocator alloc_type; typedef SpanGenerator span_gen_type; //-------------------------------------------------------------------- renderer_scanline_aa() : m_ren(0), m_alloc(0), m_span_gen(0) {} renderer_scanline_aa(base_ren_type& ren, alloc_type& alloc, span_gen_type& span_gen) : m_ren(&ren), m_alloc(&alloc), m_span_gen(&span_gen) {} void attach(base_ren_type& ren, alloc_type& alloc, span_gen_type& span_gen) { m_ren = &ren; m_alloc = &alloc; m_span_gen = &span_gen; } //-------------------------------------------------------------------- void prepare() { m_span_gen->prepare(); } //-------------------------------------------------------------------- template void render(const Scanline& sl) { render_scanline_aa(sl, *m_ren, *m_alloc, *m_span_gen); } private: base_ren_type* m_ren; alloc_type* m_alloc; span_gen_type* m_span_gen; }; //===============================================render_scanline_bin_solid template void render_scanline_bin_solid(const Scanline& sl, BaseRenderer& ren, const ColorT& color) { unsigned num_spans = sl.num_spans(); typename Scanline::const_iterator span = sl.begin(); for(;;) { ren.blend_hline(span->x, sl.y(), span->x - 1 + ((span->len < 0) ? -span->len : span->len), color, cover_full); if(--num_spans == 0) break; ++span; } } //==============================================render_scanlines_bin_solid template void render_scanlines_bin_solid(Rasterizer& ras, Scanline& sl, BaseRenderer& ren, const ColorT& color) { if(ras.rewind_scanlines()) { // Explicitly convert "color" to the BaseRenderer color type. // For example, it can be called with color type "rgba", while // "rgba8" is needed. Otherwise it will be implicitly // converted in the loop many times. //---------------------- typename BaseRenderer::color_type ren_color(color); sl.reset(ras.min_x(), ras.max_x()); while(ras.sweep_scanline(sl)) { //render_scanline_bin_solid(sl, ren, ren_color); // This code is equivalent to the above call (copy/paste). // It's just a "manual" optimization for old compilers, // like Microsoft Visual C++ v6.0 //------------------------------- unsigned num_spans = sl.num_spans(); typename Scanline::const_iterator span = sl.begin(); for(;;) { ren.blend_hline(span->x, sl.y(), span->x - 1 + ((span->len < 0) ? -span->len : span->len), ren_color, cover_full); if(--num_spans == 0) break; ++span; } } } } //=============================================renderer_scanline_bin_solid template class renderer_scanline_bin_solid { public: typedef BaseRenderer base_ren_type; typedef typename base_ren_type::color_type color_type; //-------------------------------------------------------------------- renderer_scanline_bin_solid() : m_ren(0) {} explicit renderer_scanline_bin_solid(base_ren_type& ren) : m_ren(&ren) {} void attach(base_ren_type& ren) { m_ren = &ren; } //-------------------------------------------------------------------- void color(const color_type& c) { m_color = c; } const color_type& color() const { return m_color; } //-------------------------------------------------------------------- void prepare() {} //-------------------------------------------------------------------- template void render(const Scanline& sl) { render_scanline_bin_solid(sl, *m_ren, m_color); } private: base_ren_type* m_ren; color_type m_color; }; //======================================================render_scanline_bin template void render_scanline_bin(const Scanline& sl, BaseRenderer& ren, SpanAllocator& alloc, SpanGenerator& span_gen) { int y = sl.y(); unsigned num_spans = sl.num_spans(); typename Scanline::const_iterator span = sl.begin(); for(;;) { int x = span->x; int len = span->len; if(len < 0) len = -len; typename BaseRenderer::color_type* colors = alloc.allocate(len); span_gen.generate(colors, x, y, len); ren.blend_color_hspan(x, y, len, colors, 0, cover_full); if(--num_spans == 0) break; ++span; } } //=====================================================render_scanlines_bin template void render_scanlines_bin(Rasterizer& ras, Scanline& sl, BaseRenderer& ren, SpanAllocator& alloc, SpanGenerator& span_gen) { if(ras.rewind_scanlines()) { sl.reset(ras.min_x(), ras.max_x()); span_gen.prepare(); while(ras.sweep_scanline(sl)) { render_scanline_bin(sl, ren, alloc, span_gen); } } } //====================================================renderer_scanline_bin template class renderer_scanline_bin { public: typedef BaseRenderer base_ren_type; typedef SpanAllocator alloc_type; typedef SpanGenerator span_gen_type; //-------------------------------------------------------------------- renderer_scanline_bin() : m_ren(0), m_alloc(0), m_span_gen(0) {} renderer_scanline_bin(base_ren_type& ren, alloc_type& alloc, span_gen_type& span_gen) : m_ren(&ren), m_alloc(&alloc), m_span_gen(&span_gen) {} void attach(base_ren_type& ren, alloc_type& alloc, span_gen_type& span_gen) { m_ren = &ren; m_alloc = &alloc; m_span_gen = &span_gen; } //-------------------------------------------------------------------- void prepare() { m_span_gen->prepare(); } //-------------------------------------------------------------------- template void render(const Scanline& sl) { render_scanline_bin(sl, *m_ren, *m_alloc, *m_span_gen); } private: base_ren_type* m_ren; alloc_type* m_alloc; span_gen_type* m_span_gen; }; //========================================================render_scanlines template void render_scanlines(Rasterizer& ras, Scanline& sl, Renderer& ren) { if(ras.rewind_scanlines()) { sl.reset(ras.min_x(), ras.max_x()); ren.prepare(); while(ras.sweep_scanline(sl)) { ren.render(sl); } } } //========================================================render_all_paths template void render_all_paths(Rasterizer& ras, Scanline& sl, Renderer& r, VertexSource& vs, const ColorStorage& as, const PathId& path_id, unsigned num_paths) { for(unsigned i = 0; i < num_paths; i++) { ras.reset(); ras.add_path(vs, path_id[i]); r.color(as[i]); render_scanlines(ras, sl, r); } } //=============================================render_scanlines_compound template void render_scanlines_compound(Rasterizer& ras, ScanlineAA& sl_aa, ScanlineBin& sl_bin, BaseRenderer& ren, SpanAllocator& alloc, StyleHandler& sh) { if(ras.rewind_scanlines()) { int min_x = ras.min_x(); int len = ras.max_x() - min_x + 2; sl_aa.reset(min_x, ras.max_x()); sl_bin.reset(min_x, ras.max_x()); typedef typename BaseRenderer::color_type color_type; color_type* color_span = alloc.allocate(len * 2); color_type* mix_buffer = color_span + len; unsigned num_spans; unsigned num_styles; unsigned style; bool solid; while((num_styles = ras.sweep_styles()) > 0) { typename ScanlineAA::const_iterator span_aa; if(num_styles == 1) { // Optimization for a single style. Happens often //------------------------- if(ras.sweep_scanline(sl_aa, 0)) { style = ras.style(0); if(sh.is_solid(style)) { // Just solid fill //----------------------- render_scanline_aa_solid(sl_aa, ren, sh.color(style)); } else { // Arbitrary span generator //----------------------- span_aa = sl_aa.begin(); num_spans = sl_aa.num_spans(); for(;;) { len = span_aa->len; sh.generate_span(color_span, span_aa->x, sl_aa.y(), len, style); ren.blend_color_hspan(span_aa->x, sl_aa.y(), span_aa->len, color_span, span_aa->covers); if(--num_spans == 0) break; ++span_aa; } } } } else { if(ras.sweep_scanline(sl_bin, -1)) { // Clear the spans of the mix_buffer //-------------------- typename ScanlineBin::const_iterator span_bin = sl_bin.begin(); num_spans = sl_bin.num_spans(); for(;;) { memset(mix_buffer + span_bin->x - min_x, 0, span_bin->len * sizeof(color_type)); if(--num_spans == 0) break; ++span_bin; } unsigned i; for(i = 0; i < num_styles; i++) { style = ras.style(i); solid = sh.is_solid(style); if(ras.sweep_scanline(sl_aa, i)) { color_type* colors; color_type* cspan; typename ScanlineAA::cover_type* covers; span_aa = sl_aa.begin(); num_spans = sl_aa.num_spans(); if(solid) { // Just solid fill //----------------------- for(;;) { color_type c = sh.color(style); len = span_aa->len; colors = mix_buffer + span_aa->x - min_x; covers = span_aa->covers; do { if(*covers == cover_full) { *colors = c; } else { colors->add(c, *covers); } ++colors; ++covers; } while(--len); if(--num_spans == 0) break; ++span_aa; } } else { // Arbitrary span generator //----------------------- for(;;) { len = span_aa->len; colors = mix_buffer + span_aa->x - min_x; cspan = color_span; sh.generate_span(cspan, span_aa->x, sl_aa.y(), len, style); covers = span_aa->covers; do { if(*covers == cover_full) { *colors = *cspan; } else { colors->add(*cspan, *covers); } ++cspan; ++colors; ++covers; } while(--len); if(--num_spans == 0) break; ++span_aa; } } } } // Emit the blended result as a color hspan //------------------------- span_bin = sl_bin.begin(); num_spans = sl_bin.num_spans(); for(;;) { ren.blend_color_hspan(span_bin->x, sl_bin.y(), span_bin->len, mix_buffer + span_bin->x - min_x, 0, cover_full); if(--num_spans == 0) break; ++span_bin; } } // if(ras.sweep_scanline(sl_bin, -1)) } // if(num_styles == 1) ... else } // while((num_styles = ras.sweep_styles()) > 0) } // if(ras.rewind_scanlines()) } //=======================================render_scanlines_compound_layered template void render_scanlines_compound_layered(Rasterizer& ras, ScanlineAA& sl_aa, BaseRenderer& ren, SpanAllocator& alloc, StyleHandler& sh) { if(ras.rewind_scanlines()) { int min_x = ras.min_x(); int len = ras.max_x() - min_x + 2; sl_aa.reset(min_x, ras.max_x()); typedef typename BaseRenderer::color_type color_type; color_type* color_span = alloc.allocate(len * 2); color_type* mix_buffer = color_span + len; cover_type* cover_buffer = ras.allocate_cover_buffer(len); unsigned num_spans; unsigned num_styles; unsigned style; bool solid; while((num_styles = ras.sweep_styles()) > 0) { typename ScanlineAA::const_iterator span_aa; if(num_styles == 1) { // Optimization for a single style. Happens often //------------------------- if(ras.sweep_scanline(sl_aa, 0)) { style = ras.style(0); if(sh.is_solid(style)) { // Just solid fill //----------------------- render_scanline_aa_solid(sl_aa, ren, sh.color(style)); } else { // Arbitrary span generator //----------------------- span_aa = sl_aa.begin(); num_spans = sl_aa.num_spans(); for(;;) { len = span_aa->len; sh.generate_span(color_span, span_aa->x, sl_aa.y(), len, style); ren.blend_color_hspan(span_aa->x, sl_aa.y(), span_aa->len, color_span, span_aa->covers); if(--num_spans == 0) break; ++span_aa; } } } } else { int sl_start = ras.scanline_start(); unsigned sl_len = ras.scanline_length(); if(sl_len) { memset(mix_buffer + sl_start - min_x, 0, sl_len * sizeof(color_type)); memset(cover_buffer + sl_start - min_x, 0, sl_len * sizeof(cover_type)); int sl_y = 0x7FFFFFFF; unsigned i; for(i = 0; i < num_styles; i++) { style = ras.style(i); solid = sh.is_solid(style); if(ras.sweep_scanline(sl_aa, i)) { unsigned cover; color_type* colors; color_type* cspan; cover_type* src_covers; cover_type* dst_covers; span_aa = sl_aa.begin(); num_spans = sl_aa.num_spans(); sl_y = sl_aa.y(); if(solid) { // Just solid fill //----------------------- for(;;) { color_type c = sh.color(style); len = span_aa->len; colors = mix_buffer + span_aa->x - min_x; src_covers = span_aa->covers; dst_covers = cover_buffer + span_aa->x - min_x; do { cover = *src_covers; if(*dst_covers + cover > cover_full) { cover = cover_full - *dst_covers; } if(cover) { colors->add(c, cover); *dst_covers += cover; } ++colors; ++src_covers; ++dst_covers; } while(--len); if(--num_spans == 0) break; ++span_aa; } } else { // Arbitrary span generator //----------------------- for(;;) { len = span_aa->len; colors = mix_buffer + span_aa->x - min_x; cspan = color_span; sh.generate_span(cspan, span_aa->x, sl_aa.y(), len, style); src_covers = span_aa->covers; dst_covers = cover_buffer + span_aa->x - min_x; do { cover = *src_covers; if(*dst_covers + cover > cover_full) { cover = cover_full - *dst_covers; } if(cover) { colors->add(*cspan, cover); *dst_covers += cover; } ++cspan; ++colors; ++src_covers; ++dst_covers; } while(--len); if(--num_spans == 0) break; ++span_aa; } } } } ren.blend_color_hspan(sl_start, sl_y, sl_len, mix_buffer + sl_start - min_x, 0, cover_full); } //if(sl_len) } //if(num_styles == 1) ... else } //while((num_styles = ras.sweep_styles()) > 0) } //if(ras.rewind_scanlines()) } } #endif contextfree-3.0.5+dfsg1.orig/src-agg/include/agg_ellipse.h0000644000175000017500000000710012076364074022031 0ustar brambram//---------------------------------------------------------------------------- // Anti-Grain Geometry - Version 2.4 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) // // Permission to copy, use, modify, sell and distribute this software // is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // //---------------------------------------------------------------------------- // Contact: mcseem@antigrain.com // mcseemagg@yahoo.com // http://www.antigrain.com //---------------------------------------------------------------------------- // // class ellipse // //---------------------------------------------------------------------------- #ifndef AGG_ELLIPSE_INCLUDED #define AGG_ELLIPSE_INCLUDED #include "agg_basics.h" #include namespace agg { //----------------------------------------------------------------ellipse class ellipse { public: ellipse() : m_x(0.0), m_y(0.0), m_rx(1.0), m_ry(1.0), m_scale(1.0), m_num(4), m_step(0), m_cw(false) {} ellipse(double x, double y, double rx, double ry, unsigned num_steps=0, bool cw=false) : m_x(x), m_y(y), m_rx(rx), m_ry(ry), m_scale(1.0), m_num(num_steps), m_step(0), m_cw(cw) { if(m_num == 0) calc_num_steps(); } void init(double x, double y, double rx, double ry, unsigned num_steps=0, bool cw=false); void approximation_scale(double scale); void rewind(unsigned path_id); unsigned vertex(double* x, double* y); private: void calc_num_steps(); double m_x; double m_y; double m_rx; double m_ry; double m_scale; unsigned m_num; unsigned m_step; bool m_cw; }; //------------------------------------------------------------------------ inline void ellipse::init(double x, double y, double rx, double ry, unsigned num_steps, bool cw) { m_x = x; m_y = y; m_rx = rx; m_ry = ry; m_num = num_steps; m_step = 0; m_cw = cw; if(m_num == 0) calc_num_steps(); } //------------------------------------------------------------------------ inline void ellipse::approximation_scale(double scale) { m_scale = scale; calc_num_steps(); } //------------------------------------------------------------------------ inline void ellipse::calc_num_steps() { double ra = (fabs(m_rx) + fabs(m_ry)) / 2; double da = acos(ra / (ra + 0.125 / m_scale)) * 2; m_num = uround(2*pi / da); } //------------------------------------------------------------------------ inline void ellipse::rewind(unsigned) { m_step = 0; } //------------------------------------------------------------------------ inline unsigned ellipse::vertex(double* x, double* y) { if(m_step == m_num) { ++m_step; return path_cmd_end_poly | path_flags_close | path_flags_ccw; } if(m_step > m_num) return path_cmd_stop; double angle = double(m_step) / double(m_num) * 2.0 * pi; if(m_cw) angle = 2.0 * pi - angle; *x = m_x + cos(angle) * m_rx; *y = m_y + sin(angle) * m_ry; m_step++; return ((m_step == 1) ? path_cmd_move_to : path_cmd_line_to); } } #endif contextfree-3.0.5+dfsg1.orig/src-agg/include/agg_basics.h0000644000175000017500000004111212076364074021641 0ustar brambram//---------------------------------------------------------------------------- // Anti-Grain Geometry - Version 2.4 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) // // Permission to copy, use, modify, sell and distribute this software // is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // //---------------------------------------------------------------------------- // Contact: mcseem@antigrain.com // mcseemagg@yahoo.com // http://www.antigrain.com //---------------------------------------------------------------------------- #ifndef AGG_BASICS_INCLUDED #define AGG_BASICS_INCLUDED #include #include "agg_config.h" //---------------------------------------------------------AGG_CUSTOM_ALLOCATOR #ifdef AGG_CUSTOM_ALLOCATOR #include "agg_allocator.h" #else namespace agg { // The policy of all AGG containers and memory allocation strategy // in general is that no allocated data requires explicit construction. // It means that the allocator can be really simple; you can even // replace new/delete to malloc/free. The constructors and destructors // won't be called in this case, however everything will remain working. // The second argument of deallocate() is the size of the allocated // block. You can use this information if you wish. //------------------------------------------------------------pod_allocator template struct pod_allocator { static T* allocate(unsigned num) { return new T [num]; } static void deallocate(T* ptr, unsigned) { delete [] ptr; } }; // Single object allocator. It's also can be replaced with your custom // allocator. The difference is that it can only allocate a single // object and the constructor and destructor must be called. // In AGG there is no need to allocate an array of objects with // calling their constructors (only single ones). So that, if you // replace these new/delete to malloc/free make sure that the in-place // new is called and take care of calling the destructor too. //------------------------------------------------------------obj_allocator template struct obj_allocator { static T* allocate() { return new T; } static void deallocate(T* ptr) { delete ptr; } }; } #endif //-------------------------------------------------------- Default basic types // // If the compiler has different capacity of the basic types you can redefine // them via the compiler command line or by generating agg_config.h that is // empty by default. // #ifndef AGG_INT8 #define AGG_INT8 signed char #endif #ifndef AGG_INT8U #define AGG_INT8U unsigned char #endif #ifndef AGG_INT16 #define AGG_INT16 short #endif #ifndef AGG_INT16U #define AGG_INT16U unsigned short #endif #ifndef AGG_INT32 #define AGG_INT32 int #endif #ifndef AGG_INT32U #define AGG_INT32U unsigned #endif #ifndef AGG_INT64 #if defined(_MSC_VER) || defined(__BORLANDC__) #define AGG_INT64 signed __int64 #else #define AGG_INT64 signed long long #endif #endif #ifndef AGG_INT64U #if defined(_MSC_VER) || defined(__BORLANDC__) #define AGG_INT64U unsigned __int64 #else #define AGG_INT64U unsigned long long #endif #endif //------------------------------------------------ Some fixes for MS Visual C++ #if defined(_MSC_VER) #pragma warning(disable:4786) // Identifier was truncated... #endif #if defined(_MSC_VER) #define AGG_INLINE __forceinline #else #define AGG_INLINE inline #endif namespace agg { //------------------------------------------------------------------------- typedef AGG_INT8 int8; //----int8 typedef AGG_INT8U int8u; //----int8u typedef AGG_INT16 int16; //----int16 typedef AGG_INT16U int16u; //----int16u typedef AGG_INT32 int32; //----int32 typedef AGG_INT32U int32u; //----int32u typedef AGG_INT64 int64; //----int64 typedef AGG_INT64U int64u; //----int64u #if defined(AGG_FISTP) #pragma warning(push) #pragma warning(disable : 4035) //Disable warning "no return value" AGG_INLINE int iround(double v) //-------iround { int t; __asm fld qword ptr [v] __asm fistp dword ptr [t] __asm mov eax, dword ptr [t] } AGG_INLINE unsigned uround(double v) //-------uround { unsigned t; __asm fld qword ptr [v] __asm fistp dword ptr [t] __asm mov eax, dword ptr [t] } #pragma warning(pop) AGG_INLINE unsigned ufloor(double v) //-------ufloor { return unsigned(floor(v)); } AGG_INLINE unsigned uceil(double v) //--------uceil { return unsigned(ceil(v)); } #elif defined(AGG_QIFIST) AGG_INLINE int iround(double v) { return int(v); } AGG_INLINE int uround(double v) { return unsigned(v); } AGG_INLINE unsigned ufloor(double v) { return unsigned(floor(v)); } AGG_INLINE unsigned uceil(double v) { return unsigned(ceil(v)); } #else AGG_INLINE int iround(double v) { return int((v < 0.0) ? v - 0.5 : v + 0.5); } AGG_INLINE int uround(double v) { return unsigned(v + 0.5); } AGG_INLINE unsigned ufloor(double v) { return unsigned(v); } AGG_INLINE unsigned uceil(double v) { return unsigned(ceil(v)); } #endif //---------------------------------------------------------------saturation template struct saturation { AGG_INLINE static int iround(double v) { if(v < double(-Limit)) return -Limit; if(v > double( Limit)) return Limit; return agg::iround(v); } }; //------------------------------------------------------------------mul_one template struct mul_one { AGG_INLINE static unsigned mul(unsigned a, unsigned b) { register unsigned q = a * b + (1 << (Shift-1)); return (q + (q >> Shift)) >> Shift; } }; //------------------------------------------------------------------------- typedef unsigned char cover_type; //----cover_type enum cover_scale_e { cover_shift = 8, //----cover_shift cover_size = 1 << cover_shift, //----cover_size cover_mask = cover_size - 1, //----cover_mask cover_none = 0, //----cover_none cover_full = cover_mask //----cover_full }; //----------------------------------------------------poly_subpixel_scale_e // These constants determine the subpixel accuracy, to be more precise, // the number of bits of the fractional part of the coordinates. // The possible coordinate capacity in bits can be calculated by formula: // sizeof(int) * 8 - poly_subpixel_shift, i.e, for 32-bit integers and // 8-bits fractional part the capacity is 24 bits. enum poly_subpixel_scale_e { poly_subpixel_shift = 8, //----poly_subpixel_shift poly_subpixel_scale = 1< struct rect_base { typedef T value_type; typedef rect_base self_type; T x1, y1, x2, y2; rect_base() {} rect_base(T x1_, T y1_, T x2_, T y2_) : x1(x1_), y1(y1_), x2(x2_), y2(y2_) {} void init(T x1_, T y1_, T x2_, T y2_) { x1 = x1_; y1 = y1_; x2 = x2_; y2 = y2_; } const self_type& normalize() { T t; if(x1 > x2) { t = x1; x1 = x2; x2 = t; } if(y1 > y2) { t = y1; y1 = y2; y2 = t; } return *this; } bool clip(const self_type& r) { if(x2 > r.x2) x2 = r.x2; if(y2 > r.y2) y2 = r.y2; if(x1 < r.x1) x1 = r.x1; if(y1 < r.y1) y1 = r.y1; return x1 <= x2 && y1 <= y2; } bool is_valid() const { return x1 <= x2 && y1 <= y2; } bool hit_test(T x, T y) const { return (x >= x1 && x <= x2 && y >= y1 && y <= y2); } bool overlaps(const self_type& r) const { return !(r.x1 > x2 || r.x2 < x1 || r.y1 > y2 || r.y2 < y1); } }; //-----------------------------------------------------intersect_rectangles template inline Rect intersect_rectangles(const Rect& r1, const Rect& r2) { Rect r = r1; // First process x2,y2 because the other order // results in Internal Compiler Error under // Microsoft Visual C++ .NET 2003 69462-335-0000007-18038 in // case of "Maximize Speed" optimization option. //----------------- if(r.x2 > r2.x2) r.x2 = r2.x2; if(r.y2 > r2.y2) r.y2 = r2.y2; if(r.x1 < r2.x1) r.x1 = r2.x1; if(r.y1 < r2.y1) r.y1 = r2.y1; return r; } //---------------------------------------------------------unite_rectangles template inline Rect unite_rectangles(const Rect& r1, const Rect& r2) { Rect r = r1; if(r.x2 < r2.x2) r.x2 = r2.x2; if(r.y2 < r2.y2) r.y2 = r2.y2; if(r.x1 > r2.x1) r.x1 = r2.x1; if(r.y1 > r2.y1) r.y1 = r2.y1; return r; } typedef rect_base rect_i; //----rect_i typedef rect_base rect_f; //----rect_f typedef rect_base rect_d; //----rect_d //---------------------------------------------------------path_commands_e enum path_commands_e { path_cmd_stop = 0, //----path_cmd_stop path_cmd_move_to = 1, //----path_cmd_move_to path_cmd_line_to = 2, //----path_cmd_line_to path_cmd_curve3 = 3, //----path_cmd_curve3 path_cmd_curve4 = 4, //----path_cmd_curve4 path_cmd_curveN = 5, //----path_cmd_curveN path_cmd_catrom = 6, //----path_cmd_catrom path_cmd_ubspline = 7, //----path_cmd_ubspline path_cmd_end_poly = 0x0F, //----path_cmd_end_poly path_cmd_mask = 0x0F //----path_cmd_mask }; //------------------------------------------------------------path_flags_e enum path_flags_e { path_flags_none = 0, //----path_flags_none path_flags_ccw = 0x10, //----path_flags_ccw path_flags_cw = 0x20, //----path_flags_cw path_flags_close = 0x40, //----path_flags_close path_flags_mask = 0xF0 //----path_flags_mask }; //---------------------------------------------------------------is_vertex inline bool is_vertex(unsigned c) { return c >= path_cmd_move_to && c < path_cmd_end_poly; } //--------------------------------------------------------------is_drawing inline bool is_drawing(unsigned c) { return c >= path_cmd_line_to && c < path_cmd_end_poly; } //-----------------------------------------------------------------is_stop inline bool is_stop(unsigned c) { return c == path_cmd_stop; } //--------------------------------------------------------------is_move_to inline bool is_move_to(unsigned c) { return c == path_cmd_move_to; } //--------------------------------------------------------------is_line_to inline bool is_line_to(unsigned c) { return c == path_cmd_line_to; } //----------------------------------------------------------------is_curve inline bool is_curve(unsigned c) { return c == path_cmd_curve3 || c == path_cmd_curve4; } //---------------------------------------------------------------is_curve3 inline bool is_curve3(unsigned c) { return c == path_cmd_curve3; } //---------------------------------------------------------------is_curve4 inline bool is_curve4(unsigned c) { return c == path_cmd_curve4; } //-------------------------------------------------------------is_end_poly inline bool is_end_poly(unsigned c) { return (c & path_cmd_mask) == path_cmd_end_poly; } //----------------------------------------------------------------is_close inline bool is_close(unsigned c) { return (c & ~(path_flags_cw | path_flags_ccw)) == (path_cmd_end_poly | path_flags_close); } //------------------------------------------------------------is_next_poly inline bool is_next_poly(unsigned c) { return is_stop(c) || is_move_to(c) || is_end_poly(c); } //-------------------------------------------------------------------is_cw inline bool is_cw(unsigned c) { return (c & path_flags_cw) != 0; } //------------------------------------------------------------------is_ccw inline bool is_ccw(unsigned c) { return (c & path_flags_ccw) != 0; } //-------------------------------------------------------------is_oriented inline bool is_oriented(unsigned c) { return (c & (path_flags_cw | path_flags_ccw)) != 0; } //---------------------------------------------------------------is_closed inline bool is_closed(unsigned c) { return (c & path_flags_close) != 0; } //----------------------------------------------------------get_close_flag inline unsigned get_close_flag(unsigned c) { return c & path_flags_close; } //-------------------------------------------------------clear_orientation inline unsigned clear_orientation(unsigned c) { return c & ~(path_flags_cw | path_flags_ccw); } //---------------------------------------------------------get_orientation inline unsigned get_orientation(unsigned c) { return c & (path_flags_cw | path_flags_ccw); } //---------------------------------------------------------set_orientation inline unsigned set_orientation(unsigned c, unsigned o) { return clear_orientation(c) | o; } //--------------------------------------------------------------point_base template struct point_base { typedef T value_type; T x,y; point_base() {} point_base(T x_, T y_) : x(x_), y(y_) {} }; typedef point_base point_i; //-----point_i typedef point_base point_f; //-----point_f typedef point_base point_d; //-----point_d //-------------------------------------------------------------vertex_base template struct vertex_base { typedef T value_type; T x,y; unsigned cmd; vertex_base() {} vertex_base(T x_, T y_, unsigned cmd_) : x(x_), y(y_), cmd(cmd_) {} }; typedef vertex_base vertex_i; //-----vertex_i typedef vertex_base vertex_f; //-----vertex_f typedef vertex_base vertex_d; //-----vertex_d //----------------------------------------------------------------row_info template struct row_info { int x1, x2; T* ptr; row_info() {} row_info(int x1_, int x2_, T* ptr_) : x1(x1_), x2(x2_), ptr(ptr_) {} }; //----------------------------------------------------------const_row_info template struct const_row_info { int x1, x2; const T* ptr; const_row_info() {} const_row_info(int x1_, int x2_, const T* ptr_) : x1(x1_), x2(x2_), ptr(ptr_) {} }; //------------------------------------------------------------is_equal_eps template inline bool is_equal_eps(T v1, T v2, T epsilon) { return fabs(v1 - v2) <= double(epsilon); } } #endif contextfree-3.0.5+dfsg1.orig/src-agg/include/agg_renderer_base.h0000644000175000017500000006070312076364074023204 0ustar brambram//---------------------------------------------------------------------------- // Anti-Grain Geometry - Version 2.4 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) // // Permission to copy, use, modify, sell and distribute this software // is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // //---------------------------------------------------------------------------- // Contact: mcseem@antigrain.com // mcseemagg@yahoo.com // http://www.antigrain.com //---------------------------------------------------------------------------- // // class renderer_base // //---------------------------------------------------------------------------- #ifndef AGG_RENDERER_BASE_INCLUDED #define AGG_RENDERER_BASE_INCLUDED #include "agg_basics.h" #include "agg_rendering_buffer.h" namespace agg { //-----------------------------------------------------------renderer_base template class renderer_base { public: typedef PixelFormat pixfmt_type; typedef typename pixfmt_type::color_type color_type; typedef typename pixfmt_type::row_data row_data; //-------------------------------------------------------------------- renderer_base() : m_ren(0), m_clip_box(1, 1, 0, 0) {} explicit renderer_base(pixfmt_type& ren) : m_ren(&ren), m_clip_box(0, 0, ren.width() - 1, ren.height() - 1) {} void attach(pixfmt_type& ren) { m_ren = &ren; m_clip_box = rect_i(0, 0, ren.width() - 1, ren.height() - 1); } //-------------------------------------------------------------------- const pixfmt_type& ren() const { return *m_ren; } pixfmt_type& ren() { return *m_ren; } //-------------------------------------------------------------------- unsigned width() const { return m_ren->width(); } unsigned height() const { return m_ren->height(); } //-------------------------------------------------------------------- bool clip_box(int x1, int y1, int x2, int y2) { rect_i cb(x1, y1, x2, y2); cb.normalize(); if(cb.clip(rect_i(0, 0, width() - 1, height() - 1))) { m_clip_box = cb; return true; } m_clip_box.x1 = 1; m_clip_box.y1 = 1; m_clip_box.x2 = 0; m_clip_box.y2 = 0; return false; } //-------------------------------------------------------------------- void reset_clipping(bool visibility) { if(visibility) { m_clip_box.x1 = 0; m_clip_box.y1 = 0; m_clip_box.x2 = width() - 1; m_clip_box.y2 = height() - 1; } else { m_clip_box.x1 = 1; m_clip_box.y1 = 1; m_clip_box.x2 = 0; m_clip_box.y2 = 0; } } //-------------------------------------------------------------------- void clip_box_naked(int x1, int y1, int x2, int y2) { m_clip_box.x1 = x1; m_clip_box.y1 = y1; m_clip_box.x2 = x2; m_clip_box.y2 = y2; } //-------------------------------------------------------------------- bool inbox(int x, int y) const { return x >= m_clip_box.x1 && y >= m_clip_box.y1 && x <= m_clip_box.x2 && y <= m_clip_box.y2; } //-------------------------------------------------------------------- const rect_i& clip_box() const { return m_clip_box; } int xmin() const { return m_clip_box.x1; } int ymin() const { return m_clip_box.y1; } int xmax() const { return m_clip_box.x2; } int ymax() const { return m_clip_box.y2; } //-------------------------------------------------------------------- const rect_i& bounding_clip_box() const { return m_clip_box; } int bounding_xmin() const { return m_clip_box.x1; } int bounding_ymin() const { return m_clip_box.y1; } int bounding_xmax() const { return m_clip_box.x2; } int bounding_ymax() const { return m_clip_box.y2; } //-------------------------------------------------------------------- void clear(const color_type& c) { unsigned y; if(width()) { for(y = 0; y < height(); y++) { m_ren->copy_hline(0, y, width(), c); } } } //-------------------------------------------------------------------- void copy_pixel(int x, int y, const color_type& c) { if(inbox(x, y)) { m_ren->copy_pixel(x, y, c); } } //-------------------------------------------------------------------- void blend_pixel(int x, int y, const color_type& c, cover_type cover) { if(inbox(x, y)) { m_ren->blend_pixel(x, y, c, cover); } } //-------------------------------------------------------------------- color_type pixel(int x, int y) const { return inbox(x, y) ? m_ren->pixel(x, y) : color_type::no_color(); } //-------------------------------------------------------------------- void copy_hline(int x1, int y, int x2, const color_type& c) { if(x1 > x2) { int t = x2; x2 = x1; x1 = t; } if(y > ymax()) return; if(y < ymin()) return; if(x1 > xmax()) return; if(x2 < xmin()) return; if(x1 < xmin()) x1 = xmin(); if(x2 > xmax()) x2 = xmax(); m_ren->copy_hline(x1, y, x2 - x1 + 1, c); } //-------------------------------------------------------------------- void copy_vline(int x, int y1, int y2, const color_type& c) { if(y1 > y2) { int t = y2; y2 = y1; y1 = t; } if(x > xmax()) return; if(x < xmin()) return; if(y1 > ymax()) return; if(y2 < ymin()) return; if(y1 < ymin()) y1 = ymin(); if(y2 > ymax()) y2 = ymax(); m_ren->copy_vline(x, y1, y2 - y1 + 1, c); } //-------------------------------------------------------------------- void blend_hline(int x1, int y, int x2, const color_type& c, cover_type cover) { if(x1 > x2) { int t = x2; x2 = x1; x1 = t; } if(y > ymax()) return; if(y < ymin()) return; if(x1 > xmax()) return; if(x2 < xmin()) return; if(x1 < xmin()) x1 = xmin(); if(x2 > xmax()) x2 = xmax(); m_ren->blend_hline(x1, y, x2 - x1 + 1, c, cover); } //-------------------------------------------------------------------- void blend_vline(int x, int y1, int y2, const color_type& c, cover_type cover) { if(y1 > y2) { int t = y2; y2 = y1; y1 = t; } if(x > xmax()) return; if(x < xmin()) return; if(y1 > ymax()) return; if(y2 < ymin()) return; if(y1 < ymin()) y1 = ymin(); if(y2 > ymax()) y2 = ymax(); m_ren->blend_vline(x, y1, y2 - y1 + 1, c, cover); } //-------------------------------------------------------------------- void copy_bar(int x1, int y1, int x2, int y2, const color_type& c) { rect_i rc(x1, y1, x2, y2); rc.normalize(); if(rc.clip(clip_box())) { int y; for(y = rc.y1; y <= rc.y2; y++) { m_ren->copy_hline(rc.x1, y, unsigned(rc.x2 - rc.x1 + 1), c); } } } //-------------------------------------------------------------------- void blend_bar(int x1, int y1, int x2, int y2, const color_type& c, cover_type cover) { rect_i rc(x1, y1, x2, y2); rc.normalize(); if(rc.clip(clip_box())) { int y; for(y = rc.y1; y <= rc.y2; y++) { m_ren->blend_hline(rc.x1, y, unsigned(rc.x2 - rc.x1 + 1), c, cover); } } } //-------------------------------------------------------------------- void blend_solid_hspan(int x, int y, int len, const color_type& c, const cover_type* covers) { if(y > ymax()) return; if(y < ymin()) return; if(x < xmin()) { len -= xmin() - x; if(len <= 0) return; covers += xmin() - x; x = xmin(); } if(x + len > xmax()) { len = xmax() - x + 1; if(len <= 0) return; } m_ren->blend_solid_hspan(x, y, len, c, covers); } //-------------------------------------------------------------------- void blend_solid_vspan(int x, int y, int len, const color_type& c, const cover_type* covers) { if(x > xmax()) return; if(x < xmin()) return; if(y < ymin()) { len -= ymin() - y; if(len <= 0) return; covers += ymin() - y; y = ymin(); } if(y + len > ymax()) { len = ymax() - y + 1; if(len <= 0) return; } m_ren->blend_solid_vspan(x, y, len, c, covers); } //-------------------------------------------------------------------- void copy_color_hspan(int x, int y, int len, const color_type* colors) { if(y > ymax()) return; if(y < ymin()) return; if(x < xmin()) { int d = xmin() - x; len -= d; if(len <= 0) return; colors += d; x = xmin(); } if(x + len > xmax()) { len = xmax() - x + 1; if(len <= 0) return; } m_ren->copy_color_hspan(x, y, len, colors); } //-------------------------------------------------------------------- void copy_color_vspan(int x, int y, int len, const color_type* colors) { if(x > xmax()) return; if(x < xmin()) return; if(y < ymin()) { int d = ymin() - y; len -= d; if(len <= 0) return; colors += d; y = ymin(); } if(y + len > ymax()) { len = ymax() - y + 1; if(len <= 0) return; } m_ren->copy_color_vspan(x, y, len, colors); } //-------------------------------------------------------------------- void blend_color_hspan(int x, int y, int len, const color_type* colors, const cover_type* covers, cover_type cover = agg::cover_full) { if(y > ymax()) return; if(y < ymin()) return; if(x < xmin()) { int d = xmin() - x; len -= d; if(len <= 0) return; if(covers) covers += d; colors += d; x = xmin(); } if(x + len > xmax()) { len = xmax() - x + 1; if(len <= 0) return; } m_ren->blend_color_hspan(x, y, len, colors, covers, cover); } //-------------------------------------------------------------------- void blend_color_vspan(int x, int y, int len, const color_type* colors, const cover_type* covers, cover_type cover = agg::cover_full) { if(x > xmax()) return; if(x < xmin()) return; if(y < ymin()) { int d = ymin() - y; len -= d; if(len <= 0) return; if(covers) covers += d; colors += d; y = ymin(); } if(y + len > ymax()) { len = ymax() - y + 1; if(len <= 0) return; } m_ren->blend_color_vspan(x, y, len, colors, covers, cover); } //-------------------------------------------------------------------- rect_i clip_rect_area(rect_i& dst, rect_i& src, int wsrc, int hsrc) const { rect_i rc(0,0,0,0); rect_i cb = clip_box(); ++cb.x2; ++cb.y2; if(src.x1 < 0) { dst.x1 -= src.x1; src.x1 = 0; } if(src.y1 < 0) { dst.y1 -= src.y1; src.y1 = 0; } if(src.x2 > wsrc) src.x2 = wsrc; if(src.y2 > hsrc) src.y2 = hsrc; if(dst.x1 < cb.x1) { src.x1 += cb.x1 - dst.x1; dst.x1 = cb.x1; } if(dst.y1 < cb.y1) { src.y1 += cb.y1 - dst.y1; dst.y1 = cb.y1; } if(dst.x2 > cb.x2) dst.x2 = cb.x2; if(dst.y2 > cb.y2) dst.y2 = cb.y2; rc.x2 = dst.x2 - dst.x1; rc.y2 = dst.y2 - dst.y1; if(rc.x2 > src.x2 - src.x1) rc.x2 = src.x2 - src.x1; if(rc.y2 > src.y2 - src.y1) rc.y2 = src.y2 - src.y1; return rc; } //-------------------------------------------------------------------- template void copy_from(const RenBuf& src, const rect_i* rect_src_ptr = 0, int dx = 0, int dy = 0) { rect_i rsrc(0, 0, src.width(), src.height()); if(rect_src_ptr) { rsrc.x1 = rect_src_ptr->x1; rsrc.y1 = rect_src_ptr->y1; rsrc.x2 = rect_src_ptr->x2 + 1; rsrc.y2 = rect_src_ptr->y2 + 1; } // Version with xdst, ydst (absolute positioning) //rect_i rdst(xdst, ydst, xdst + rsrc.x2 - rsrc.x1, ydst + rsrc.y2 - rsrc.y1); // Version with dx, dy (relative positioning) rect_i rdst(rsrc.x1 + dx, rsrc.y1 + dy, rsrc.x2 + dx, rsrc.y2 + dy); rect_i rc = clip_rect_area(rdst, rsrc, src.width(), src.height()); if(rc.x2 > 0) { int incy = 1; if(rdst.y1 > rsrc.y1) { rsrc.y1 += rc.y2 - 1; rdst.y1 += rc.y2 - 1; incy = -1; } while(rc.y2 > 0) { m_ren->copy_from(src, rdst.x1, rdst.y1, rsrc.x1, rsrc.y1, rc.x2); rdst.y1 += incy; rsrc.y1 += incy; --rc.y2; } } } //-------------------------------------------------------------------- template void blend_from(const SrcPixelFormatRenderer& src, const rect_i* rect_src_ptr = 0, int dx = 0, int dy = 0, cover_type cover = agg::cover_full) { rect_i rsrc(0, 0, src.width(), src.height()); if(rect_src_ptr) { rsrc.x1 = rect_src_ptr->x1; rsrc.y1 = rect_src_ptr->y1; rsrc.x2 = rect_src_ptr->x2 + 1; rsrc.y2 = rect_src_ptr->y2 + 1; } // Version with xdst, ydst (absolute positioning) //rect_i rdst(xdst, ydst, xdst + rsrc.x2 - rsrc.x1, ydst + rsrc.y2 - rsrc.y1); // Version with dx, dy (relative positioning) rect_i rdst(rsrc.x1 + dx, rsrc.y1 + dy, rsrc.x2 + dx, rsrc.y2 + dy); rect_i rc = clip_rect_area(rdst, rsrc, src.width(), src.height()); if(rc.x2 > 0) { int incy = 1; if(rdst.y1 > rsrc.y1) { rsrc.y1 += rc.y2 - 1; rdst.y1 += rc.y2 - 1; incy = -1; } while(rc.y2 > 0) { typename SrcPixelFormatRenderer::row_data rw = src.row(rsrc.y1); if(rw.ptr) { int x1src = rsrc.x1; int x1dst = rdst.x1; int len = rc.x2; if(rw.x1 > x1src) { x1dst += rw.x1 - x1src; len -= rw.x1 - x1src; x1src = rw.x1; } if(len > 0) { if(x1src + len-1 > rw.x2) { len -= x1src + len - rw.x2 - 1; } if(len > 0) { m_ren->blend_from(src, x1dst, rdst.y1, x1src, rsrc.y1, len, cover); } } } rdst.y1 += incy; rsrc.y1 += incy; --rc.y2; } } } //-------------------------------------------------------------------- template void blend_from_color(const SrcPixelFormatRenderer& src, const color_type& color, const rect_i* rect_src_ptr = 0, int dx = 0, int dy = 0, cover_type cover = agg::cover_full) { rect_i rsrc(0, 0, src.width(), src.height()); if(rect_src_ptr) { rsrc.x1 = rect_src_ptr->x1; rsrc.y1 = rect_src_ptr->y1; rsrc.x2 = rect_src_ptr->x2 + 1; rsrc.y2 = rect_src_ptr->y2 + 1; } // Version with xdst, ydst (absolute positioning) //rect_i rdst(xdst, ydst, xdst + rsrc.x2 - rsrc.x1, ydst + rsrc.y2 - rsrc.y1); // Version with dx, dy (relative positioning) rect_i rdst(rsrc.x1 + dx, rsrc.y1 + dy, rsrc.x2 + dx, rsrc.y2 + dy); rect_i rc = clip_rect_area(rdst, rsrc, src.width(), src.height()); if(rc.x2 > 0) { int incy = 1; if(rdst.y1 > rsrc.y1) { rsrc.y1 += rc.y2 - 1; rdst.y1 += rc.y2 - 1; incy = -1; } while(rc.y2 > 0) { typename SrcPixelFormatRenderer::row_data rw = src.row(rsrc.y1); if(rw.ptr) { int x1src = rsrc.x1; int x1dst = rdst.x1; int len = rc.x2; if(rw.x1 > x1src) { x1dst += rw.x1 - x1src; len -= rw.x1 - x1src; x1src = rw.x1; } if(len > 0) { if(x1src + len-1 > rw.x2) { len -= x1src + len - rw.x2 - 1; } if(len > 0) { m_ren->blend_from_color(src, color, x1dst, rdst.y1, x1src, rsrc.y1, len, cover); } } } rdst.y1 += incy; rsrc.y1 += incy; --rc.y2; } } } //-------------------------------------------------------------------- template void blend_from_lut(const SrcPixelFormatRenderer& src, const color_type* color_lut, const rect_i* rect_src_ptr = 0, int dx = 0, int dy = 0, cover_type cover = agg::cover_full) { rect_i rsrc(0, 0, src.width(), src.height()); if(rect_src_ptr) { rsrc.x1 = rect_src_ptr->x1; rsrc.y1 = rect_src_ptr->y1; rsrc.x2 = rect_src_ptr->x2 + 1; rsrc.y2 = rect_src_ptr->y2 + 1; } // Version with xdst, ydst (absolute positioning) //rect_i rdst(xdst, ydst, xdst + rsrc.x2 - rsrc.x1, ydst + rsrc.y2 - rsrc.y1); // Version with dx, dy (relative positioning) rect_i rdst(rsrc.x1 + dx, rsrc.y1 + dy, rsrc.x2 + dx, rsrc.y2 + dy); rect_i rc = clip_rect_area(rdst, rsrc, src.width(), src.height()); if(rc.x2 > 0) { int incy = 1; if(rdst.y1 > rsrc.y1) { rsrc.y1 += rc.y2 - 1; rdst.y1 += rc.y2 - 1; incy = -1; } while(rc.y2 > 0) { typename SrcPixelFormatRenderer::row_data rw = src.row(rsrc.y1); if(rw.ptr) { int x1src = rsrc.x1; int x1dst = rdst.x1; int len = rc.x2; if(rw.x1 > x1src) { x1dst += rw.x1 - x1src; len -= rw.x1 - x1src; x1src = rw.x1; } if(len > 0) { if(x1src + len-1 > rw.x2) { len -= x1src + len - rw.x2 - 1; } if(len > 0) { m_ren->blend_from_lut(src, color_lut, x1dst, rdst.y1, x1src, rsrc.y1, len, cover); } } } rdst.y1 += incy; rsrc.y1 += incy; --rc.y2; } } } private: pixfmt_type* m_ren; rect_i m_clip_box; }; } #endif contextfree-3.0.5+dfsg1.orig/src-agg/include/agg_pixfmt_rgb.h0000644000175000017500000010007212076364074022537 0ustar brambram//---------------------------------------------------------------------------- // Anti-Grain Geometry - Version 2.4 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) // // Permission to copy, use, modify, sell and distribute this software // is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // //---------------------------------------------------------------------------- // Contact: mcseem@antigrain.com // mcseemagg@yahoo.com // http://www.antigrain.com //---------------------------------------------------------------------------- // // Adaptation for high precision colors has been sponsored by // Liberty Technology Systems, Inc., visit http://lib-sys.com // // Liberty Technology Systems, Inc. is the provider of // PostScript and PDF technology for software developers. // //---------------------------------------------------------------------------- #ifndef AGG_PIXFMT_RGB_INCLUDED #define AGG_PIXFMT_RGB_INCLUDED #include #include "agg_basics.h" #include "agg_color_rgba.h" #include "agg_rendering_buffer.h" namespace agg { //=====================================================apply_gamma_dir_rgb template class apply_gamma_dir_rgb { public: typedef typename ColorT::value_type value_type; apply_gamma_dir_rgb(const GammaLut& gamma) : m_gamma(gamma) {} AGG_INLINE void operator () (value_type* p) { p[Order::R] = m_gamma.dir(p[Order::R]); p[Order::G] = m_gamma.dir(p[Order::G]); p[Order::B] = m_gamma.dir(p[Order::B]); } private: const GammaLut& m_gamma; }; //=====================================================apply_gamma_inv_rgb template class apply_gamma_inv_rgb { public: typedef typename ColorT::value_type value_type; apply_gamma_inv_rgb(const GammaLut& gamma) : m_gamma(gamma) {} AGG_INLINE void operator () (value_type* p) { p[Order::R] = m_gamma.inv(p[Order::R]); p[Order::G] = m_gamma.inv(p[Order::G]); p[Order::B] = m_gamma.inv(p[Order::B]); } private: const GammaLut& m_gamma; }; //=========================================================blender_rgb template struct blender_rgb { typedef ColorT color_type; typedef Order order_type; typedef typename color_type::value_type value_type; typedef typename color_type::calc_type calc_type; enum base_scale_e { base_shift = color_type::base_shift }; // Blend pixels using the non-premultiplied form of Alvy-Ray Smith's // compositing function. Since the render buffer is opaque we skip the // initial premultiply and final demultiply. //-------------------------------------------------------------------- static AGG_INLINE void blend_pix(value_type* p, unsigned cr, unsigned cg, unsigned cb, unsigned alpha, unsigned cover) { alpha = color_type::int_mult_cover(alpha, cover); p[Order::R] = (value_type)(color_type::int_lerp(p[Order::R], cr, alpha)); p[Order::G] = (value_type)(color_type::int_lerp(p[Order::G], cg, alpha)); p[Order::B] = (value_type)(color_type::int_lerp(p[Order::B], cb, alpha)); } //-------------------------------------------------------------------- static AGG_INLINE void blend_pix(value_type* p, unsigned cr, unsigned cg, unsigned cb, unsigned alpha) { p[Order::R] = (value_type)(color_type::int_lerp(p[Order::R], cr, alpha)); p[Order::G] = (value_type)(color_type::int_lerp(p[Order::G], cg, alpha)); p[Order::B] = (value_type)(color_type::int_lerp(p[Order::B], cb, alpha)); } }; //======================================================blender_rgb_pre template struct blender_rgb_pre { typedef ColorT color_type; typedef Order order_type; typedef typename color_type::value_type value_type; typedef typename color_type::calc_type calc_type; enum base_scale_e { base_shift = color_type::base_shift }; // Blend pixels using the premultiplied form of Alvy-Ray Smith's // compositing function. //-------------------------------------------------------------------- static AGG_INLINE void blend_pix(value_type* p, unsigned cr, unsigned cg, unsigned cb, unsigned alpha, unsigned cover) { cr = color_type::int_mult_cover(cr, cover); cg = color_type::int_mult_cover(cg, cover); cb = color_type::int_mult_cover(cb, cover); alpha = color_type::int_mult_cover(alpha, cover); p[Order::R] = (value_type)(color_type::int_prelerp(p[Order::R], cr, alpha)); p[Order::G] = (value_type)(color_type::int_prelerp(p[Order::G], cg, alpha)); p[Order::B] = (value_type)(color_type::int_prelerp(p[Order::B], cb, alpha)); } //-------------------------------------------------------------------- static AGG_INLINE void blend_pix(value_type* p, unsigned cr, unsigned cg, unsigned cb, unsigned alpha) { p[Order::R] = (value_type)(color_type::int_prelerp(p[Order::R], cr, alpha)); p[Order::G] = (value_type)(color_type::int_prelerp(p[Order::G], cg, alpha)); p[Order::B] = (value_type)(color_type::int_prelerp(p[Order::B], cb, alpha)); } }; //===================================================blender_rgb_gamma template class blender_rgb_gamma { public: typedef ColorT color_type; typedef Order order_type; typedef Gamma gamma_type; typedef typename color_type::value_type value_type; typedef typename color_type::calc_type calc_type; enum base_scale_e { base_shift = color_type::base_shift }; //-------------------------------------------------------------------- blender_rgb_gamma() : m_gamma(0) {} void gamma(const gamma_type& g) { m_gamma = &g; } //-------------------------------------------------------------------- AGG_INLINE void blend_pix(value_type* p, unsigned cr, unsigned cg, unsigned cb, unsigned alpha, unsigned cover) { alpha = color_type::int_mult_cover(alpha, cover); calc_type r = m_gamma->dir(p[Order::R]); calc_type g = m_gamma->dir(p[Order::G]); calc_type b = m_gamma->dir(p[Order::B]); p[Order::R] = m_gamma->inv((((m_gamma->dir(cr) - r) * alpha) >> base_shift) + r); p[Order::G] = m_gamma->inv((((m_gamma->dir(cg) - g) * alpha) >> base_shift) + g); p[Order::B] = m_gamma->inv((((m_gamma->dir(cb) - b) * alpha) >> base_shift) + b); } //-------------------------------------------------------------------- AGG_INLINE void blend_pix(value_type* p, unsigned cr, unsigned cg, unsigned cb, unsigned alpha) { calc_type r = m_gamma->dir(p[Order::R]); calc_type g = m_gamma->dir(p[Order::G]); calc_type b = m_gamma->dir(p[Order::B]); p[Order::R] = m_gamma->inv((((m_gamma->dir(cr) - r) * alpha) >> base_shift) + r); p[Order::G] = m_gamma->inv((((m_gamma->dir(cg) - g) * alpha) >> base_shift) + g); p[Order::B] = m_gamma->inv((((m_gamma->dir(cb) - b) * alpha) >> base_shift) + b); } private: const gamma_type* m_gamma; }; //==================================================pixfmt_alpha_blend_rgb template class pixfmt_alpha_blend_rgb { public: typedef RenBuf rbuf_type; typedef Blender blender_type; typedef typename rbuf_type::row_data row_data; typedef typename blender_type::color_type color_type; typedef typename blender_type::order_type order_type; typedef typename color_type::value_type value_type; typedef typename color_type::calc_type calc_type; enum base_scale_e { base_shift = color_type::base_shift, base_scale = color_type::base_scale, base_mask = color_type::base_mask, pix_width = sizeof(value_type) * 3 }; private: //-------------------------------------------------------------------- AGG_INLINE void copy_or_blend_pix(value_type* p, const color_type& c, unsigned cover) { if (c.a) { if(c.a == base_mask && cover == cover_mask) { p[order_type::R] = c.r; p[order_type::G] = c.g; p[order_type::B] = c.b; } else { m_blender.blend_pix(p, c.r, c.g, c.b, c.a, cover); } } } //-------------------------------------------------------------------- AGG_INLINE void copy_or_blend_pix(value_type* p, const color_type& c) { if (c.a) { if(c.a == base_mask) { p[order_type::R] = c.r; p[order_type::G] = c.g; p[order_type::B] = c.b; } else { m_blender.blend_pix(p, c.r, c.g, c.b, c.a); } } } public: //-------------------------------------------------------------------- explicit pixfmt_alpha_blend_rgb(rbuf_type& rb) : m_rbuf(&rb) {} void attach(rbuf_type& rb) { m_rbuf = &rb; } //-------------------------------------------------------------------- template bool attach(PixFmt& pixf, int x1, int y1, int x2, int y2) { rect_i r(x1, y1, x2, y2); if(r.clip(rect_i(0, 0, pixf.width()-1, pixf.height()-1))) { int stride = pixf.stride(); m_rbuf->attach(pixf.pix_ptr(r.x1, stride < 0 ? r.y2 : r.y1), (r.x2 - r.x1) + 1, (r.y2 - r.y1) + 1, stride); return true; } return false; } //-------------------------------------------------------------------- Blender& blender() { return m_blender; } //-------------------------------------------------------------------- AGG_INLINE unsigned width() const { return m_rbuf->width(); } AGG_INLINE unsigned height() const { return m_rbuf->height(); } AGG_INLINE int stride() const { return m_rbuf->stride(); } //-------------------------------------------------------------------- AGG_INLINE int8u* row_ptr(int y) { return m_rbuf->row_ptr(y); } AGG_INLINE const int8u* row_ptr(int y) const { return m_rbuf->row_ptr(y); } AGG_INLINE row_data row(int y) const { return m_rbuf->row(y); } //-------------------------------------------------------------------- AGG_INLINE int8u* pix_ptr(int x, int y) { return m_rbuf->row_ptr(y) + x * pix_width; } AGG_INLINE const int8u* pix_ptr(int x, int y) const { return m_rbuf->row_ptr(y) + x * pix_width; } //-------------------------------------------------------------------- AGG_INLINE static void make_pix(int8u* p, const color_type& c) { ((value_type*)p)[order_type::R] = c.r; ((value_type*)p)[order_type::G] = c.g; ((value_type*)p)[order_type::B] = c.b; } //-------------------------------------------------------------------- AGG_INLINE color_type pixel(int x, int y) const { value_type* p = (value_type*)m_rbuf->row_ptr(y) + x + x + x; return color_type(p[order_type::R], p[order_type::G], p[order_type::B]); } //-------------------------------------------------------------------- AGG_INLINE void copy_pixel(int x, int y, const color_type& c) { value_type* p = (value_type*)m_rbuf->row_ptr(x, y, 1) + x + x + x; p[order_type::R] = c.r; p[order_type::G] = c.g; p[order_type::B] = c.b; } //-------------------------------------------------------------------- AGG_INLINE void blend_pixel(int x, int y, const color_type& c, int8u cover) { copy_or_blend_pix((value_type*)m_rbuf->row_ptr(x, y, 1) + x + x + x, c, cover); } //-------------------------------------------------------------------- AGG_INLINE void copy_hline(int x, int y, unsigned len, const color_type& c) { value_type* p = (value_type*)m_rbuf->row_ptr(x, y, len) + x + x + x; do { p[order_type::R] = c.r; p[order_type::G] = c.g; p[order_type::B] = c.b; p += 3; } while(--len); } //-------------------------------------------------------------------- AGG_INLINE void copy_vline(int x, int y, unsigned len, const color_type& c) { do { value_type* p = (value_type*) m_rbuf->row_ptr(x, y++, 1) + x + x + x; p[order_type::R] = c.r; p[order_type::G] = c.g; p[order_type::B] = c.b; } while(--len); } //-------------------------------------------------------------------- void blend_hline(int x, int y, unsigned len, const color_type& c, int8u cover) { if (c.a) { value_type* p = (value_type*) m_rbuf->row_ptr(x, y, len) + x + x + x; if(c.a == base_mask && cover == cover_mask) { do { p[order_type::R] = c.r; p[order_type::G] = c.g; p[order_type::B] = c.b; p += 3; } while(--len); } else { do { m_blender.blend_pix(p, c.r, c.g, c.b, c.a, cover); p += 3; } while(--len); } } } //-------------------------------------------------------------------- void blend_vline(int x, int y, unsigned len, const color_type& c, int8u cover) { if (c.a) { value_type* p; if(c.a == base_mask && cover == cover_mask) { do { p = (value_type*) m_rbuf->row_ptr(x, y++, 1) + x + x + x; p[order_type::R] = c.r; p[order_type::G] = c.g; p[order_type::B] = c.b; } while(--len); } else { do { p = (value_type*) m_rbuf->row_ptr(x, y++, 1) + x + x + x; m_blender.blend_pix(p, c.r, c.g, c.b, c.a, cover); } while(--len); } } } //-------------------------------------------------------------------- void blend_solid_hspan(int x, int y, unsigned len, const color_type& c, const int8u* covers) { if (c.a) { value_type* p = (value_type*) m_rbuf->row_ptr(x, y, len) + x + x + x; do { if(c.a == base_mask && *covers == cover_mask) { p[order_type::R] = c.r; p[order_type::G] = c.g; p[order_type::B] = c.b; } else { m_blender.blend_pix(p, c.r, c.g, c.b, c.a, *covers); } p += 3; ++covers; } while(--len); } } //-------------------------------------------------------------------- void blend_solid_vspan(int x, int y, unsigned len, const color_type& c, const int8u* covers) { if (c.a) { do { value_type* p = (value_type*) m_rbuf->row_ptr(x, y++, 1) + x + x + x; if(c.a == base_mask && *covers == cover_mask) { p[order_type::R] = c.r; p[order_type::G] = c.g; p[order_type::B] = c.b; } else { m_blender.blend_pix(p, c.r, c.g, c.b, c.a, *covers); } ++covers; } while(--len); } } //-------------------------------------------------------------------- void copy_color_hspan(int x, int y, unsigned len, const color_type* colors) { value_type* p = (value_type*) m_rbuf->row_ptr(x, y, len) + x + x + x; do { p[order_type::R] = colors->r; p[order_type::G] = colors->g; p[order_type::B] = colors->b; ++colors; p += 3; } while(--len); } //-------------------------------------------------------------------- void copy_color_vspan(int x, int y, unsigned len, const color_type* colors) { do { value_type* p = (value_type*) m_rbuf->row_ptr(x, y++, 1) + x + x + x; p[order_type::R] = colors->r; p[order_type::G] = colors->g; p[order_type::B] = colors->b; ++colors; } while(--len); } //-------------------------------------------------------------------- void blend_color_hspan(int x, int y, unsigned len, const color_type* colors, const int8u* covers, int8u cover) { value_type* p = (value_type*) m_rbuf->row_ptr(x, y, len) + x + x + x; if(covers) { do { copy_or_blend_pix(p, *colors++, *covers++); p += 3; } while(--len); } else { if(cover == cover_mask) { do { copy_or_blend_pix(p, *colors++); p += 3; } while(--len); } else { do { copy_or_blend_pix(p, *colors++, cover); p += 3; } while(--len); } } } //-------------------------------------------------------------------- void blend_color_vspan(int x, int y, unsigned len, const color_type* colors, const int8u* covers, int8u cover) { value_type* p; if(covers) { do { p = (value_type*) m_rbuf->row_ptr(x, y++, 1) + x + x + x; copy_or_blend_pix(p, *colors++, *covers++); } while(--len); } else { if(cover == cover_mask) { do { p = (value_type*) m_rbuf->row_ptr(x, y++, 1) + x + x + x; copy_or_blend_pix(p, *colors++); } while(--len); } else { do { p = (value_type*) m_rbuf->row_ptr(x, y++, 1) + x + x + x; copy_or_blend_pix(p, *colors++, cover); } while(--len); } } } //-------------------------------------------------------------------- template void for_each_pixel(Function f) { unsigned y; for(y = 0; y < height(); ++y) { row_data r = m_rbuf->row(y); if(r.ptr) { unsigned len = r.x2 - r.x1 + 1; value_type* p = (value_type*) m_rbuf->row_ptr(r.x1, y, len) + r.x1 * 3; do { f(p); p += 3; } while(--len); } } } //-------------------------------------------------------------------- template void apply_gamma_dir(const GammaLut& g) { for_each_pixel(apply_gamma_dir_rgb(g)); } //-------------------------------------------------------------------- template void apply_gamma_inv(const GammaLut& g) { for_each_pixel(apply_gamma_inv_rgb(g)); } //-------------------------------------------------------------------- template void copy_from(const RenBuf2& from, int xdst, int ydst, int xsrc, int ysrc, unsigned len) { const int8u* p = from.row_ptr(ysrc); if(p) { memmove(m_rbuf->row_ptr(xdst, ydst, len) + xdst * pix_width, p + xsrc * pix_width, len * pix_width); } } //-------------------------------------------------------------------- template void blend_from(const SrcPixelFormatRenderer& from, int xdst, int ydst, int xsrc, int ysrc, unsigned len, int8u cover) { typedef typename SrcPixelFormatRenderer::order_type src_order; const value_type* psrc = (const value_type*)from.row_ptr(ysrc); if(psrc) { psrc += xsrc * 4; value_type* pdst = (value_type*)m_rbuf->row_ptr(xdst, ydst, len) + xdst * 3; if(cover == cover_mask) { do { value_type alpha = psrc[src_order::A]; if(alpha) { if(alpha == base_mask) { pdst[order_type::R] = psrc[src_order::R]; pdst[order_type::G] = psrc[src_order::G]; pdst[order_type::B] = psrc[src_order::B]; } else { m_blender.blend_pix(pdst, psrc[src_order::R], psrc[src_order::G], psrc[src_order::B], alpha); } } psrc += 4; pdst += 3; } while(--len); } else { color_type color; do { color.r = psrc[src_order::R]; color.g = psrc[src_order::G]; color.b = psrc[src_order::B]; color.a = psrc[src_order::A]; copy_or_blend_pix(pdst, color, cover); psrc += 4; pdst += 3; } while(--len); } } } //-------------------------------------------------------------------- template void blend_from_color(const SrcPixelFormatRenderer& from, const color_type& color, int xdst, int ydst, int xsrc, int ysrc, unsigned len, int8u cover) { typedef typename SrcPixelFormatRenderer::value_type src_value_type; const src_value_type* psrc = (src_value_type*)from.row_ptr(ysrc); if(psrc) { value_type* pdst = (value_type*)m_rbuf->row_ptr(xdst, ydst, len) + xdst * 3; do { copy_or_blend_pix(pdst, color, color_type::int_mult_cover(*psrc, cover)); ++psrc; pdst += 3; } while(--len); } } //-------------------------------------------------------------------- template void blend_from_lut(const SrcPixelFormatRenderer& from, const color_type* color_lut, int xdst, int ydst, int xsrc, int ysrc, unsigned len, int8u cover) { typedef typename SrcPixelFormatRenderer::value_type src_value_type; const src_value_type* psrc = (src_value_type*)from.row_ptr(ysrc); if(psrc) { value_type* pdst = (value_type*)m_rbuf->row_ptr(xdst, ydst, len) + xdst * 3; if(cover == cover_mask) { do { const color_type& color = color_lut[*psrc]; m_blender.blend_pix(pdst, color.r, color.g, color.b, color.a); ++psrc; pdst += 3; } while(--len); } else { do { copy_or_blend_pix(pdst, color_lut[*psrc], cover); ++psrc; pdst += 3; } while(--len); } } } private: rbuf_type* m_rbuf; Blender m_blender; }; typedef pixfmt_alpha_blend_rgb, rendering_buffer> pixfmt_rgb24; //----pixfmt_rgb24 typedef pixfmt_alpha_blend_rgb, rendering_buffer> pixfmt_bgr24; //----pixfmt_bgr24 typedef pixfmt_alpha_blend_rgb, rendering_buffer> pixfmt_rgb48; //----pixfmt_rgb48 typedef pixfmt_alpha_blend_rgb, rendering_buffer> pixfmt_bgr48; //----pixfmt_bgr48 typedef pixfmt_alpha_blend_rgb, rendering_buffer> pixfmt_rgb24_pre; //----pixfmt_rgb24_pre typedef pixfmt_alpha_blend_rgb, rendering_buffer> pixfmt_bgr24_pre; //----pixfmt_bgr24_pre typedef pixfmt_alpha_blend_rgb, rendering_buffer> pixfmt_rgb48_pre; //----pixfmt_rgb48_pre typedef pixfmt_alpha_blend_rgb, rendering_buffer> pixfmt_bgr48_pre; //----pixfmt_bgr48_pre //-----------------------------------------------------pixfmt_rgb24_gamma template class pixfmt_rgb24_gamma : public pixfmt_alpha_blend_rgb, rendering_buffer> { public: pixfmt_rgb24_gamma(rendering_buffer& rb, const Gamma& g) : pixfmt_alpha_blend_rgb, rendering_buffer>(rb) { this->blender().gamma(g); } }; //-----------------------------------------------------pixfmt_bgr24_gamma template class pixfmt_bgr24_gamma : public pixfmt_alpha_blend_rgb, rendering_buffer> { public: pixfmt_bgr24_gamma(rendering_buffer& rb, const Gamma& g) : pixfmt_alpha_blend_rgb, rendering_buffer>(rb) { this->blender().gamma(g); } }; //-----------------------------------------------------pixfmt_rgb48_gamma template class pixfmt_rgb48_gamma : public pixfmt_alpha_blend_rgb, rendering_buffer> { public: pixfmt_rgb48_gamma(rendering_buffer& rb, const Gamma& g) : pixfmt_alpha_blend_rgb, rendering_buffer>(rb) { this->blender().gamma(g); } }; //-----------------------------------------------------pixfmt_bgr48_gamma template class pixfmt_bgr48_gamma : public pixfmt_alpha_blend_rgb, rendering_buffer> { public: pixfmt_bgr48_gamma(rendering_buffer& rb, const Gamma& g) : pixfmt_alpha_blend_rgb, rendering_buffer>(rb) { this->blender().gamma(g); } }; } #endif contextfree-3.0.5+dfsg1.orig/src-agg/include/agg_rasterizer_cells_aa.h0000644000175000017500000005162712076364074024426 0ustar brambram//---------------------------------------------------------------------------- // Anti-Grain Geometry - Version 2.4 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) // // Permission to copy, use, modify, sell and distribute this software // is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // //---------------------------------------------------------------------------- // // The author gratefully acknowleges the support of David Turner, // Robert Wilhelm, and Werner Lemberg - the authors of the FreeType // libray - in producing this work. See http://www.freetype.org for details. // //---------------------------------------------------------------------------- // Contact: mcseem@antigrain.com // mcseemagg@yahoo.com // http://www.antigrain.com //---------------------------------------------------------------------------- // // Adaptation for 32-bit screen coordinates has been sponsored by // Liberty Technology Systems, Inc., visit http://lib-sys.com // // Liberty Technology Systems, Inc. is the provider of // PostScript and PDF technology for software developers. // //---------------------------------------------------------------------------- #ifndef AGG_RASTERIZER_CELLS_AA_INCLUDED #define AGG_RASTERIZER_CELLS_AA_INCLUDED #include #include #include "agg_math.h" #include "agg_array.h" namespace agg { //-----------------------------------------------------rasterizer_cells_aa // An internal class that implements the main rasterization algorithm. // Used in the rasterizer. Should not be used direcly. template class rasterizer_cells_aa { enum cell_block_scale_e { cell_block_shift = 12, cell_block_size = 1 << cell_block_shift, cell_block_mask = cell_block_size - 1, cell_block_pool = 256, cell_block_limit = 1024 }; struct sorted_y { unsigned start; unsigned num; }; public: typedef Cell cell_type; typedef rasterizer_cells_aa self_type; ~rasterizer_cells_aa(); rasterizer_cells_aa(); void reset(); void style(const cell_type& style_cell); void line(int x1, int y1, int x2, int y2); int min_x() const { return m_min_x; } int min_y() const { return m_min_y; } int max_x() const { return m_max_x; } int max_y() const { return m_max_y; } void sort_cells(); unsigned total_cells() const { return m_num_cells; } unsigned scanline_num_cells(unsigned y) const { return m_sorted_y[y - m_min_y].num; } const cell_type* const* scanline_cells(unsigned y) const { return m_sorted_cells.data() + m_sorted_y[y - m_min_y].start; } bool sorted() const { return m_sorted; } private: rasterizer_cells_aa(const self_type&); const self_type& operator = (const self_type&); void set_curr_cell(int x, int y); void add_curr_cell(); void render_hline(int ey, int x1, int y1, int x2, int y2); void allocate_block(); private: unsigned m_num_blocks; unsigned m_max_blocks; unsigned m_curr_block; unsigned m_num_cells; cell_type** m_cells; cell_type* m_curr_cell_ptr; pod_vector m_sorted_cells; pod_vector m_sorted_y; cell_type m_curr_cell; cell_type m_style_cell; int m_min_x; int m_min_y; int m_max_x; int m_max_y; bool m_sorted; }; //------------------------------------------------------------------------ template rasterizer_cells_aa::~rasterizer_cells_aa() { if(m_num_blocks) { cell_type** ptr = m_cells + m_num_blocks - 1; while(m_num_blocks--) { pod_allocator::deallocate(*ptr, cell_block_size); ptr--; } pod_allocator::deallocate(m_cells, m_max_blocks); } } //------------------------------------------------------------------------ template rasterizer_cells_aa::rasterizer_cells_aa() : m_num_blocks(0), m_max_blocks(0), m_curr_block(0), m_num_cells(0), m_cells(0), m_curr_cell_ptr(0), m_sorted_cells(), m_sorted_y(), m_min_x(0x7FFFFFFF), m_min_y(0x7FFFFFFF), m_max_x(-0x7FFFFFFF), m_max_y(-0x7FFFFFFF), m_sorted(false) { m_style_cell.initial(); m_curr_cell.initial(); } //------------------------------------------------------------------------ template void rasterizer_cells_aa::reset() { m_num_cells = 0; m_curr_block = 0; m_curr_cell.initial(); m_style_cell.initial(); m_sorted = false; m_min_x = 0x7FFFFFFF; m_min_y = 0x7FFFFFFF; m_max_x = -0x7FFFFFFF; m_max_y = -0x7FFFFFFF; } //------------------------------------------------------------------------ template AGG_INLINE void rasterizer_cells_aa::add_curr_cell() { if(m_curr_cell.area | m_curr_cell.cover) { if((m_num_cells & cell_block_mask) == 0) { if(m_num_blocks >= cell_block_limit) return; allocate_block(); } *m_curr_cell_ptr++ = m_curr_cell; ++m_num_cells; } } //------------------------------------------------------------------------ template AGG_INLINE void rasterizer_cells_aa::set_curr_cell(int x, int y) { if(m_curr_cell.not_equal(x, y, m_style_cell)) { add_curr_cell(); m_curr_cell.style(m_style_cell); m_curr_cell.x = x; m_curr_cell.y = y; m_curr_cell.cover = 0; m_curr_cell.area = 0; } } //------------------------------------------------------------------------ template AGG_INLINE void rasterizer_cells_aa::render_hline(int ey, int x1, int y1, int x2, int y2) { int ex1 = x1 >> poly_subpixel_shift; int ex2 = x2 >> poly_subpixel_shift; int fx1 = x1 & poly_subpixel_mask; int fx2 = x2 & poly_subpixel_mask; int delta, p, first, dx; int incr, lift, mod, rem; //trivial case. Happens often if(y1 == y2) { set_curr_cell(ex2, ey); return; } //everything is located in a single cell. That is easy! if(ex1 == ex2) { delta = y2 - y1; m_curr_cell.cover += delta; m_curr_cell.area += (fx1 + fx2) * delta; return; } //ok, we'll have to render a run of adjacent cells on the same //hline... p = (poly_subpixel_scale - fx1) * (y2 - y1); first = poly_subpixel_scale; incr = 1; dx = x2 - x1; if(dx < 0) { p = fx1 * (y2 - y1); first = 0; incr = -1; dx = -dx; } delta = p / dx; mod = p % dx; if(mod < 0) { delta--; mod += dx; } m_curr_cell.cover += delta; m_curr_cell.area += (fx1 + first) * delta; ex1 += incr; set_curr_cell(ex1, ey); y1 += delta; if(ex1 != ex2) { p = poly_subpixel_scale * (y2 - y1 + delta); lift = p / dx; rem = p % dx; if (rem < 0) { lift--; rem += dx; } mod -= dx; while (ex1 != ex2) { delta = lift; mod += rem; if(mod >= 0) { mod -= dx; delta++; } m_curr_cell.cover += delta; m_curr_cell.area += poly_subpixel_scale * delta; y1 += delta; ex1 += incr; set_curr_cell(ex1, ey); } } delta = y2 - y1; m_curr_cell.cover += delta; m_curr_cell.area += (fx2 + poly_subpixel_scale - first) * delta; } //------------------------------------------------------------------------ template AGG_INLINE void rasterizer_cells_aa::style(const cell_type& style_cell) { m_style_cell.style(style_cell); } //------------------------------------------------------------------------ template void rasterizer_cells_aa::line(int x1, int y1, int x2, int y2) { enum dx_limit_e { dx_limit = 16384 << poly_subpixel_shift }; int dx = x2 - x1; if(dx >= dx_limit || dx <= -dx_limit) { int cx = (x1 + x2) >> 1; int cy = (y1 + y2) >> 1; line(x1, y1, cx, cy); line(cx, cy, x2, y2); } int dy = y2 - y1; int ex1 = x1 >> poly_subpixel_shift; int ex2 = x2 >> poly_subpixel_shift; int ey1 = y1 >> poly_subpixel_shift; int ey2 = y2 >> poly_subpixel_shift; int fy1 = y1 & poly_subpixel_mask; int fy2 = y2 & poly_subpixel_mask; int x_from, x_to; int p, rem, mod, lift, delta, first, incr; if(ex1 < m_min_x) m_min_x = ex1; if(ex1 > m_max_x) m_max_x = ex1; if(ey1 < m_min_y) m_min_y = ey1; if(ey1 > m_max_y) m_max_y = ey1; if(ex2 < m_min_x) m_min_x = ex2; if(ex2 > m_max_x) m_max_x = ex2; if(ey2 < m_min_y) m_min_y = ey2; if(ey2 > m_max_y) m_max_y = ey2; set_curr_cell(ex1, ey1); //everything is on a single hline if(ey1 == ey2) { render_hline(ey1, x1, fy1, x2, fy2); return; } //Vertical line - we have to calculate start and end cells, //and then - the common values of the area and coverage for //all cells of the line. We know exactly there's only one //cell, so, we don't have to call render_hline(). incr = 1; if(dx == 0) { int ex = x1 >> poly_subpixel_shift; int two_fx = (x1 - (ex << poly_subpixel_shift)) << 1; int area; first = poly_subpixel_scale; if(dy < 0) { first = 0; incr = -1; } x_from = x1; //render_hline(ey1, x_from, fy1, x_from, first); delta = first - fy1; m_curr_cell.cover += delta; m_curr_cell.area += two_fx * delta; ey1 += incr; set_curr_cell(ex, ey1); delta = first + first - poly_subpixel_scale; area = two_fx * delta; while(ey1 != ey2) { //render_hline(ey1, x_from, poly_subpixel_scale - first, x_from, first); m_curr_cell.cover = delta; m_curr_cell.area = area; ey1 += incr; set_curr_cell(ex, ey1); } //render_hline(ey1, x_from, poly_subpixel_scale - first, x_from, fy2); delta = fy2 - poly_subpixel_scale + first; m_curr_cell.cover += delta; m_curr_cell.area += two_fx * delta; return; } //ok, we have to render several hlines p = (poly_subpixel_scale - fy1) * dx; first = poly_subpixel_scale; if(dy < 0) { p = fy1 * dx; first = 0; incr = -1; dy = -dy; } delta = p / dy; mod = p % dy; if(mod < 0) { delta--; mod += dy; } x_from = x1 + delta; render_hline(ey1, x1, fy1, x_from, first); ey1 += incr; set_curr_cell(x_from >> poly_subpixel_shift, ey1); if(ey1 != ey2) { p = poly_subpixel_scale * dx; lift = p / dy; rem = p % dy; if(rem < 0) { lift--; rem += dy; } mod -= dy; while(ey1 != ey2) { delta = lift; mod += rem; if (mod >= 0) { mod -= dy; delta++; } x_to = x_from + delta; render_hline(ey1, x_from, poly_subpixel_scale - first, x_to, first); x_from = x_to; ey1 += incr; set_curr_cell(x_from >> poly_subpixel_shift, ey1); } } render_hline(ey1, x_from, poly_subpixel_scale - first, x2, fy2); } //------------------------------------------------------------------------ template void rasterizer_cells_aa::allocate_block() { if(m_curr_block >= m_num_blocks) { if(m_num_blocks >= m_max_blocks) { cell_type** new_cells = pod_allocator::allocate(m_max_blocks + cell_block_pool); if(m_cells) { memcpy(new_cells, m_cells, m_max_blocks * sizeof(cell_type*)); pod_allocator::deallocate(m_cells, m_max_blocks); } m_cells = new_cells; m_max_blocks += cell_block_pool; } m_cells[m_num_blocks++] = pod_allocator::allocate(cell_block_size); } m_curr_cell_ptr = m_cells[m_curr_block++]; } //------------------------------------------------------------------------ template static AGG_INLINE void swap_cells(T* a, T* b) { T temp = *a; *a = *b; *b = temp; } //------------------------------------------------------------------------ enum { qsort_threshold = 9 }; //------------------------------------------------------------------------ template void qsort_cells(Cell** start, unsigned num) { Cell** stack[80]; Cell*** top; Cell** limit; Cell** base; limit = start + num; base = start; top = stack; for (;;) { int len = int(limit - base); Cell** i; Cell** j; Cell** pivot; if(len > qsort_threshold) { // we use base + len/2 as the pivot pivot = base + len / 2; swap_cells(base, pivot); i = base + 1; j = limit - 1; // now ensure that *i <= *base <= *j if((*j)->x < (*i)->x) { swap_cells(i, j); } if((*base)->x < (*i)->x) { swap_cells(base, i); } if((*j)->x < (*base)->x) { swap_cells(base, j); } for(;;) { int x = (*base)->x; do i++; while( (*i)->x < x ); do j--; while( x < (*j)->x ); if(i > j) { break; } swap_cells(i, j); } swap_cells(base, j); // now, push the largest sub-array if(j - base > limit - i) { top[0] = base; top[1] = j; base = i; } else { top[0] = i; top[1] = limit; limit = j; } top += 2; } else { // the sub-array is small, perform insertion sort j = base; i = j + 1; for(; i < limit; j = i, i++) { for(; j[1]->x < (*j)->x; j--) { swap_cells(j + 1, j); if (j == base) { break; } } } if(top > stack) { top -= 2; base = top[0]; limit = top[1]; } else { break; } } } } //------------------------------------------------------------------------ template void rasterizer_cells_aa::sort_cells() { if(m_sorted) return; //Perform sort only the first time. add_curr_cell(); m_curr_cell.x = 0x7FFFFFFF; m_curr_cell.y = 0x7FFFFFFF; m_curr_cell.cover = 0; m_curr_cell.area = 0; if(m_num_cells == 0) return; // DBG: Check to see if min/max works well. //for(unsigned nc = 0; nc < m_num_cells; nc++) //{ // cell_type* cell = m_cells[nc >> cell_block_shift] + (nc & cell_block_mask); // if(cell->x < m_min_x || // cell->y < m_min_y || // cell->x > m_max_x || // cell->y > m_max_y) // { // cell = cell; // Breakpoint here // } //} // Allocate the array of cell pointers m_sorted_cells.allocate(m_num_cells, 16); // Allocate and zero the Y array m_sorted_y.allocate(m_max_y - m_min_y + 1, 16); m_sorted_y.zero(); // Create the Y-histogram (count the numbers of cells for each Y) cell_type** block_ptr = m_cells; cell_type* cell_ptr; unsigned nb = m_num_cells >> cell_block_shift; unsigned i; while(nb--) { cell_ptr = *block_ptr++; i = cell_block_size; while(i--) { m_sorted_y[cell_ptr->y - m_min_y].start++; ++cell_ptr; } } cell_ptr = *block_ptr++; i = m_num_cells & cell_block_mask; while(i--) { m_sorted_y[cell_ptr->y - m_min_y].start++; ++cell_ptr; } // Convert the Y-histogram into the array of starting indexes unsigned start = 0; for(i = 0; i < m_sorted_y.size(); i++) { unsigned v = m_sorted_y[i].start; m_sorted_y[i].start = start; start += v; } // Fill the cell pointer array sorted by Y block_ptr = m_cells; nb = m_num_cells >> cell_block_shift; while(nb--) { cell_ptr = *block_ptr++; i = cell_block_size; while(i--) { sorted_y& curr_y = m_sorted_y[cell_ptr->y - m_min_y]; m_sorted_cells[curr_y.start + curr_y.num] = cell_ptr; ++curr_y.num; ++cell_ptr; } } cell_ptr = *block_ptr++; i = m_num_cells & cell_block_mask; while(i--) { sorted_y& curr_y = m_sorted_y[cell_ptr->y - m_min_y]; m_sorted_cells[curr_y.start + curr_y.num] = cell_ptr; ++curr_y.num; ++cell_ptr; } // Finally arrange the X-arrays for(i = 0; i < m_sorted_y.size(); i++) { const sorted_y& curr_y = m_sorted_y[i]; if(curr_y.num) { qsort_cells(m_sorted_cells.data() + curr_y.start, curr_y.num); } } m_sorted = true; } //------------------------------------------------------scanline_hit_test class scanline_hit_test { public: scanline_hit_test(int x) : m_x(x), m_hit(false) {} void reset_spans() {} void finalize(int) {} void add_cell(int x, int) { if(m_x == x) m_hit = true; } void add_span(int x, int len, int) { if(m_x >= x && m_x < x+len) m_hit = true; } unsigned num_spans() const { return 1; } bool hit() const { return m_hit; } private: int m_x; bool m_hit; }; } #endif contextfree-3.0.5+dfsg1.orig/src-agg/include/agg_config.h0000644000175000017500000000236112076364074021645 0ustar brambram#ifndef AGG_CONFIG_INCLUDED #define AGG_CONFIG_INCLUDED // This file can be used to redefine certain data types. //--------------------------------------- // 1. Default basic types such as: // // AGG_INT8 // AGG_INT8U // AGG_INT16 // AGG_INT16U // AGG_INT32 // AGG_INT32U // AGG_INT64 // AGG_INT64U // // Just replace this file with new defines if necessary. // For example, if your compiler doesn't have a 64 bit integer type // you can still use AGG if you define the follows: // // #define AGG_INT64 int // #define AGG_INT64U unsigned // // It will result in overflow in 16 bit-per-component image/pattern resampling // but it won't result any crash and the rest of the library will remain // fully functional. //--------------------------------------- // 2. Default rendering_buffer type. Can be: // // Provides faster access for massive pixel operations, // such as blur, image filtering: // #define AGG_RENDERING_BUFFER row_ptr_cache // // Provides cheaper creation and destruction (no mem allocs): // #define AGG_RENDERING_BUFFER row_accessor // // You can still use both of them simultaneouslyin your applications // This #define is used only for default rendering_buffer type, // in short hand typedefs like pixfmt_rgba32. #endif contextfree-3.0.5+dfsg1.orig/src-agg/include/agg_math_stroke.h0000644000175000017500000004417112076364074022725 0ustar brambram//---------------------------------------------------------------------------- // Anti-Grain Geometry - Version 2.4 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) // // Permission to copy, use, modify, sell and distribute this software // is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // //---------------------------------------------------------------------------- // Contact: mcseem@antigrain.com // mcseemagg@yahoo.com // http://www.antigrain.com //---------------------------------------------------------------------------- // // Stroke math // //---------------------------------------------------------------------------- #ifndef AGG_STROKE_MATH_INCLUDED #define AGG_STROKE_MATH_INCLUDED #include "agg_math.h" #include "agg_vertex_sequence.h" namespace agg { //-------------------------------------------------------------line_cap_e enum line_cap_e { butt_cap, square_cap, round_cap }; //------------------------------------------------------------line_join_e enum line_join_e { miter_join = 0, miter_join_revert = 1, round_join = 2, bevel_join = 3, miter_join_round = 4 }; //-----------------------------------------------------------inner_join_e enum inner_join_e { inner_bevel, inner_miter, inner_jag, inner_round }; //------------------------------------------------------------math_stroke template class math_stroke { public: typedef typename VertexConsumer::value_type coord_type; math_stroke(); void line_cap(line_cap_e lc) { m_line_cap = lc; } void line_join(line_join_e lj) { m_line_join = lj; } void inner_join(inner_join_e ij) { m_inner_join = ij; } line_cap_e line_cap() const { return m_line_cap; } line_join_e line_join() const { return m_line_join; } inner_join_e inner_join() const { return m_inner_join; } void width(double w); void miter_limit(double ml) { m_miter_limit = ml; } void miter_limit_theta(double t); void inner_miter_limit(double ml) { m_inner_miter_limit = ml; } void approximation_scale(double as) { m_approx_scale = as; } double width() const { return m_width * 2.0; } double miter_limit() const { return m_miter_limit; } double inner_miter_limit() const { return m_inner_miter_limit; } double approximation_scale() const { return m_approx_scale; } void calc_cap(VertexConsumer& vc, const vertex_dist& v0, const vertex_dist& v1, double len); void calc_join(VertexConsumer& vc, const vertex_dist& v0, const vertex_dist& v1, const vertex_dist& v2, double len1, double len2); private: AGG_INLINE void add_vertex(VertexConsumer& vc, double x, double y) { vc.add(coord_type(x, y)); } void calc_arc(VertexConsumer& vc, double x, double y, double dx1, double dy1, double dx2, double dy2); void calc_miter(VertexConsumer& vc, const vertex_dist& v0, const vertex_dist& v1, const vertex_dist& v2, double dx1, double dy1, double dx2, double dy2, line_join_e lj, double mlimit, double dbevel); double m_width; double m_width_abs; double m_width_eps; int m_width_sign; double m_miter_limit; double m_inner_miter_limit; double m_approx_scale; line_cap_e m_line_cap; line_join_e m_line_join; inner_join_e m_inner_join; }; //----------------------------------------------------------------------- template math_stroke::math_stroke() : m_width(0.5), m_width_abs(0.5), m_width_eps(0.5/1024.0), m_width_sign(1), m_miter_limit(4.0), m_inner_miter_limit(1.01), m_approx_scale(1.0), m_line_cap(butt_cap), m_line_join(miter_join), m_inner_join(inner_miter) { } //----------------------------------------------------------------------- template void math_stroke::width(double w) { m_width = w * 0.5; if(m_width < 0) { m_width_abs = -m_width; m_width_sign = -1; } else { m_width_abs = m_width; m_width_sign = 1; } m_width_eps = m_width / 1024.0; } //----------------------------------------------------------------------- template void math_stroke::miter_limit_theta(double t) { m_miter_limit = 1.0 / sin(t * 0.5) ; } //----------------------------------------------------------------------- template void math_stroke::calc_arc(VC& vc, double x, double y, double dx1, double dy1, double dx2, double dy2) { double a1 = atan2(dy1 * m_width_sign, dx1 * m_width_sign); double a2 = atan2(dy2 * m_width_sign, dx2 * m_width_sign); double da = a1 - a2; int i, n; da = acos(m_width_abs / (m_width_abs + 0.125 / m_approx_scale)) * 2; add_vertex(vc, x + dx1, y + dy1); if(m_width_sign > 0) { if(a1 > a2) a2 += 2 * pi; n = int((a2 - a1) / da); da = (a2 - a1) / (n + 1); a1 += da; for(i = 0; i < n; i++) { add_vertex(vc, x + cos(a1) * m_width, y + sin(a1) * m_width); a1 += da; } } else { if(a1 < a2) a2 -= 2 * pi; n = int((a1 - a2) / da); da = (a1 - a2) / (n + 1); a1 -= da; for(i = 0; i < n; i++) { add_vertex(vc, x + cos(a1) * m_width, y + sin(a1) * m_width); a1 -= da; } } add_vertex(vc, x + dx2, y + dy2); } //----------------------------------------------------------------------- template void math_stroke::calc_miter(VC& vc, const vertex_dist& v0, const vertex_dist& v1, const vertex_dist& v2, double dx1, double dy1, double dx2, double dy2, line_join_e lj, double mlimit, double dbevel) { double xi = v1.x; double yi = v1.y; double di = 1; double lim = m_width_abs * mlimit; bool miter_limit_exceeded = true; // Assume the worst bool intersection_failed = true; // Assume the worst if(calc_intersection(v0.x + dx1, v0.y - dy1, v1.x + dx1, v1.y - dy1, v1.x + dx2, v1.y - dy2, v2.x + dx2, v2.y - dy2, &xi, &yi)) { // Calculation of the intersection succeeded //--------------------- di = calc_distance(v1.x, v1.y, xi, yi); if(di <= lim) { // Inside the miter limit //--------------------- add_vertex(vc, xi, yi); miter_limit_exceeded = false; } intersection_failed = false; } else { // Calculation of the intersection failed, most probably // the three points lie one straight line. // First check if v0 and v2 lie on the opposite sides of vector: // (v1.x, v1.y) -> (v1.x+dx1, v1.y-dy1), that is, the perpendicular // to the line determined by vertices v0 and v1. // This condition determines whether the next line segments continues // the previous one or goes back. //---------------- double x2 = v1.x + dx1; double y2 = v1.y - dy1; if((cross_product(v0.x, v0.y, v1.x, v1.y, x2, y2) < 0.0) == (cross_product(v1.x, v1.y, v2.x, v2.y, x2, y2) < 0.0)) { // This case means that the next segment continues // the previous one (straight line) //----------------- add_vertex(vc, v1.x + dx1, v1.y - dy1); miter_limit_exceeded = false; } } if(miter_limit_exceeded) { // Miter limit exceeded //------------------------ switch(lj) { case miter_join_revert: // For the compatibility with SVG, PDF, etc, // we use a simple bevel join instead of // "smart" bevel //------------------- add_vertex(vc, v1.x + dx1, v1.y - dy1); add_vertex(vc, v1.x + dx2, v1.y - dy2); break; case miter_join_round: calc_arc(vc, v1.x, v1.y, dx1, -dy1, dx2, -dy2); break; default: // If no miter-revert, calculate new dx1, dy1, dx2, dy2 //---------------- if(intersection_failed) { mlimit *= m_width_sign; add_vertex(vc, v1.x + dx1 + dy1 * mlimit, v1.y - dy1 + dx1 * mlimit); add_vertex(vc, v1.x + dx2 - dy2 * mlimit, v1.y - dy2 - dx2 * mlimit); } else { double x1 = v1.x + dx1; double y1 = v1.y - dy1; double x2 = v1.x + dx2; double y2 = v1.y - dy2; di = (lim - dbevel) / (di - dbevel); add_vertex(vc, x1 + (xi - x1) * di, y1 + (yi - y1) * di); add_vertex(vc, x2 + (xi - x2) * di, y2 + (yi - y2) * di); } break; } } } //--------------------------------------------------------stroke_calc_cap template void math_stroke::calc_cap(VC& vc, const vertex_dist& v0, const vertex_dist& v1, double len) { vc.remove_all(); double dx1 = (v1.y - v0.y) / len; double dy1 = (v1.x - v0.x) / len; double dx2 = 0; double dy2 = 0; dx1 *= m_width; dy1 *= m_width; if(m_line_cap != round_cap) { if(m_line_cap == square_cap) { dx2 = dy1 * m_width_sign; dy2 = dx1 * m_width_sign; } add_vertex(vc, v0.x - dx1 - dx2, v0.y + dy1 - dy2); add_vertex(vc, v0.x + dx1 - dx2, v0.y - dy1 - dy2); } else { double da = acos(m_width_abs / (m_width_abs + 0.125 / m_approx_scale)) * 2; double a1; int i; int n = int(pi / da); da = pi / (n + 1); add_vertex(vc, v0.x - dx1, v0.y + dy1); if(m_width_sign > 0) { a1 = atan2(dy1, -dx1); a1 += da; for(i = 0; i < n; i++) { add_vertex(vc, v0.x + cos(a1) * m_width, v0.y + sin(a1) * m_width); a1 += da; } } else { a1 = atan2(-dy1, dx1); a1 -= da; for(i = 0; i < n; i++) { add_vertex(vc, v0.x + cos(a1) * m_width, v0.y + sin(a1) * m_width); a1 -= da; } } add_vertex(vc, v0.x + dx1, v0.y - dy1); } } //----------------------------------------------------------------------- template void math_stroke::calc_join(VC& vc, const vertex_dist& v0, const vertex_dist& v1, const vertex_dist& v2, double len1, double len2) { double dx1 = m_width * (v1.y - v0.y) / len1; double dy1 = m_width * (v1.x - v0.x) / len1; double dx2 = m_width * (v2.y - v1.y) / len2; double dy2 = m_width * (v2.x - v1.x) / len2; vc.remove_all(); double cp = cross_product(v0.x, v0.y, v1.x, v1.y, v2.x, v2.y); if(cp != 0 && (cp > 0) == (m_width > 0)) { // Inner join //--------------- double limit = ((len1 < len2) ? len1 : len2) / m_width_abs; if(limit < m_inner_miter_limit) { limit = m_inner_miter_limit; } switch(m_inner_join) { default: // inner_bevel add_vertex(vc, v1.x + dx1, v1.y - dy1); add_vertex(vc, v1.x + dx2, v1.y - dy2); break; case inner_miter: calc_miter(vc, v0, v1, v2, dx1, dy1, dx2, dy2, miter_join_revert, limit, 0); break; case inner_jag: case inner_round: cp = (dx1-dx2) * (dx1-dx2) + (dy1-dy2) * (dy1-dy2); if(cp < len1 * len1 && cp < len2 * len2) { calc_miter(vc, v0, v1, v2, dx1, dy1, dx2, dy2, miter_join_revert, limit, 0); } else { if(m_inner_join == inner_jag) { add_vertex(vc, v1.x + dx1, v1.y - dy1); add_vertex(vc, v1.x, v1.y ); add_vertex(vc, v1.x + dx2, v1.y - dy2); } else { add_vertex(vc, v1.x + dx1, v1.y - dy1); add_vertex(vc, v1.x, v1.y ); calc_arc(vc, v1.x, v1.y, dx2, -dy2, dx1, -dy1); add_vertex(vc, v1.x, v1.y ); add_vertex(vc, v1.x + dx2, v1.y - dy2); } } break; } } else { // Outer join //--------------- // Calculate the distance between v1 and // the central point of the bevel line segment //--------------- double dx = (dx1 + dx2) / 2; double dy = (dy1 + dy2) / 2; double dbevel = sqrt(dx * dx + dy * dy); if(m_line_join == round_join || m_line_join == bevel_join) { // This is an optimization that reduces the number of points // in cases of almost collinear segments. If there's no // visible difference between bevel and miter joins we'd rather // use miter join because it adds only one point instead of two. // // Here we calculate the middle point between the bevel points // and then, the distance between v1 and this middle point. // At outer joins this distance always less than stroke width, // because it's actually the height of an isosceles triangle of // v1 and its two bevel points. If the difference between this // width and this value is small (no visible bevel) we can // add just one point. // // The constant in the expression makes the result approximately // the same as in round joins and caps. You can safely comment // out this entire "if". //------------------- if(m_approx_scale * (m_width_abs - dbevel) < m_width_eps) { if(calc_intersection(v0.x + dx1, v0.y - dy1, v1.x + dx1, v1.y - dy1, v1.x + dx2, v1.y - dy2, v2.x + dx2, v2.y - dy2, &dx, &dy)) { add_vertex(vc, dx, dy); } else { add_vertex(vc, v1.x + dx1, v1.y - dy1); } return; } } switch(m_line_join) { case miter_join: case miter_join_revert: case miter_join_round: calc_miter(vc, v0, v1, v2, dx1, dy1, dx2, dy2, m_line_join, m_miter_limit, dbevel); break; case round_join: calc_arc(vc, v1.x, v1.y, dx1, -dy1, dx2, -dy2); break; default: // Bevel join add_vertex(vc, v1.x + dx1, v1.y - dy1); add_vertex(vc, v1.x + dx2, v1.y - dy2); break; } } } } #endif contextfree-3.0.5+dfsg1.orig/src-agg/include/agg_array.h0000644000175000017500000010275712076364074021530 0ustar brambram//---------------------------------------------------------------------------- // Anti-Grain Geometry - Version 2.4 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) // // Permission to copy, use, modify, sell and distribute this software // is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // //---------------------------------------------------------------------------- // Contact: mcseem@antigrain.com // mcseemagg@yahoo.com // http://www.antigrain.com //---------------------------------------------------------------------------- #ifndef AGG_ARRAY_INCLUDED #define AGG_ARRAY_INCLUDED #include #include #include "agg_basics.h" namespace agg { //-------------------------------------------------------pod_array_adaptor template class pod_array_adaptor { public: typedef T value_type; pod_array_adaptor(T* array, unsigned size) : m_array(array), m_size(size) {} unsigned size() const { return m_size; } const T& operator [] (unsigned i) const { return m_array[i]; } T& operator [] (unsigned i) { return m_array[i]; } const T& at(unsigned i) const { return m_array[i]; } T& at(unsigned i) { return m_array[i]; } T value_at(unsigned i) const { return m_array[i]; } private: T* m_array; unsigned m_size; }; //---------------------------------------------------------pod_auto_array template class pod_auto_array { public: typedef T value_type; typedef pod_auto_array self_type; pod_auto_array() {} explicit pod_auto_array(const T* c) { memcpy(m_array, c, sizeof(T) * Size); } const self_type& operator = (const T* c) { memcpy(m_array, c, sizeof(T) * Size); return *this; } static unsigned size() { return Size; } const T& operator [] (unsigned i) const { return m_array[i]; } T& operator [] (unsigned i) { return m_array[i]; } const T& at(unsigned i) const { return m_array[i]; } T& at(unsigned i) { return m_array[i]; } T value_at(unsigned i) const { return m_array[i]; } private: T m_array[Size]; }; //--------------------------------------------------------pod_auto_vector template class pod_auto_vector { public: typedef T value_type; typedef pod_auto_vector self_type; pod_auto_vector() : m_size(0) {} void remove_all() { m_size = 0; } void clear() { m_size = 0; } void add(const T& v) { m_array[m_size++] = v; } void push_back(const T& v) { m_array[m_size++] = v; } void inc_size(unsigned size) { m_size += size; } unsigned size() const { return m_size; } const T& operator [] (unsigned i) const { return m_array[i]; } T& operator [] (unsigned i) { return m_array[i]; } const T& at(unsigned i) const { return m_array[i]; } T& at(unsigned i) { return m_array[i]; } T value_at(unsigned i) const { return m_array[i]; } private: T m_array[Size]; unsigned m_size; }; //---------------------------------------------------------------pod_array template class pod_array { public: typedef T value_type; typedef pod_array self_type; ~pod_array() { pod_allocator::deallocate(m_array, m_size); } pod_array() : m_array(0), m_size(0) {} pod_array(unsigned size) : m_array(pod_allocator::allocate(size)), m_size(size) {} pod_array(const self_type& v) : m_array(pod_allocator::allocate(v.m_size)), m_size(v.m_size) { memcpy(m_array, v.m_array, sizeof(T) * m_size); } void resize(unsigned size) { if(size != m_size) { pod_allocator::deallocate(m_array, m_size); m_array = pod_allocator::allocate(m_size = size); } } const self_type& operator = (const self_type& v) { resize(v.size()); memcpy(m_array, v.m_array, sizeof(T) * m_size); return *this; } unsigned size() const { return m_size; } const T& operator [] (unsigned i) const { return m_array[i]; } T& operator [] (unsigned i) { return m_array[i]; } const T& at(unsigned i) const { return m_array[i]; } T& at(unsigned i) { return m_array[i]; } T value_at(unsigned i) const { return m_array[i]; } const T* data() const { return m_array; } T* data() { return m_array; } private: T* m_array; unsigned m_size; }; //--------------------------------------------------------------pod_vector // A simple class template to store Plain Old Data, a vector // of a fixed size. The data is continous in memory //------------------------------------------------------------------------ template class pod_vector { public: typedef T value_type; ~pod_vector() { pod_allocator::deallocate(m_array, m_capacity); } pod_vector() : m_size(0), m_capacity(0), m_array(0) {} pod_vector(unsigned cap, unsigned extra_tail=0); // Copying pod_vector(const pod_vector&); const pod_vector& operator = (const pod_vector&); // Set new capacity. All data is lost, size is set to zero. void capacity(unsigned cap, unsigned extra_tail=0); unsigned capacity() const { return m_capacity; } // Allocate n elements. All data is lost, // but elements can be accessed in range 0...size-1. void allocate(unsigned size, unsigned extra_tail=0); // Resize keeping the content. void resize(unsigned new_size); void zero() { memset(m_array, 0, sizeof(T) * m_size); } void add(const T& v) { m_array[m_size++] = v; } void push_back(const T& v) { m_array[m_size++] = v; } void insert_at(unsigned pos, const T& val); void inc_size(unsigned size) { m_size += size; } unsigned size() const { return m_size; } unsigned byte_size() const { return m_size * sizeof(T); } void serialize(int8u* ptr) const; void deserialize(const int8u* data, unsigned byte_size); const T& operator [] (unsigned i) const { return m_array[i]; } T& operator [] (unsigned i) { return m_array[i]; } const T& at(unsigned i) const { return m_array[i]; } T& at(unsigned i) { return m_array[i]; } T value_at(unsigned i) const { return m_array[i]; } const T* data() const { return m_array; } T* data() { return m_array; } void remove_all() { m_size = 0; } void clear() { m_size = 0; } void cut_at(unsigned num) { if(num < m_size) m_size = num; } private: unsigned m_size; unsigned m_capacity; T* m_array; }; //------------------------------------------------------------------------ template void pod_vector::capacity(unsigned cap, unsigned extra_tail) { m_size = 0; if(cap > m_capacity) { pod_allocator::deallocate(m_array, m_capacity); m_capacity = cap + extra_tail; m_array = m_capacity ? pod_allocator::allocate(m_capacity) : 0; } } //------------------------------------------------------------------------ template void pod_vector::allocate(unsigned size, unsigned extra_tail) { capacity(size, extra_tail); m_size = size; } //------------------------------------------------------------------------ template void pod_vector::resize(unsigned new_size) { if(new_size > m_size) { if(new_size > m_capacity) { T* data = pod_allocator::allocate(new_size); memcpy(data, m_array, m_size * sizeof(T)); pod_allocator::deallocate(m_array, m_capacity); m_array = data; } } else { m_size = new_size; } } //------------------------------------------------------------------------ template pod_vector::pod_vector(unsigned cap, unsigned extra_tail) : m_size(0), m_capacity(cap + extra_tail), m_array(pod_allocator::allocate(m_capacity)) {} //------------------------------------------------------------------------ template pod_vector::pod_vector(const pod_vector& v) : m_size(v.m_size), m_capacity(v.m_capacity), m_array(v.m_capacity ? pod_allocator::allocate(v.m_capacity) : 0) { memcpy(m_array, v.m_array, sizeof(T) * v.m_size); } //------------------------------------------------------------------------ template const pod_vector& pod_vector::operator = (const pod_vector&v) { allocate(v.m_size); if(v.m_size) memcpy(m_array, v.m_array, sizeof(T) * v.m_size); return *this; } //------------------------------------------------------------------------ template void pod_vector::serialize(int8u* ptr) const { if(m_size) memcpy(ptr, m_array, m_size * sizeof(T)); } //------------------------------------------------------------------------ template void pod_vector::deserialize(const int8u* data, unsigned byte_size) { byte_size /= sizeof(T); allocate(byte_size); if(byte_size) memcpy(m_array, data, byte_size * sizeof(T)); } //------------------------------------------------------------------------ template void pod_vector::insert_at(unsigned pos, const T& val) { if(pos >= m_size) { m_array[m_size] = val; } else { memmove(m_array + pos + 1, m_array + pos, (m_size - pos) * sizeof(T)); m_array[pos] = val; } ++m_size; } //---------------------------------------------------------------pod_bvector // A simple class template to store Plain Old Data, similar to std::deque // It doesn't reallocate memory but instead, uses blocks of data of size // of (1 << S), that is, power of two. The data is NOT contiguous in memory, // so the only valid access method is operator [] or curr(), prev(), next() // // There reallocs occure only when the pool of pointers to blocks needs // to be extended (it happens very rarely). You can control the value // of increment to reallocate the pointer buffer. See the second constructor. // By default, the incremeent value equals (1 << S), i.e., the block size. //------------------------------------------------------------------------ template class pod_bvector { public: enum block_scale_e { block_shift = S, block_size = 1 << block_shift, block_mask = block_size - 1 }; typedef T value_type; ~pod_bvector(); pod_bvector(); pod_bvector(unsigned block_ptr_inc); // Copying pod_bvector(const pod_bvector& v); const pod_bvector& operator = (const pod_bvector& v); void remove_all() { m_size = 0; } void clear() { m_size = 0; } void free_all() { free_tail(0); } void free_tail(unsigned size); void add(const T& val); void push_back(const T& val) { add(val); } void modify_last(const T& val); void remove_last(); int allocate_continuous_block(unsigned num_elements); void add_array(const T* ptr, unsigned num_elem) { while(num_elem--) { add(*ptr++); } } template void add_data(DataAccessor& data) { while(data.size()) { add(*data); ++data; } } void cut_at(unsigned size) { if(size < m_size) m_size = size; } unsigned size() const { return m_size; } const T& operator [] (unsigned i) const { return m_blocks[i >> block_shift][i & block_mask]; } T& operator [] (unsigned i) { return m_blocks[i >> block_shift][i & block_mask]; } const T& at(unsigned i) const { return m_blocks[i >> block_shift][i & block_mask]; } T& at(unsigned i) { return m_blocks[i >> block_shift][i & block_mask]; } T value_at(unsigned i) const { return m_blocks[i >> block_shift][i & block_mask]; } const T& curr(unsigned idx) const { return (*this)[idx]; } T& curr(unsigned idx) { return (*this)[idx]; } const T& prev(unsigned idx) const { return (*this)[(idx + m_size - 1) % m_size]; } T& prev(unsigned idx) { return (*this)[(idx + m_size - 1) % m_size]; } const T& next(unsigned idx) const { return (*this)[(idx + 1) % m_size]; } T& next(unsigned idx) { return (*this)[(idx + 1) % m_size]; } const T& last() const { return (*this)[m_size - 1]; } T& last() { return (*this)[m_size - 1]; } unsigned byte_size() const; void serialize(int8u* ptr) const; void deserialize(const int8u* data, unsigned byte_size); void deserialize(unsigned start, const T& empty_val, const int8u* data, unsigned byte_size); template void deserialize(ByteAccessor data) { remove_all(); unsigned elem_size = data.size() / sizeof(T); for(unsigned i = 0; i < elem_size; ++i) { int8u* ptr = (int8u*)data_ptr(); for(unsigned j = 0; j < sizeof(T); ++j) { *ptr++ = *data; ++data; } ++m_size; } } template void deserialize(unsigned start, const T& empty_val, ByteAccessor data) { while(m_size < start) { add(empty_val); } unsigned elem_size = data.size() / sizeof(T); for(unsigned i = 0; i < elem_size; ++i) { int8u* ptr; if(start + i < m_size) { ptr = (int8u*)(&((*this)[start + i])); } else { ptr = (int8u*)data_ptr(); ++m_size; } for(unsigned j = 0; j < sizeof(T); ++j) { *ptr++ = *data; ++data; } } } const T* block(unsigned nb) const { return m_blocks[nb]; } private: void allocate_block(unsigned nb); T* data_ptr(); unsigned m_size; unsigned m_num_blocks; unsigned m_max_blocks; T** m_blocks; unsigned m_block_ptr_inc; }; //------------------------------------------------------------------------ template pod_bvector::~pod_bvector() { if(m_num_blocks) { T** blk = m_blocks + m_num_blocks - 1; while(m_num_blocks--) { pod_allocator::deallocate(*blk, block_size); --blk; } } pod_allocator::deallocate(m_blocks, m_max_blocks); } //------------------------------------------------------------------------ template void pod_bvector::free_tail(unsigned size) { if(size < m_size) { unsigned nb = (size + block_mask) >> block_shift; while(m_num_blocks > nb) { pod_allocator::deallocate(m_blocks[--m_num_blocks], block_size); } if(m_num_blocks == 0) { pod_allocator::deallocate(m_blocks, m_max_blocks); m_blocks = 0; m_max_blocks = 0; } m_size = size; } } //------------------------------------------------------------------------ template pod_bvector::pod_bvector() : m_size(0), m_num_blocks(0), m_max_blocks(0), m_blocks(0), m_block_ptr_inc(block_size) { } //------------------------------------------------------------------------ template pod_bvector::pod_bvector(unsigned block_ptr_inc) : m_size(0), m_num_blocks(0), m_max_blocks(0), m_blocks(0), m_block_ptr_inc(block_ptr_inc) { } //------------------------------------------------------------------------ template pod_bvector::pod_bvector(const pod_bvector& v) : m_size(v.m_size), m_num_blocks(v.m_num_blocks), m_max_blocks(v.m_max_blocks), m_blocks(v.m_max_blocks ? pod_allocator::allocate(v.m_max_blocks) : 0), m_block_ptr_inc(v.m_block_ptr_inc) { unsigned i; for(i = 0; i < v.m_num_blocks; ++i) { m_blocks[i] = pod_allocator::allocate(block_size); memcpy(m_blocks[i], v.m_blocks[i], block_size * sizeof(T)); } } //------------------------------------------------------------------------ template const pod_bvector& pod_bvector::operator = (const pod_bvector& v) { unsigned i; for(i = m_num_blocks; i < v.m_num_blocks; ++i) { allocate_block(i); } for(i = 0; i < v.m_num_blocks; ++i) { memcpy(m_blocks[i], v.m_blocks[i], block_size * sizeof(T)); } m_size = v.m_size; return *this; } //------------------------------------------------------------------------ template void pod_bvector::allocate_block(unsigned nb) { if(nb >= m_max_blocks) { T** new_blocks = pod_allocator::allocate(m_max_blocks + m_block_ptr_inc); if(m_blocks) { memcpy(new_blocks, m_blocks, m_num_blocks * sizeof(T*)); pod_allocator::deallocate(m_blocks, m_max_blocks); } m_blocks = new_blocks; m_max_blocks += m_block_ptr_inc; } m_blocks[nb] = pod_allocator::allocate(block_size); m_num_blocks++; } //------------------------------------------------------------------------ template inline T* pod_bvector::data_ptr() { unsigned nb = m_size >> block_shift; if(nb >= m_num_blocks) { allocate_block(nb); } return m_blocks[nb] + (m_size & block_mask); } //------------------------------------------------------------------------ template inline void pod_bvector::add(const T& val) { *data_ptr() = val; ++m_size; } //------------------------------------------------------------------------ template inline void pod_bvector::remove_last() { if(m_size) --m_size; } //------------------------------------------------------------------------ template void pod_bvector::modify_last(const T& val) { remove_last(); add(val); } //------------------------------------------------------------------------ template int pod_bvector::allocate_continuous_block(unsigned num_elements) { if(num_elements < block_size) { data_ptr(); // Allocate initial block if necessary unsigned rest = block_size - (m_size & block_mask); unsigned index; if(num_elements <= rest) { // The rest of the block is good, we can use it //----------------- index = m_size; m_size += num_elements; return index; } // New block //--------------- m_size += rest; data_ptr(); index = m_size; m_size += num_elements; return index; } return -1; // Impossible to allocate } //------------------------------------------------------------------------ template unsigned pod_bvector::byte_size() const { return m_size * sizeof(T); } //------------------------------------------------------------------------ template void pod_bvector::serialize(int8u* ptr) const { unsigned i; for(i = 0; i < m_size; i++) { memcpy(ptr, &(*this)[i], sizeof(T)); ptr += sizeof(T); } } //------------------------------------------------------------------------ template void pod_bvector::deserialize(const int8u* data, unsigned byte_size) { remove_all(); byte_size /= sizeof(T); for(unsigned i = 0; i < byte_size; ++i) { T* ptr = data_ptr(); memcpy(ptr, data, sizeof(T)); ++m_size; data += sizeof(T); } } // Replace or add a number of elements starting from "start" position //------------------------------------------------------------------------ template void pod_bvector::deserialize(unsigned start, const T& empty_val, const int8u* data, unsigned byte_size) { while(m_size < start) { add(empty_val); } byte_size /= sizeof(T); for(unsigned i = 0; i < byte_size; ++i) { if(start + i < m_size) { memcpy(&((*this)[start + i]), data, sizeof(T)); } else { T* ptr = data_ptr(); memcpy(ptr, data, sizeof(T)); ++m_size; } data += sizeof(T); } } //---------------------------------------------------------block_allocator // Allocator for arbitrary POD data. Most usable in different cache // systems for efficient memory allocations. // Memory is allocated with blocks of fixed size ("block_size" in // the constructor). If required size exceeds the block size the allocator // creates a new block of the required size. However, the most efficient // use is when the average reqired size is much less than the block size. //------------------------------------------------------------------------ class block_allocator { struct block_type { int8u* data; unsigned size; }; public: void remove_all() { if(m_num_blocks) { block_type* blk = m_blocks + m_num_blocks - 1; while(m_num_blocks--) { pod_allocator::deallocate(blk->data, blk->size); --blk; } pod_allocator::deallocate(m_blocks, m_max_blocks); } m_num_blocks = 0; m_max_blocks = 0; m_blocks = 0; m_buf_ptr = 0; m_rest = 0; } ~block_allocator() { remove_all(); } block_allocator(unsigned block_size, unsigned block_ptr_inc=256-8) : m_block_size(block_size), m_block_ptr_inc(block_ptr_inc), m_num_blocks(0), m_max_blocks(0), m_blocks(0), m_buf_ptr(0), m_rest(0) { } int8u* allocate(unsigned size, unsigned alignment=1) { if(size == 0) return 0; if(size <= m_rest) { int8u* ptr = m_buf_ptr; if(alignment > 1) { unsigned align = (alignment - unsigned((size_t)ptr) % alignment) % alignment; size += align; ptr += align; if(size <= m_rest) { m_rest -= size; m_buf_ptr += size; return ptr; } allocate_block(size); return allocate(size - align, alignment); } m_rest -= size; m_buf_ptr += size; return ptr; } allocate_block(size + alignment - 1); return allocate(size, alignment); } private: void allocate_block(unsigned size) { if(size < m_block_size) size = m_block_size; if(m_num_blocks >= m_max_blocks) { block_type* new_blocks = pod_allocator::allocate(m_max_blocks + m_block_ptr_inc); if(m_blocks) { memcpy(new_blocks, m_blocks, m_num_blocks * sizeof(block_type)); pod_allocator::deallocate(m_blocks, m_max_blocks); } m_blocks = new_blocks; m_max_blocks += m_block_ptr_inc; } m_blocks[m_num_blocks].size = size; m_blocks[m_num_blocks].data = m_buf_ptr = pod_allocator::allocate(size); m_num_blocks++; m_rest = size; } unsigned m_block_size; unsigned m_block_ptr_inc; unsigned m_num_blocks; unsigned m_max_blocks; block_type* m_blocks; int8u* m_buf_ptr; unsigned m_rest; }; //------------------------------------------------------------------------ enum quick_sort_threshold_e { quick_sort_threshold = 9 }; //-----------------------------------------------------------swap_elements template inline void swap_elements(T& a, T& b) { T temp = a; a = b; b = temp; } //--------------------------------------------------------------quick_sort template void quick_sort(Array& arr, Less less) { if(arr.size() < 2) return; typename Array::value_type* e1; typename Array::value_type* e2; int stack[80]; int* top = stack; int limit = arr.size(); int base = 0; for(;;) { int len = limit - base; int i; int j; int pivot; if(len > quick_sort_threshold) { // we use base + len/2 as the pivot pivot = base + len / 2; swap_elements(arr[base], arr[pivot]); i = base + 1; j = limit - 1; // now ensure that *i <= *base <= *j e1 = &(arr[j]); e2 = &(arr[i]); if(less(*e1, *e2)) swap_elements(*e1, *e2); e1 = &(arr[base]); e2 = &(arr[i]); if(less(*e1, *e2)) swap_elements(*e1, *e2); e1 = &(arr[j]); e2 = &(arr[base]); if(less(*e1, *e2)) swap_elements(*e1, *e2); for(;;) { do i++; while( less(arr[i], arr[base]) ); do j--; while( less(arr[base], arr[j]) ); if( i > j ) { break; } swap_elements(arr[i], arr[j]); } swap_elements(arr[base], arr[j]); // now, push the largest sub-array if(j - base > limit - i) { top[0] = base; top[1] = j; base = i; } else { top[0] = i; top[1] = limit; limit = j; } top += 2; } else { // the sub-array is small, perform insertion sort j = base; i = j + 1; for(; i < limit; j = i, i++) { for(; less(*(e1 = &(arr[j + 1])), *(e2 = &(arr[j]))); j--) { swap_elements(*e1, *e2); if(j == base) { break; } } } if(top > stack) { top -= 2; base = top[0]; limit = top[1]; } else { break; } } } } //------------------------------------------------------remove_duplicates // Remove duplicates from a sorted array. It doesn't cut the // tail of the array, it just returns the number of remaining elements. //----------------------------------------------------------------------- template unsigned remove_duplicates(Array& arr, Equal equal) { if(arr.size() < 2) return arr.size(); unsigned i, j; for(i = 1, j = 1; i < arr.size(); i++) { typename Array::value_type& e = arr[i]; if(!equal(e, arr[i - 1])) { arr[j++] = e; } } return j; } //--------------------------------------------------------invert_container template void invert_container(Array& arr) { int i = 0; int j = arr.size() - 1; while(i < j) { swap_elements(arr[i++], arr[j--]); } } //------------------------------------------------------binary_search_pos template unsigned binary_search_pos(const Array& arr, const Value& val, Less less) { if(arr.size() == 0) return 0; unsigned beg = 0; unsigned end = arr.size() - 1; if(less(val, arr[0])) return 0; if(less(arr[end], val)) return end + 1; while(end - beg > 1) { unsigned mid = (end + beg) >> 1; if(less(val, arr[mid])) end = mid; else beg = mid; } //if(beg <= 0 && less(val, arr[0])) return 0; //if(end >= arr.size() - 1 && less(arr[end], val)) ++end; return end; } //----------------------------------------------------------range_adaptor template class range_adaptor { public: typedef typename Array::value_type value_type; range_adaptor(Array& array, unsigned start, unsigned size) : m_array(array), m_start(start), m_size(size) {} unsigned size() const { return m_size; } const value_type& operator [] (unsigned i) const { return m_array[m_start + i]; } value_type& operator [] (unsigned i) { return m_array[m_start + i]; } const value_type& at(unsigned i) const { return m_array[m_start + i]; } value_type& at(unsigned i) { return m_array[m_start + i]; } value_type value_at(unsigned i) const { return m_array[m_start + i]; } private: Array& m_array; unsigned m_start; unsigned m_size; }; //---------------------------------------------------------------int_less inline bool int_less(int a, int b) { return a < b; } //------------------------------------------------------------int_greater inline bool int_greater(int a, int b) { return a > b; } //----------------------------------------------------------unsigned_less inline bool unsigned_less(unsigned a, unsigned b) { return a < b; } //-------------------------------------------------------unsigned_greater inline bool unsigned_greater(unsigned a, unsigned b) { return a > b; } } #endif contextfree-3.0.5+dfsg1.orig/src-agg/include/agg_rasterizer_scanline_aa.h0000644000175000017500000004133312076364074025111 0ustar brambram//---------------------------------------------------------------------------- // Anti-Grain Geometry - Version 2.4 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) // // Permission to copy, use, modify, sell and distribute this software // is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // //---------------------------------------------------------------------------- // // The author gratefully acknowleges the support of David Turner, // Robert Wilhelm, and Werner Lemberg - the authors of the FreeType // libray - in producing this work. See http://www.freetype.org for details. // //---------------------------------------------------------------------------- // Contact: mcseem@antigrain.com // mcseemagg@yahoo.com // http://www.antigrain.com //---------------------------------------------------------------------------- // // Adaptation for 32-bit screen coordinates has been sponsored by // Liberty Technology Systems, Inc., visit http://lib-sys.com // // Liberty Technology Systems, Inc. is the provider of // PostScript and PDF technology for software developers. // //---------------------------------------------------------------------------- #ifndef AGG_RASTERIZER_SCANLINE_AA_INCLUDED #define AGG_RASTERIZER_SCANLINE_AA_INCLUDED #include "agg_rasterizer_cells_aa.h" #include "agg_rasterizer_sl_clip.h" #include "agg_gamma_functions.h" namespace agg { //-----------------------------------------------------------------cell_aa // A pixel cell. There're no constructors defined and it was done // intentionally in order to avoid extra overhead when allocating an // array of cells. struct cell_aa { int x; int y; int cover; int area; void initial() { x = 0x7FFFFFFF; y = 0x7FFFFFFF; cover = 0; area = 0; } void style(const cell_aa&) {} int not_equal(int ex, int ey, const cell_aa&) const { return (ex - x) | (ey - y); } }; //==================================================rasterizer_scanline_aa // Polygon rasterizer that is used to render filled polygons with // high-quality Anti-Aliasing. Internally, by default, the class uses // integer coordinates in format 24.8, i.e. 24 bits for integer part // and 8 bits for fractional - see poly_subpixel_shift. This class can be // used in the following way: // // 1. filling_rule(filling_rule_e ft) - optional. // // 2. gamma() - optional. // // 3. reset() // // 4. move_to(x, y) / line_to(x, y) - make the polygon. One can create // more than one contour, but each contour must consist of at least 3 // vertices, i.e. move_to(x1, y1); line_to(x2, y2); line_to(x3, y3); // is the absolute minimum of vertices that define a triangle. // The algorithm does not check either the number of vertices nor // coincidence of their coordinates, but in the worst case it just // won't draw anything. // The orger of the vertices (clockwise or counterclockwise) // is important when using the non-zero filling rule (fill_non_zero). // In this case the vertex order of all the contours must be the same // if you want your intersecting polygons to be without "holes". // You actually can use different vertices order. If the contours do not // intersect each other the order is not important anyway. If they do, // contours with the same vertex order will be rendered without "holes" // while the intersecting contours with different orders will have "holes". // // filling_rule() and gamma() can be called anytime before "sweeping". //------------------------------------------------------------------------ template class rasterizer_scanline_aa { enum status { status_initial, status_move_to, status_line_to, status_closed }; public: typedef Clip clip_type; typedef typename Clip::conv_type conv_type; typedef typename Clip::coord_type coord_type; enum aa_scale_e { aa_shift = 8, aa_scale = 1 << aa_shift, aa_mask = aa_scale - 1, aa_scale2 = aa_scale * 2, aa_mask2 = aa_scale2 - 1 }; //-------------------------------------------------------------------- rasterizer_scanline_aa() : m_outline(), m_clipper(), m_filling_rule(fill_non_zero), m_auto_close(true), m_start_x(0), m_start_y(0), m_status(status_initial) { int i; for(i = 0; i < aa_scale; i++) m_gamma[i] = i; } //-------------------------------------------------------------------- template rasterizer_scanline_aa(const GammaF& gamma_function) : m_outline(), m_clipper(m_outline), m_filling_rule(fill_non_zero), m_auto_close(true), m_start_x(0), m_start_y(0), m_status(status_initial) { gamma(gamma_function); } //-------------------------------------------------------------------- void reset(); void reset_clipping(); void clip_box(double x1, double y1, double x2, double y2); void filling_rule(filling_rule_e filling_rule); void auto_close(bool flag) { m_auto_close = flag; } //-------------------------------------------------------------------- template void gamma(const GammaF& gamma_function) { int i; for(i = 0; i < aa_scale; i++) { m_gamma[i] = uround(gamma_function(double(i) / aa_mask) * aa_mask); } } //-------------------------------------------------------------------- unsigned apply_gamma(unsigned cover) const { return m_gamma[cover]; } //-------------------------------------------------------------------- void move_to(int x, int y); void line_to(int x, int y); void move_to_d(double x, double y); void line_to_d(double x, double y); void close_polygon(); void add_vertex(double x, double y, unsigned cmd); void edge(int x1, int y1, int x2, int y2); void edge_d(double x1, double y1, double x2, double y2); //------------------------------------------------------------------- template void add_path(VertexSource& vs, unsigned path_id=0) { double x; double y; unsigned cmd; vs.rewind(path_id); if(m_outline.sorted()) reset(); while(!is_stop(cmd = vs.vertex(&x, &y))) { add_vertex(x, y, cmd); } } //-------------------------------------------------------------------- int min_x() const { return m_outline.min_x(); } int min_y() const { return m_outline.min_y(); } int max_x() const { return m_outline.max_x(); } int max_y() const { return m_outline.max_y(); } //-------------------------------------------------------------------- void sort(); bool rewind_scanlines(); bool navigate_scanline(int y); //-------------------------------------------------------------------- AGG_INLINE unsigned calculate_alpha(int area) const { int cover = area >> (poly_subpixel_shift*2 + 1 - aa_shift); if(cover < 0) cover = -cover; if(m_filling_rule == fill_even_odd) { cover &= aa_mask2; if(cover > aa_scale) { cover = aa_scale2 - cover; } } if(cover > aa_mask) cover = aa_mask; return m_gamma[cover]; } //-------------------------------------------------------------------- template bool sweep_scanline(Scanline& sl) { for(;;) { if(m_scan_y > m_outline.max_y()) return false; sl.reset_spans(); unsigned num_cells = m_outline.scanline_num_cells(m_scan_y); const cell_aa* const* cells = m_outline.scanline_cells(m_scan_y); int cover = 0; while(num_cells) { const cell_aa* cur_cell = *cells; int x = cur_cell->x; int area = cur_cell->area; unsigned alpha; cover += cur_cell->cover; //accumulate all cells with the same X while(--num_cells) { cur_cell = *++cells; if(cur_cell->x != x) break; area += cur_cell->area; cover += cur_cell->cover; } if(area) { alpha = calculate_alpha((cover << (poly_subpixel_shift + 1)) - area); if(alpha) { sl.add_cell(x, alpha); } x++; } if(num_cells && cur_cell->x > x) { alpha = calculate_alpha(cover << (poly_subpixel_shift + 1)); if(alpha) { sl.add_span(x, cur_cell->x - x, alpha); } } } if(sl.num_spans()) break; ++m_scan_y; } sl.finalize(m_scan_y); ++m_scan_y; return true; } //-------------------------------------------------------------------- bool hit_test(int tx, int ty); private: //-------------------------------------------------------------------- // Disable copying rasterizer_scanline_aa(const rasterizer_scanline_aa&); const rasterizer_scanline_aa& operator = (const rasterizer_scanline_aa&); private: rasterizer_cells_aa m_outline; clip_type m_clipper; int m_gamma[aa_scale]; filling_rule_e m_filling_rule; bool m_auto_close; coord_type m_start_x; coord_type m_start_y; unsigned m_status; int m_scan_y; }; //------------------------------------------------------------------------ template void rasterizer_scanline_aa::reset() { m_outline.reset(); m_status = status_initial; } //------------------------------------------------------------------------ template void rasterizer_scanline_aa::filling_rule(filling_rule_e filling_rule) { m_filling_rule = filling_rule; } //------------------------------------------------------------------------ template void rasterizer_scanline_aa::clip_box(double x1, double y1, double x2, double y2) { reset(); m_clipper.clip_box(conv_type::upscale(x1), conv_type::upscale(y1), conv_type::upscale(x2), conv_type::upscale(y2)); } //------------------------------------------------------------------------ template void rasterizer_scanline_aa::reset_clipping() { reset(); m_clipper.reset_clipping(); } //------------------------------------------------------------------------ template void rasterizer_scanline_aa::close_polygon() { if(m_status == status_line_to) { m_clipper.line_to(m_outline, m_start_x, m_start_y); m_status = status_closed; } } //------------------------------------------------------------------------ template void rasterizer_scanline_aa::move_to(int x, int y) { if(m_outline.sorted()) reset(); if(m_auto_close) close_polygon(); m_clipper.move_to(m_start_x = conv_type::downscale(x), m_start_y = conv_type::downscale(y)); m_status = status_move_to; } //------------------------------------------------------------------------ template void rasterizer_scanline_aa::line_to(int x, int y) { m_clipper.line_to(m_outline, conv_type::downscale(x), conv_type::downscale(y)); m_status = status_line_to; } //------------------------------------------------------------------------ template void rasterizer_scanline_aa::move_to_d(double x, double y) { if(m_outline.sorted()) reset(); if(m_auto_close) close_polygon(); m_clipper.move_to(m_start_x = conv_type::upscale(x), m_start_y = conv_type::upscale(y)); m_status = status_move_to; } //------------------------------------------------------------------------ template void rasterizer_scanline_aa::line_to_d(double x, double y) { m_clipper.line_to(m_outline, conv_type::upscale(x), conv_type::upscale(y)); m_status = status_line_to; } //------------------------------------------------------------------------ template void rasterizer_scanline_aa::add_vertex(double x, double y, unsigned cmd) { if(is_move_to(cmd)) { move_to_d(x, y); } else if(is_vertex(cmd)) { line_to_d(x, y); } else if(is_close(cmd)) { close_polygon(); } } //------------------------------------------------------------------------ template void rasterizer_scanline_aa::edge(int x1, int y1, int x2, int y2) { if(m_outline.sorted()) reset(); m_clipper.move_to(conv_type::downscale(x1), conv_type::downscale(y1)); m_clipper.line_to(m_outline, conv_type::downscale(x2), conv_type::downscale(y2)); m_status = status_move_to; } //------------------------------------------------------------------------ template void rasterizer_scanline_aa::edge_d(double x1, double y1, double x2, double y2) { if(m_outline.sorted()) reset(); m_clipper.move_to(conv_type::upscale(x1), conv_type::upscale(y1)); m_clipper.line_to(m_outline, conv_type::upscale(x2), conv_type::upscale(y2)); m_status = status_move_to; } //------------------------------------------------------------------------ template void rasterizer_scanline_aa::sort() { if(m_auto_close) close_polygon(); m_outline.sort_cells(); } //------------------------------------------------------------------------ template AGG_INLINE bool rasterizer_scanline_aa::rewind_scanlines() { if(m_auto_close) close_polygon(); m_outline.sort_cells(); if(m_outline.total_cells() == 0) { return false; } m_scan_y = m_outline.min_y(); return true; } //------------------------------------------------------------------------ template AGG_INLINE bool rasterizer_scanline_aa::navigate_scanline(int y) { if(m_auto_close) close_polygon(); m_outline.sort_cells(); if(m_outline.total_cells() == 0 || y < m_outline.min_y() || y > m_outline.max_y()) { return false; } m_scan_y = y; return true; } //------------------------------------------------------------------------ template bool rasterizer_scanline_aa::hit_test(int tx, int ty) { if(!navigate_scanline(ty)) return false; scanline_hit_test sl(tx); sweep_scanline(sl); return sl.hit(); } } #endif contextfree-3.0.5+dfsg1.orig/src-agg/include/agg_vcgen_stroke.h0000644000175000017500000000677412076364074023105 0ustar brambram//---------------------------------------------------------------------------- // Anti-Grain Geometry - Version 2.4 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) // // Permission to copy, use, modify, sell and distribute this software // is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // //---------------------------------------------------------------------------- // Contact: mcseem@antigrain.com // mcseemagg@yahoo.com // http://www.antigrain.com //---------------------------------------------------------------------------- #ifndef AGG_VCGEN_STROKE_INCLUDED #define AGG_VCGEN_STROKE_INCLUDED #include "agg_math_stroke.h" namespace agg { //============================================================vcgen_stroke // // See Implementation agg_vcgen_stroke.cpp // Stroke generator // //------------------------------------------------------------------------ class vcgen_stroke { enum status_e { initial, ready, cap1, cap2, outline1, close_first, outline2, out_vertices, end_poly1, end_poly2, stop }; public: typedef vertex_sequence vertex_storage; typedef pod_bvector coord_storage; vcgen_stroke(); void line_cap(line_cap_e lc) { m_stroker.line_cap(lc); } void line_join(line_join_e lj) { m_stroker.line_join(lj); } void inner_join(inner_join_e ij) { m_stroker.inner_join(ij); } line_cap_e line_cap() const { return m_stroker.line_cap(); } line_join_e line_join() const { return m_stroker.line_join(); } inner_join_e inner_join() const { return m_stroker.inner_join(); } void width(double w) { m_stroker.width(w); } void miter_limit(double ml) { m_stroker.miter_limit(ml); } void miter_limit_theta(double t) { m_stroker.miter_limit_theta(t); } void inner_miter_limit(double ml) { m_stroker.inner_miter_limit(ml); } void approximation_scale(double as) { m_stroker.approximation_scale(as); } double width() const { return m_stroker.width(); } double miter_limit() const { return m_stroker.miter_limit(); } double inner_miter_limit() const { return m_stroker.inner_miter_limit(); } double approximation_scale() const { return m_stroker.approximation_scale(); } void shorten(double s) { m_shorten = s; } double shorten() const { return m_shorten; } // Vertex Generator Interface void remove_all(); void add_vertex(double x, double y, unsigned cmd); // Vertex Source Interface void rewind(unsigned path_id); unsigned vertex(double* x, double* y); private: vcgen_stroke(const vcgen_stroke&); const vcgen_stroke& operator = (const vcgen_stroke&); math_stroke m_stroker; vertex_storage m_src_vertices; coord_storage m_out_vertices; double m_shorten; unsigned m_closed; status_e m_status; status_e m_prev_status; unsigned m_src_vertex; unsigned m_out_vertex; }; } #endif contextfree-3.0.5+dfsg1.orig/src-agg/include/agg_conv_curve.h0000644000175000017500000001501212076364074022546 0ustar brambram//---------------------------------------------------------------------------- // Anti-Grain Geometry - Version 2.4 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) // // Permission to copy, use, modify, sell and distribute this software // is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // //---------------------------------------------------------------------------- // Contact: mcseem@antigrain.com // mcseemagg@yahoo.com // http://www.antigrain.com //---------------------------------------------------------------------------- // // classes conv_curve // //---------------------------------------------------------------------------- #ifndef AGG_CONV_CURVE_INCLUDED #define AGG_CONV_CURVE_INCLUDED #include "agg_basics.h" #include "agg_curves.h" namespace agg { //---------------------------------------------------------------conv_curve // Curve converter class. Any path storage can have Bezier curves defined // by their control points. There're two types of curves supported: curve3 // and curve4. Curve3 is a conic Bezier curve with 2 endpoints and 1 control // point. Curve4 has 2 control points (4 points in total) and can be used // to interpolate more complicated curves. Curve4, unlike curve3 can be used // to approximate arcs, both circular and elliptical. Curves are approximated // with straight lines and one of the approaches is just to store the whole // sequence of vertices that approximate our curve. It takes additional // memory, and at the same time the consecutive vertices can be calculated // on demand. // // Initially, path storages are not suppose to keep all the vertices of the // curves (although, nothing prevents us from doing so). Instead, path_storage // keeps only vertices, needed to calculate a curve on demand. Those vertices // are marked with special commands. So, if the path_storage contains curves // (which are not real curves yet), and we render this storage directly, // all we will see is only 2 or 3 straight line segments (for curve3 and // curve4 respectively). If we need to see real curves drawn we need to // include this class into the conversion pipeline. // // Class conv_curve recognizes commands path_cmd_curve3 and path_cmd_curve4 // and converts these vertices into a move_to/line_to sequence. //----------------------------------------------------------------------- template class conv_curve { public: typedef Curve3 curve3_type; typedef Curve4 curve4_type; typedef conv_curve self_type; explicit conv_curve(VertexSource& source) : m_source(&source), m_last_x(0.0), m_last_y(0.0) {} void attach(VertexSource& source) { m_source = &source; } void approximation_method(curve_approximation_method_e v) { m_curve3.approximation_method(v); m_curve4.approximation_method(v); } curve_approximation_method_e approximation_method() const { return m_curve4.approximation_method(); } void approximation_scale(double s) { m_curve3.approximation_scale(s); m_curve4.approximation_scale(s); } double approximation_scale() const { return m_curve4.approximation_scale(); } void angle_tolerance(double v) { m_curve3.angle_tolerance(v); m_curve4.angle_tolerance(v); } double angle_tolerance() const { return m_curve4.angle_tolerance(); } void cusp_limit(double v) { m_curve3.cusp_limit(v); m_curve4.cusp_limit(v); } double cusp_limit() const { return m_curve4.cusp_limit(); } void rewind(unsigned path_id); unsigned vertex(double* x, double* y); private: conv_curve(const self_type&); const self_type& operator = (const self_type&); VertexSource* m_source; double m_last_x; double m_last_y; curve3_type m_curve3; curve4_type m_curve4; }; //------------------------------------------------------------------------ template void conv_curve::rewind(unsigned path_id) { m_source->rewind(path_id); m_last_x = 0.0; m_last_y = 0.0; m_curve3.reset(); m_curve4.reset(); } //------------------------------------------------------------------------ template unsigned conv_curve::vertex(double* x, double* y) { if(!is_stop(m_curve3.vertex(x, y))) { m_last_x = *x; m_last_y = *y; return path_cmd_line_to; } if(!is_stop(m_curve4.vertex(x, y))) { m_last_x = *x; m_last_y = *y; return path_cmd_line_to; } double ct2_x; double ct2_y; double end_x; double end_y; unsigned cmd = m_source->vertex(x, y); switch(cmd) { case path_cmd_curve3: m_source->vertex(&end_x, &end_y); m_curve3.init(m_last_x, m_last_y, *x, *y, end_x, end_y); m_curve3.vertex(x, y); // First call returns path_cmd_move_to m_curve3.vertex(x, y); // This is the first vertex of the curve cmd = path_cmd_line_to; break; case path_cmd_curve4: m_source->vertex(&ct2_x, &ct2_y); m_source->vertex(&end_x, &end_y); m_curve4.init(m_last_x, m_last_y, *x, *y, ct2_x, ct2_y, end_x, end_y); m_curve4.vertex(x, y); // First call returns path_cmd_move_to m_curve4.vertex(x, y); // This is the first vertex of the curve cmd = path_cmd_line_to; break; } m_last_x = *x; m_last_y = *y; return cmd; } } #endif contextfree-3.0.5+dfsg1.orig/src-agg/include/agg_gamma_functions.h0000644000175000017500000000626412076364074023560 0ustar brambram//---------------------------------------------------------------------------- // Anti-Grain Geometry - Version 2.4 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) // // Permission to copy, use, modify, sell and distribute this software // is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // //---------------------------------------------------------------------------- // Contact: mcseem@antigrain.com // mcseemagg@yahoo.com // http://www.antigrain.com //---------------------------------------------------------------------------- #ifndef AGG_GAMMA_FUNCTIONS_INCLUDED #define AGG_GAMMA_FUNCTIONS_INCLUDED #include #include "agg_basics.h" namespace agg { //===============================================================gamma_none struct gamma_none { double operator()(double x) const { return x; } }; //==============================================================gamma_power class gamma_power { public: gamma_power() : m_gamma(1.0) {} gamma_power(double g) : m_gamma(g) {} void gamma(double g) { m_gamma = g; } double gamma() const { return m_gamma; } double operator() (double x) const { return pow(x, m_gamma); } private: double m_gamma; }; //==========================================================gamma_threshold class gamma_threshold { public: gamma_threshold() : m_threshold(0.5) {} gamma_threshold(double t) : m_threshold(t) {} void threshold(double t) { m_threshold = t; } double threshold() const { return m_threshold; } double operator() (double x) const { return (x < m_threshold) ? 0.0 : 1.0; } private: double m_threshold; }; //============================================================gamma_linear class gamma_linear { public: gamma_linear() : m_start(0.0), m_end(1.0) {} gamma_linear(double s, double e) : m_start(s), m_end(e) {} void set(double s, double e) { m_start = s; m_end = e; } void start(double s) { m_start = s; } void end(double e) { m_end = e; } double start() const { return m_start; } double end() const { return m_end; } double operator() (double x) const { if(x < m_start) return 0.0; if(x > m_end) return 1.0; return (x - m_start) / (m_end - m_start); } private: double m_start; double m_end; }; //==========================================================gamma_multiply class gamma_multiply { public: gamma_multiply() : m_mul(1.0) {} gamma_multiply(double v) : m_mul(v) {} void value(double v) { m_mul = v; } double value() const { return m_mul; } double operator() (double x) const { double y = x * m_mul; if(y > 1.0) y = 1.0; return y; } private: double m_mul; }; } #endif contextfree-3.0.5+dfsg1.orig/src-agg/include/agg_vertex_sequence.h0000644000175000017500000001207212076364074023605 0ustar brambram//---------------------------------------------------------------------------- // Anti-Grain Geometry - Version 2.4 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) // // Permission to copy, use, modify, sell and distribute this software // is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // //---------------------------------------------------------------------------- // Contact: mcseem@antigrain.com // mcseemagg@yahoo.com // http://www.antigrain.com //---------------------------------------------------------------------------- // // vertex_sequence container and vertex_dist struct // //---------------------------------------------------------------------------- #ifndef AGG_VERTEX_SEQUENCE_INCLUDED #define AGG_VERTEX_SEQUENCE_INCLUDED #include "agg_basics.h" #include "agg_array.h" #include "agg_math.h" namespace agg { //----------------------------------------------------------vertex_sequence // Modified agg::pod_bvector. The data is interpreted as a sequence // of vertices. It means that the type T must expose: // // bool T::operator() (const T& val) // // that is called every time new vertex is being added. The main purpose // of this operator is the possibility to calculate some values during // adding and to return true if the vertex fits some criteria or false if // it doesn't. In the last case the new vertex is not added. // // The simple example is filtering coinciding vertices with calculation // of the distance between the current and previous ones: // // struct vertex_dist // { // double x; // double y; // double dist; // // vertex_dist() {} // vertex_dist(double x_, double y_) : // x(x_), // y(y_), // dist(0.0) // { // } // // bool operator () (const vertex_dist& val) // { // return (dist = calc_distance(x, y, val.x, val.y)) > EPSILON; // } // }; // // Function close() calls this operator and removes the last vertex if // necessary. //------------------------------------------------------------------------ template class vertex_sequence : public pod_bvector { public: typedef pod_bvector base_type; void add(const T& val); void modify_last(const T& val); void close(bool remove_flag); }; //------------------------------------------------------------------------ template void vertex_sequence::add(const T& val) { if(base_type::size() > 1) { if(!(*this)[base_type::size() - 2]((*this)[base_type::size() - 1])) { base_type::remove_last(); } } base_type::add(val); } //------------------------------------------------------------------------ template void vertex_sequence::modify_last(const T& val) { base_type::remove_last(); add(val); } //------------------------------------------------------------------------ template void vertex_sequence::close(bool closed) { while(base_type::size() > 1) { if((*this)[base_type::size() - 2]((*this)[base_type::size() - 1])) break; T t = (*this)[base_type::size() - 1]; base_type::remove_last(); modify_last(t); } if(closed) { while(base_type::size() > 1) { if((*this)[base_type::size() - 1]((*this)[0])) break; base_type::remove_last(); } } } //-------------------------------------------------------------vertex_dist // Vertex (x, y) with the distance to the next one. The last vertex has // distance between the last and the first points if the polygon is closed // and 0.0 if it's a polyline. struct vertex_dist { double x; double y; double dist; vertex_dist() {} vertex_dist(double x_, double y_) : x(x_), y(y_), dist(0.0) { } bool operator () (const vertex_dist& val) { bool ret = (dist = calc_distance(x, y, val.x, val.y)) > vertex_dist_epsilon; if(!ret) dist = 1.0 / vertex_dist_epsilon; return ret; } }; //--------------------------------------------------------vertex_dist_cmd // Save as the above but with additional "command" value struct vertex_dist_cmd : public vertex_dist { unsigned cmd; vertex_dist_cmd() {} vertex_dist_cmd(double x_, double y_, unsigned cmd_) : vertex_dist(x_, y_), cmd(cmd_) { } }; } #endif contextfree-3.0.5+dfsg1.orig/src-agg/include/agg_conv_contour.h0000644000175000017500000000555012076364074023121 0ustar brambram//---------------------------------------------------------------------------- // Anti-Grain Geometry - Version 2.4 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) // // Permission to copy, use, modify, sell and distribute this software // is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // //---------------------------------------------------------------------------- // Contact: mcseem@antigrain.com // mcseemagg@yahoo.com // http://www.antigrain.com //---------------------------------------------------------------------------- // // conv_stroke // //---------------------------------------------------------------------------- #ifndef AGG_CONV_CONTOUR_INCLUDED #define AGG_CONV_CONTOUR_INCLUDED #include "agg_basics.h" #include "agg_vcgen_contour.h" #include "agg_conv_adaptor_vcgen.h" namespace agg { //-----------------------------------------------------------conv_contour template struct conv_contour : public conv_adaptor_vcgen { typedef conv_adaptor_vcgen base_type; conv_contour(VertexSource& vs) : conv_adaptor_vcgen(vs) { } void line_join(line_join_e lj) { base_type::generator().line_join(lj); } void inner_join(inner_join_e ij) { base_type::generator().inner_join(ij); } void width(double w) { base_type::generator().width(w); } void miter_limit(double ml) { base_type::generator().miter_limit(ml); } void miter_limit_theta(double t) { base_type::generator().miter_limit_theta(t); } void inner_miter_limit(double ml) { base_type::generator().inner_miter_limit(ml); } void approximation_scale(double as) { base_type::generator().approximation_scale(as); } void auto_detect_orientation(bool v) { base_type::generator().auto_detect_orientation(v); } line_join_e line_join() const { return base_type::generator().line_join(); } inner_join_e inner_join() const { return base_type::generator().inner_join(); } double width() const { return base_type::generator().width(); } double miter_limit() const { return base_type::generator().miter_limit(); } double inner_miter_limit() const { return base_type::generator().inner_miter_limit(); } double approximation_scale() const { return base_type::generator().approximation_scale(); } bool auto_detect_orientation() const { return base_type::generator().auto_detect_orientation(); } private: conv_contour(const conv_contour&); const conv_contour& operator = (const conv_contour&); }; } #endif contextfree-3.0.5+dfsg1.orig/src-agg/src/0000755000175000017500000000000012245646004016545 5ustar brambramcontextfree-3.0.5+dfsg1.orig/src-agg/src/agg_bezier_arc.cpp0000644000175000017500000002071512076364074022207 0ustar brambram//---------------------------------------------------------------------------- // Anti-Grain Geometry - Version 2.4 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) // // Permission to copy, use, modify, sell and distribute this software // is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // //---------------------------------------------------------------------------- // Contact: mcseem@antigrain.com // mcseemagg@yahoo.com // http://www.antigrain.com //---------------------------------------------------------------------------- // // Arc generator. Produces at most 4 consecutive cubic bezier curves, i.e., // 4, 7, 10, or 13 vertices. // //---------------------------------------------------------------------------- #include #include "agg_bezier_arc.h" namespace agg { // This epsilon is used to prevent us from adding degenerate curves // (converging to a single point). // The value isn't very critical. Function arc_to_bezier() has a limit // of the sweep_angle. If fabs(sweep_angle) exceeds pi/2 the curve // becomes inaccurate. But slight exceeding is quite appropriate. //-------------------------------------------------bezier_arc_angle_epsilon const double bezier_arc_angle_epsilon = 0.01; //------------------------------------------------------------arc_to_bezier void arc_to_bezier(double cx, double cy, double rx, double ry, double start_angle, double sweep_angle, double* curve) { double x0 = cos(sweep_angle / 2.0); double y0 = sin(sweep_angle / 2.0); double tx = (1.0 - x0) * 4.0 / 3.0; double ty = y0 - tx * x0 / y0; double px[4]; double py[4]; px[0] = x0; py[0] = -y0; px[1] = x0 + tx; py[1] = -ty; px[2] = x0 + tx; py[2] = ty; px[3] = x0; py[3] = y0; double sn = sin(start_angle + sweep_angle / 2.0); double cs = cos(start_angle + sweep_angle / 2.0); unsigned i; for(i = 0; i < 4; i++) { curve[i * 2] = cx + rx * (px[i] * cs - py[i] * sn); curve[i * 2 + 1] = cy + ry * (px[i] * sn + py[i] * cs); } } //------------------------------------------------------------------------ void bezier_arc::init(double x, double y, double rx, double ry, double start_angle, double sweep_angle) { start_angle = fmod(start_angle, 2.0 * pi); if(sweep_angle >= 2.0 * pi) sweep_angle = 2.0 * pi; if(sweep_angle <= -2.0 * pi) sweep_angle = -2.0 * pi; if(fabs(sweep_angle) < 1e-10) { m_num_vertices = 4; m_cmd = path_cmd_line_to; m_vertices[0] = x + rx * cos(start_angle); m_vertices[1] = y + ry * sin(start_angle); m_vertices[2] = x + rx * cos(start_angle + sweep_angle); m_vertices[3] = y + ry * sin(start_angle + sweep_angle); return; } double total_sweep = 0.0; double local_sweep = 0.0; double prev_sweep; m_num_vertices = 2; m_cmd = path_cmd_curve4; bool done = false; do { if(sweep_angle < 0.0) { prev_sweep = total_sweep; local_sweep = -pi * 0.5; total_sweep -= pi * 0.5; if(total_sweep <= sweep_angle + bezier_arc_angle_epsilon) { local_sweep = sweep_angle - prev_sweep; done = true; } } else { prev_sweep = total_sweep; local_sweep = pi * 0.5; total_sweep += pi * 0.5; if(total_sweep >= sweep_angle - bezier_arc_angle_epsilon) { local_sweep = sweep_angle - prev_sweep; done = true; } } arc_to_bezier(x, y, rx, ry, start_angle, local_sweep, m_vertices + m_num_vertices - 2); m_num_vertices += 6; start_angle += local_sweep; } while(!done && m_num_vertices < 26); } //-------------------------------------------------------------------- void bezier_arc_svg::init(double x0, double y0, double rx, double ry, double angle, bool large_arc_flag, bool sweep_flag, double x2, double y2) { m_radii_ok = true; if(rx < 0.0) rx = -rx; if(ry < 0.0) ry = -rx; // Calculate the middle point between // the current and the final points //------------------------ double dx2 = (x0 - x2) / 2.0; double dy2 = (y0 - y2) / 2.0; double cos_a = cos(angle); double sin_a = sin(angle); // Calculate (x1, y1) //------------------------ double x1 = cos_a * dx2 + sin_a * dy2; double y1 = -sin_a * dx2 + cos_a * dy2; // Ensure radii are large enough //------------------------ double prx = rx * rx; double pry = ry * ry; double px1 = x1 * x1; double py1 = y1 * y1; // Check that radii are large enough //------------------------ double radii_check = px1/prx + py1/pry; if(radii_check > 1.0) { rx = sqrt(radii_check) * rx; ry = sqrt(radii_check) * ry; prx = rx * rx; pry = ry * ry; if(radii_check > 10.0) m_radii_ok = false; } // Calculate (cx1, cy1) //------------------------ double sign = (large_arc_flag == sweep_flag) ? -1.0 : 1.0; double sq = (prx*pry - prx*py1 - pry*px1) / (prx*py1 + pry*px1); double coef = sign * sqrt((sq < 0) ? 0 : sq); double cx1 = coef * ((rx * y1) / ry); double cy1 = coef * -((ry * x1) / rx); // // Calculate (cx, cy) from (cx1, cy1) //------------------------ double sx2 = (x0 + x2) / 2.0; double sy2 = (y0 + y2) / 2.0; double cx = sx2 + (cos_a * cx1 - sin_a * cy1); double cy = sy2 + (sin_a * cx1 + cos_a * cy1); // Calculate the start_angle (angle1) and the sweep_angle (dangle) //------------------------ double ux = (x1 - cx1) / rx; double uy = (y1 - cy1) / ry; double vx = (-x1 - cx1) / rx; double vy = (-y1 - cy1) / ry; double p, n; // Calculate the angle start //------------------------ n = sqrt(ux*ux + uy*uy); p = ux; // (1 * ux) + (0 * uy) sign = (uy < 0) ? -1.0 : 1.0; double v = p / n; if(v < -1.0) v = -1.0; if(v > 1.0) v = 1.0; double start_angle = sign * acos(v); // Calculate the sweep angle //------------------------ n = sqrt((ux*ux + uy*uy) * (vx*vx + vy*vy)); p = ux * vx + uy * vy; sign = (ux * vy - uy * vx < 0) ? -1.0 : 1.0; v = p / n; if(v < -1.0) v = -1.0; if(v > 1.0) v = 1.0; double sweep_angle = sign * acos(v); if(!sweep_flag && sweep_angle > 0) { sweep_angle -= pi * 2.0; } else if (sweep_flag && sweep_angle < 0) { sweep_angle += pi * 2.0; } // We can now build and transform the resulting arc //------------------------ m_arc.init(0.0, 0.0, rx, ry, start_angle, sweep_angle); trans_affine mtx = trans_affine_rotation(angle); mtx *= trans_affine_translation(cx, cy); for(unsigned i = 2; i < m_arc.num_vertices()-2; i += 2) { mtx.transform(m_arc.vertices() + i, m_arc.vertices() + i + 1); } // We must make sure that the starting and ending points // exactly coincide with the initial (x0,y0) and (x2,y2) m_arc.vertices()[0] = x0; m_arc.vertices()[1] = y0; if(m_arc.num_vertices() > 2) { m_arc.vertices()[m_arc.num_vertices() - 2] = x2; m_arc.vertices()[m_arc.num_vertices() - 1] = y2; } } } contextfree-3.0.5+dfsg1.orig/src-agg/src/agg_color_rgba.cpp0000644000175000017500000000157412076364074022215 0ustar brambram//---------------------------------------------------------------------------- // Anti-Grain Geometry - Version 2.4 // Copyright (C) 2009 John Horigan (http://www.antigrain.com) // // Permission to copy, use, modify, sell and distribute this software // is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // //---------------------------------------------------------------------------- // // Contact: john@glyphic.com.com // http://www.antigrain.com //---------------------------------------------------------------------------- #include "agg_color_rgba.h" #include "agg_color_gray.h" agg::rgba8::rgba8(const gray8& c) : r(c.v), g(c.v), b(c.v), a(c.a) {} agg::rgba16::rgba16(const gray16& c) : r(c.v), g(c.v), b(c.v), a(c.a) {} contextfree-3.0.5+dfsg1.orig/src-agg/src/agg_trans_affine.cpp0000644000175000017500000001407212076364074022540 0ustar brambram//---------------------------------------------------------------------------- // Anti-Grain Geometry - Version 2.4 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) // // Permission to copy, use, modify, sell and distribute this software // is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // //---------------------------------------------------------------------------- // Contact: mcseem@antigrain.com // mcseemagg@yahoo.com // http://www.antigrain.com //---------------------------------------------------------------------------- // // Affine transformations // //---------------------------------------------------------------------------- #include "agg_trans_affine.h" namespace agg { //------------------------------------------------------------------------ const trans_affine& trans_affine::parl_to_parl(const double* src, const double* dst) { sx = src[2] - src[0]; shy = src[3] - src[1]; shx = src[4] - src[0]; sy = src[5] - src[1]; tx = src[0]; ty = src[1]; invert(); multiply(trans_affine(dst[2] - dst[0], dst[3] - dst[1], dst[4] - dst[0], dst[5] - dst[1], dst[0], dst[1])); return *this; } //------------------------------------------------------------------------ const trans_affine& trans_affine::rect_to_parl(double x1, double y1, double x2, double y2, const double* parl) { double src[6]; src[0] = x1; src[1] = y1; src[2] = x2; src[3] = y1; src[4] = x2; src[5] = y2; parl_to_parl(src, parl); return *this; } //------------------------------------------------------------------------ const trans_affine& trans_affine::parl_to_rect(const double* parl, double x1, double y1, double x2, double y2) { double dst[6]; dst[0] = x1; dst[1] = y1; dst[2] = x2; dst[3] = y1; dst[4] = x2; dst[5] = y2; parl_to_parl(parl, dst); return *this; } //------------------------------------------------------------------------ const trans_affine& trans_affine::multiply(const trans_affine& m) { double t0 = sx * m.sx + shy * m.shx; double t2 = shx * m.sx + sy * m.shx; double t4 = tx * m.sx + ty * m.shx + m.tx; shy = sx * m.shy + shy * m.sy; sy = shx * m.shy + sy * m.sy; ty = tx * m.shy + ty * m.sy + m.ty; sx = t0; shx = t2; tx = t4; return *this; } //------------------------------------------------------------------------ const trans_affine& trans_affine::invert() { double d = determinant_reciprocal(); double t0 = sy * d; sy = sx * d; shy = -shy * d; shx = -shx * d; double t4 = -tx * t0 - ty * shx; ty = -tx * shy - ty * sy; sx = t0; tx = t4; return *this; } //------------------------------------------------------------------------ const trans_affine& trans_affine::flip_x() { sx = -sx; shy = -shy; tx = -tx; return *this; } //------------------------------------------------------------------------ const trans_affine& trans_affine::flip_y() { shx = -shx; sy = -sy; ty = -ty; return *this; } //------------------------------------------------------------------------ const trans_affine& trans_affine::reset() { sx = sy = 1.0; shy = shx = tx = ty = 0.0; return *this; } //------------------------------------------------------------------------ bool trans_affine::is_identity(double epsilon) const { return is_equal_eps(sx, 1.0, epsilon) && is_equal_eps(shy, 0.0, epsilon) && is_equal_eps(shx, 0.0, epsilon) && is_equal_eps(sy, 1.0, epsilon) && is_equal_eps(tx, 0.0, epsilon) && is_equal_eps(ty, 0.0, epsilon); } //------------------------------------------------------------------------ bool trans_affine::is_valid(double epsilon) const { return fabs(sx) > epsilon && fabs(sy) > epsilon; } //------------------------------------------------------------------------ bool trans_affine::is_equal(const trans_affine& m, double epsilon) const { return is_equal_eps(sx, m.sx, epsilon) && is_equal_eps(shy, m.shy, epsilon) && is_equal_eps(shx, m.shx, epsilon) && is_equal_eps(sy, m.sy, epsilon) && is_equal_eps(tx, m.tx, epsilon) && is_equal_eps(ty, m.ty, epsilon); } //------------------------------------------------------------------------ double trans_affine::rotation() const { double x1 = 0.0; double y1 = 0.0; double x2 = 1.0; double y2 = 0.0; transform(&x1, &y1); transform(&x2, &y2); return atan2(y2-y1, x2-x1); } //------------------------------------------------------------------------ void trans_affine::translation(double* dx, double* dy) const { *dx = tx; *dy = ty; } //------------------------------------------------------------------------ void trans_affine::scaling(double* x, double* y) const { double x1 = 0.0; double y1 = 0.0; double x2 = 1.0; double y2 = 1.0; trans_affine t(*this); t *= trans_affine_rotation(-rotation()); t.transform(&x1, &y1); t.transform(&x2, &y2); *x = x2 - x1; *y = y2 - y1; } } contextfree-3.0.5+dfsg1.orig/src-agg/src/agg_vcgen_contour.cpp0000644000175000017500000001200012076364074022741 0ustar brambram//---------------------------------------------------------------------------- // Anti-Grain Geometry - Version 2.4 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) // // Permission to copy, use, modify, sell and distribute this software // is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // //---------------------------------------------------------------------------- // Contact: mcseem@antigrain.com // mcseemagg@yahoo.com // http://www.antigrain.com //---------------------------------------------------------------------------- // // Contour generator // //---------------------------------------------------------------------------- #include #include "agg_vcgen_contour.h" namespace agg { //------------------------------------------------------------------------ vcgen_contour::vcgen_contour() : m_stroker(), m_width(1), m_src_vertices(), m_out_vertices(), m_status(initial), m_src_vertex(0), m_closed(0), m_orientation(0), m_auto_detect(false) { } //------------------------------------------------------------------------ void vcgen_contour::remove_all() { m_src_vertices.remove_all(); m_closed = 0; m_orientation = 0; m_status = initial; } //------------------------------------------------------------------------ void vcgen_contour::add_vertex(double x, double y, unsigned cmd) { m_status = initial; if(is_move_to(cmd)) { m_src_vertices.modify_last(vertex_dist(x, y)); } else { if(is_vertex(cmd)) { m_src_vertices.add(vertex_dist(x, y)); } else { if(is_end_poly(cmd)) { m_closed = get_close_flag(cmd); if(m_orientation == path_flags_none) { m_orientation = get_orientation(cmd); } } } } } //------------------------------------------------------------------------ void vcgen_contour::rewind(unsigned) { if(m_status == initial) { m_src_vertices.close(true); if(m_auto_detect) { if(!is_oriented(m_orientation)) { m_orientation = (calc_polygon_area(m_src_vertices) > 0.0) ? path_flags_ccw : path_flags_cw; } } if(is_oriented(m_orientation)) { m_stroker.width(is_ccw(m_orientation) ? m_width : -m_width); } } m_status = ready; m_src_vertex = 0; } //------------------------------------------------------------------------ unsigned vcgen_contour::vertex(double* x, double* y) { unsigned cmd = path_cmd_line_to; while(!is_stop(cmd)) { switch(m_status) { case initial: rewind(0); case ready: if(m_src_vertices.size() < 2 + unsigned(m_closed != 0)) { cmd = path_cmd_stop; break; } m_status = outline; cmd = path_cmd_move_to; m_src_vertex = 0; m_out_vertex = 0; case outline: if(m_src_vertex >= m_src_vertices.size()) { m_status = end_poly; break; } m_stroker.calc_join(m_out_vertices, m_src_vertices.prev(m_src_vertex), m_src_vertices.curr(m_src_vertex), m_src_vertices.next(m_src_vertex), m_src_vertices.prev(m_src_vertex).dist, m_src_vertices.curr(m_src_vertex).dist); ++m_src_vertex; m_status = out_vertices; m_out_vertex = 0; case out_vertices: if(m_out_vertex >= m_out_vertices.size()) { m_status = outline; } else { const point_d& c = m_out_vertices[m_out_vertex++]; *x = c.x; *y = c.y; return cmd; } break; case end_poly: if(!m_closed) return path_cmd_stop; m_status = stop; return path_cmd_end_poly | path_flags_close | path_flags_ccw; case stop: return path_cmd_stop; } } return cmd; } } contextfree-3.0.5+dfsg1.orig/src-agg/src/agg_curves.cpp0000644000175000017500000004623112076364074021412 0ustar brambram//---------------------------------------------------------------------------- // Anti-Grain Geometry - Version 2.4 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) // // Permission to copy, use, modify, sell and distribute this software // is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // //---------------------------------------------------------------------------- // Contact: mcseem@antigrain.com // mcseemagg@yahoo.com // http://www.antigrain.com //---------------------------------------------------------------------------- #include #include "agg_curves.h" #include "agg_math.h" namespace agg { //------------------------------------------------------------------------ const double curve_distance_epsilon = 1e-30; const double curve_collinearity_epsilon = 1e-30; const double curve_angle_tolerance_epsilon = 0.01; enum curve_recursion_limit_e { curve_recursion_limit = 32 }; //------------------------------------------------------------------------ void curve3_inc::approximation_scale(double s) { m_scale = s; } //------------------------------------------------------------------------ double curve3_inc::approximation_scale() const { return m_scale; } //------------------------------------------------------------------------ void curve3_inc::init(double x1, double y1, double x2, double y2, double x3, double y3) { m_start_x = x1; m_start_y = y1; m_end_x = x3; m_end_y = y3; double dx1 = x2 - x1; double dy1 = y2 - y1; double dx2 = x3 - x2; double dy2 = y3 - y2; double len = sqrt(dx1 * dx1 + dy1 * dy1) + sqrt(dx2 * dx2 + dy2 * dy2); m_num_steps = uround(len * 0.25 * m_scale); if(m_num_steps < 4) { m_num_steps = 4; } double subdivide_step = 1.0 / m_num_steps; double subdivide_step2 = subdivide_step * subdivide_step; double tmpx = (x1 - x2 * 2.0 + x3) * subdivide_step2; double tmpy = (y1 - y2 * 2.0 + y3) * subdivide_step2; m_saved_fx = m_fx = x1; m_saved_fy = m_fy = y1; m_saved_dfx = m_dfx = tmpx + (x2 - x1) * (2.0 * subdivide_step); m_saved_dfy = m_dfy = tmpy + (y2 - y1) * (2.0 * subdivide_step); m_ddfx = tmpx * 2.0; m_ddfy = tmpy * 2.0; m_step = m_num_steps; } //------------------------------------------------------------------------ void curve3_inc::rewind(unsigned) { if(m_num_steps == 0) { m_step = -1; return; } m_step = m_num_steps; m_fx = m_saved_fx; m_fy = m_saved_fy; m_dfx = m_saved_dfx; m_dfy = m_saved_dfy; } //------------------------------------------------------------------------ unsigned curve3_inc::vertex(double* x, double* y) { if(m_step < 0) return path_cmd_stop; if(m_step == m_num_steps) { *x = m_start_x; *y = m_start_y; --m_step; return path_cmd_move_to; } if(m_step == 0) { *x = m_end_x; *y = m_end_y; --m_step; return path_cmd_line_to; } m_fx += m_dfx; m_fy += m_dfy; m_dfx += m_ddfx; m_dfy += m_ddfy; *x = m_fx; *y = m_fy; --m_step; return path_cmd_line_to; } //------------------------------------------------------------------------ void curve3_div::init(double x1, double y1, double x2, double y2, double x3, double y3) { m_points.remove_all(); m_distance_tolerance_square = 0.5 / m_approximation_scale; m_distance_tolerance_square *= m_distance_tolerance_square; bezier(x1, y1, x2, y2, x3, y3); m_count = 0; } //------------------------------------------------------------------------ void curve3_div::recursive_bezier(double x1, double y1, double x2, double y2, double x3, double y3, unsigned level) { if(level > curve_recursion_limit) { return; } // Calculate all the mid-points of the line segments //---------------------- double x12 = (x1 + x2) / 2; double y12 = (y1 + y2) / 2; double x23 = (x2 + x3) / 2; double y23 = (y2 + y3) / 2; double x123 = (x12 + x23) / 2; double y123 = (y12 + y23) / 2; double dx = x3-x1; double dy = y3-y1; double d = fabs(((x2 - x3) * dy - (y2 - y3) * dx)); double da; if(d > curve_collinearity_epsilon) { // Regular case //----------------- if(d * d <= m_distance_tolerance_square * (dx*dx + dy*dy)) { // If the curvature doesn't exceed the distance_tolerance value // we tend to finish subdivisions. //---------------------- if(m_angle_tolerance < curve_angle_tolerance_epsilon) { m_points.add(point_d(x123, y123)); return; } // Angle & Cusp Condition //---------------------- da = fabs(atan2(y3 - y2, x3 - x2) - atan2(y2 - y1, x2 - x1)); if(da >= pi) da = 2*pi - da; if(da < m_angle_tolerance) { // Finally we can stop the recursion //---------------------- m_points.add(point_d(x123, y123)); return; } } } else { // Collinear case //------------------ da = dx*dx + dy*dy; if(da == 0) { d = calc_sq_distance(x1, y1, x2, y2); } else { d = ((x2 - x1)*dx + (y2 - y1)*dy) / da; if(d > 0 && d < 1) { // Simple collinear case, 1---2---3 // We can leave just two endpoints return; } if(d <= 0) d = calc_sq_distance(x2, y2, x1, y1); else if(d >= 1) d = calc_sq_distance(x2, y2, x3, y3); else d = calc_sq_distance(x2, y2, x1 + d*dx, y1 + d*dy); } if(d < m_distance_tolerance_square) { m_points.add(point_d(x2, y2)); return; } } // Continue subdivision //---------------------- recursive_bezier(x1, y1, x12, y12, x123, y123, level + 1); recursive_bezier(x123, y123, x23, y23, x3, y3, level + 1); } //------------------------------------------------------------------------ void curve3_div::bezier(double x1, double y1, double x2, double y2, double x3, double y3) { m_points.add(point_d(x1, y1)); recursive_bezier(x1, y1, x2, y2, x3, y3, 0); m_points.add(point_d(x3, y3)); } //------------------------------------------------------------------------ void curve4_inc::approximation_scale(double s) { m_scale = s; } //------------------------------------------------------------------------ double curve4_inc::approximation_scale() const { return m_scale; } //------------------------------------------------------------------------ #if defined(_MSC_VER) && _MSC_VER <= 1200 static double MSC60_fix_ICE(double v) { return v; } #endif //------------------------------------------------------------------------ void curve4_inc::init(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4) { m_start_x = x1; m_start_y = y1; m_end_x = x4; m_end_y = y4; double dx1 = x2 - x1; double dy1 = y2 - y1; double dx2 = x3 - x2; double dy2 = y3 - y2; double dx3 = x4 - x3; double dy3 = y4 - y3; double len = (sqrt(dx1 * dx1 + dy1 * dy1) + sqrt(dx2 * dx2 + dy2 * dy2) + sqrt(dx3 * dx3 + dy3 * dy3)) * 0.25 * m_scale; #if defined(_MSC_VER) && _MSC_VER <= 1200 m_num_steps = uround(MSC60_fix_ICE(len)); #else m_num_steps = uround(len); #endif if(m_num_steps < 4) { m_num_steps = 4; } double subdivide_step = 1.0 / m_num_steps; double subdivide_step2 = subdivide_step * subdivide_step; double subdivide_step3 = subdivide_step * subdivide_step * subdivide_step; double pre1 = 3.0 * subdivide_step; double pre2 = 3.0 * subdivide_step2; double pre4 = 6.0 * subdivide_step2; double pre5 = 6.0 * subdivide_step3; double tmp1x = x1 - x2 * 2.0 + x3; double tmp1y = y1 - y2 * 2.0 + y3; double tmp2x = (x2 - x3) * 3.0 - x1 + x4; double tmp2y = (y2 - y3) * 3.0 - y1 + y4; m_saved_fx = m_fx = x1; m_saved_fy = m_fy = y1; m_saved_dfx = m_dfx = (x2 - x1) * pre1 + tmp1x * pre2 + tmp2x * subdivide_step3; m_saved_dfy = m_dfy = (y2 - y1) * pre1 + tmp1y * pre2 + tmp2y * subdivide_step3; m_saved_ddfx = m_ddfx = tmp1x * pre4 + tmp2x * pre5; m_saved_ddfy = m_ddfy = tmp1y * pre4 + tmp2y * pre5; m_dddfx = tmp2x * pre5; m_dddfy = tmp2y * pre5; m_step = m_num_steps; } //------------------------------------------------------------------------ void curve4_inc::rewind(unsigned) { if(m_num_steps == 0) { m_step = -1; return; } m_step = m_num_steps; m_fx = m_saved_fx; m_fy = m_saved_fy; m_dfx = m_saved_dfx; m_dfy = m_saved_dfy; m_ddfx = m_saved_ddfx; m_ddfy = m_saved_ddfy; } //------------------------------------------------------------------------ unsigned curve4_inc::vertex(double* x, double* y) { if(m_step < 0) return path_cmd_stop; if(m_step == m_num_steps) { *x = m_start_x; *y = m_start_y; --m_step; return path_cmd_move_to; } if(m_step == 0) { *x = m_end_x; *y = m_end_y; --m_step; return path_cmd_line_to; } m_fx += m_dfx; m_fy += m_dfy; m_dfx += m_ddfx; m_dfy += m_ddfy; m_ddfx += m_dddfx; m_ddfy += m_dddfy; *x = m_fx; *y = m_fy; --m_step; return path_cmd_line_to; } //------------------------------------------------------------------------ void curve4_div::init(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4) { m_points.remove_all(); m_distance_tolerance_square = 0.5 / m_approximation_scale; m_distance_tolerance_square *= m_distance_tolerance_square; bezier(x1, y1, x2, y2, x3, y3, x4, y4); m_count = 0; } //------------------------------------------------------------------------ void curve4_div::recursive_bezier(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4, unsigned level) { if(level > curve_recursion_limit) { return; } // Calculate all the mid-points of the line segments //---------------------- double x12 = (x1 + x2) / 2; double y12 = (y1 + y2) / 2; double x23 = (x2 + x3) / 2; double y23 = (y2 + y3) / 2; double x34 = (x3 + x4) / 2; double y34 = (y3 + y4) / 2; double x123 = (x12 + x23) / 2; double y123 = (y12 + y23) / 2; double x234 = (x23 + x34) / 2; double y234 = (y23 + y34) / 2; double x1234 = (x123 + x234) / 2; double y1234 = (y123 + y234) / 2; // Try to approximate the full cubic curve by a single straight line //------------------ double dx = x4-x1; double dy = y4-y1; double d2 = fabs(((x2 - x4) * dy - (y2 - y4) * dx)); double d3 = fabs(((x3 - x4) * dy - (y3 - y4) * dx)); double da1, da2, k; switch((int(d2 > curve_collinearity_epsilon) << 1) + int(d3 > curve_collinearity_epsilon)) { case 0: // All collinear OR p1==p4 //---------------------- k = dx*dx + dy*dy; if(k == 0) { d2 = calc_sq_distance(x1, y1, x2, y2); d3 = calc_sq_distance(x4, y4, x3, y3); } else { k = 1 / k; da1 = x2 - x1; da2 = y2 - y1; d2 = k * (da1*dx + da2*dy); da1 = x3 - x1; da2 = y3 - y1; d3 = k * (da1*dx + da2*dy); if(d2 > 0 && d2 < 1 && d3 > 0 && d3 < 1) { // Simple collinear case, 1---2---3---4 // We can leave just two endpoints return; } if(d2 <= 0) d2 = calc_sq_distance(x2, y2, x1, y1); else if(d2 >= 1) d2 = calc_sq_distance(x2, y2, x4, y4); else d2 = calc_sq_distance(x2, y2, x1 + d2*dx, y1 + d2*dy); if(d3 <= 0) d3 = calc_sq_distance(x3, y3, x1, y1); else if(d3 >= 1) d3 = calc_sq_distance(x3, y3, x4, y4); else d3 = calc_sq_distance(x3, y3, x1 + d3*dx, y1 + d3*dy); } if(d2 > d3) { if(d2 < m_distance_tolerance_square) { m_points.add(point_d(x2, y2)); return; } } else { if(d3 < m_distance_tolerance_square) { m_points.add(point_d(x3, y3)); return; } } break; case 1: // p1,p2,p4 are collinear, p3 is significant //---------------------- if(d3 * d3 <= m_distance_tolerance_square * (dx*dx + dy*dy)) { if(m_angle_tolerance < curve_angle_tolerance_epsilon) { m_points.add(point_d(x23, y23)); return; } // Angle Condition //---------------------- da1 = fabs(atan2(y4 - y3, x4 - x3) - atan2(y3 - y2, x3 - x2)); if(da1 >= pi) da1 = 2*pi - da1; if(da1 < m_angle_tolerance) { m_points.add(point_d(x2, y2)); m_points.add(point_d(x3, y3)); return; } if(m_cusp_limit != 0.0) { if(da1 > m_cusp_limit) { m_points.add(point_d(x3, y3)); return; } } } break; case 2: // p1,p3,p4 are collinear, p2 is significant //---------------------- if(d2 * d2 <= m_distance_tolerance_square * (dx*dx + dy*dy)) { if(m_angle_tolerance < curve_angle_tolerance_epsilon) { m_points.add(point_d(x23, y23)); return; } // Angle Condition //---------------------- da1 = fabs(atan2(y3 - y2, x3 - x2) - atan2(y2 - y1, x2 - x1)); if(da1 >= pi) da1 = 2*pi - da1; if(da1 < m_angle_tolerance) { m_points.add(point_d(x2, y2)); m_points.add(point_d(x3, y3)); return; } if(m_cusp_limit != 0.0) { if(da1 > m_cusp_limit) { m_points.add(point_d(x2, y2)); return; } } } break; case 3: // Regular case //----------------- if((d2 + d3)*(d2 + d3) <= m_distance_tolerance_square * (dx*dx + dy*dy)) { // If the curvature doesn't exceed the distance_tolerance value // we tend to finish subdivisions. //---------------------- if(m_angle_tolerance < curve_angle_tolerance_epsilon) { m_points.add(point_d(x23, y23)); return; } // Angle & Cusp Condition //---------------------- k = atan2(y3 - y2, x3 - x2); da1 = fabs(k - atan2(y2 - y1, x2 - x1)); da2 = fabs(atan2(y4 - y3, x4 - x3) - k); if(da1 >= pi) da1 = 2*pi - da1; if(da2 >= pi) da2 = 2*pi - da2; if(da1 + da2 < m_angle_tolerance) { // Finally we can stop the recursion //---------------------- m_points.add(point_d(x23, y23)); return; } if(m_cusp_limit != 0.0) { if(da1 > m_cusp_limit) { m_points.add(point_d(x2, y2)); return; } if(da2 > m_cusp_limit) { m_points.add(point_d(x3, y3)); return; } } } break; } // Continue subdivision //---------------------- recursive_bezier(x1, y1, x12, y12, x123, y123, x1234, y1234, level + 1); recursive_bezier(x1234, y1234, x234, y234, x34, y34, x4, y4, level + 1); } //------------------------------------------------------------------------ void curve4_div::bezier(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4) { m_points.add(point_d(x1, y1)); recursive_bezier(x1, y1, x2, y2, x3, y3, x4, y4, 0); m_points.add(point_d(x4, y4)); } } contextfree-3.0.5+dfsg1.orig/src-agg/src/agg_vcgen_stroke.cpp0000644000175000017500000001546112076364074022575 0ustar brambram//---------------------------------------------------------------------------- // Anti-Grain Geometry - Version 2.4 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) // // Permission to copy, use, modify, sell and distribute this software // is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // //---------------------------------------------------------------------------- // Contact: mcseem@antigrain.com // mcseemagg@yahoo.com // http://www.antigrain.com //---------------------------------------------------------------------------- // // Stroke generator // //---------------------------------------------------------------------------- #include #include "agg_vcgen_stroke.h" #include "agg_shorten_path.h" namespace agg { //------------------------------------------------------------------------ vcgen_stroke::vcgen_stroke() : m_stroker(), m_src_vertices(), m_out_vertices(), m_shorten(0.0), m_closed(0), m_status(initial), m_src_vertex(0), m_out_vertex(0) { } //------------------------------------------------------------------------ void vcgen_stroke::remove_all() { m_src_vertices.remove_all(); m_closed = 0; m_status = initial; } //------------------------------------------------------------------------ void vcgen_stroke::add_vertex(double x, double y, unsigned cmd) { m_status = initial; if(is_move_to(cmd)) { m_src_vertices.modify_last(vertex_dist(x, y)); } else { if(is_vertex(cmd)) { m_src_vertices.add(vertex_dist(x, y)); } else { m_closed = get_close_flag(cmd); } } } //------------------------------------------------------------------------ void vcgen_stroke::rewind(unsigned) { if(m_status == initial) { m_src_vertices.close(m_closed != 0); shorten_path(m_src_vertices, m_shorten, m_closed); if(m_src_vertices.size() < 3) m_closed = 0; } m_status = ready; m_src_vertex = 0; m_out_vertex = 0; } //------------------------------------------------------------------------ unsigned vcgen_stroke::vertex(double* x, double* y) { unsigned cmd = path_cmd_line_to; while(!is_stop(cmd)) { switch(m_status) { case initial: rewind(0); case ready: if(m_src_vertices.size() < 2 + unsigned(m_closed != 0)) { cmd = path_cmd_stop; break; } m_status = m_closed ? outline1 : cap1; cmd = path_cmd_move_to; m_src_vertex = 0; m_out_vertex = 0; break; case cap1: m_stroker.calc_cap(m_out_vertices, m_src_vertices[0], m_src_vertices[1], m_src_vertices[0].dist); m_src_vertex = 1; m_prev_status = outline1; m_status = out_vertices; m_out_vertex = 0; break; case cap2: m_stroker.calc_cap(m_out_vertices, m_src_vertices[m_src_vertices.size() - 1], m_src_vertices[m_src_vertices.size() - 2], m_src_vertices[m_src_vertices.size() - 2].dist); m_prev_status = outline2; m_status = out_vertices; m_out_vertex = 0; break; case outline1: if(m_closed) { if(m_src_vertex >= m_src_vertices.size()) { m_prev_status = close_first; m_status = end_poly1; break; } } else { if(m_src_vertex >= m_src_vertices.size() - 1) { m_status = cap2; break; } } m_stroker.calc_join(m_out_vertices, m_src_vertices.prev(m_src_vertex), m_src_vertices.curr(m_src_vertex), m_src_vertices.next(m_src_vertex), m_src_vertices.prev(m_src_vertex).dist, m_src_vertices.curr(m_src_vertex).dist); ++m_src_vertex; m_prev_status = m_status; m_status = out_vertices; m_out_vertex = 0; break; case close_first: m_status = outline2; cmd = path_cmd_move_to; case outline2: if(m_src_vertex <= unsigned(m_closed == 0)) { m_status = end_poly2; m_prev_status = stop; break; } --m_src_vertex; m_stroker.calc_join(m_out_vertices, m_src_vertices.next(m_src_vertex), m_src_vertices.curr(m_src_vertex), m_src_vertices.prev(m_src_vertex), m_src_vertices.curr(m_src_vertex).dist, m_src_vertices.prev(m_src_vertex).dist); m_prev_status = m_status; m_status = out_vertices; m_out_vertex = 0; break; case out_vertices: if(m_out_vertex >= m_out_vertices.size()) { m_status = m_prev_status; } else { const point_d& c = m_out_vertices[m_out_vertex++]; *x = c.x; *y = c.y; return cmd; } break; case end_poly1: m_status = m_prev_status; return path_cmd_end_poly | path_flags_close | path_flags_ccw; case end_poly2: m_status = m_prev_status; return path_cmd_end_poly | path_flags_close | path_flags_cw; case stop: cmd = path_cmd_stop; break; } } return cmd; } } contextfree-3.0.5+dfsg1.orig/src-agg/authors0000644000175000017500000000017112076364074017373 0ustar brambramAnti-Grain Geometry (AGG) - Version 2.5 A high quality rendering engine for C++ Copyright (C) 2002-2006 Maxim Shemanarev contextfree-3.0.5+dfsg1.orig/src-agg/README.txt0000644000175000017500000000457612076364074017476 0ustar brambramAnti-Grain Geometry (AGG) - Version 2.5 A high quality rendering engine for C++ Copyright (C) 2002-2006 Maxim Shemanarev Contact: mcseem@antigrain.com mcseemagg@yahoo.com http://antigrain.com AGG is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. AGG is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with AGG; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. --------------------------------- Use automake to build the library. If automake is not available you still can use the old make. There is a very simple Makefile that can be used. Note that if you use automake it will overwrite Makefile. --------------------------------- If building on AmigaOS 4.0 or higher type the following for instructions on what targets are available. make -f Makefile.AmigaOS To just build and install AGG into the standard AmigaOS SDK ready for use type: make -f Makefile.AmigaOS install If you just want to build one demo (e.g. lion) use: make -f Makefile.AmigaOS bin/lion If you have any questions about the AmigaOS port please contact Steven Solie (ssolie@telus.net) for help. --------------------------------- To build all examples using SDL (Mac or Linux) just type: cd /examples/sdl make Individual examples can be built with make aa_test In the same way the native Carbon examples can be built with cd /examples/macosx_carbon make In both cases the static library will be built (if it was not already) from the existing global Makefile in /src/. The Makefiles for both SDL and Carbon will also attempt to download the required .bmp files if they are not found in the system for a given example. If the files could not be fetched (wget) the user will receive a message explaining where to download the samples from (sphere.bmp, etc.) Since all programs reside in the same directory there is no need to duplicate the .bmp files for each program that needs to use them. --------------------------------- contextfree-3.0.5+dfsg1.orig/src-agg/copying0000644000175000017500000004310312076364074017360 0ustar brambram GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. contextfree-3.0.5+dfsg1.orig/src-unix/0000755000175000017500000000000012245646004016203 5ustar brambramcontextfree-3.0.5+dfsg1.orig/src-unix/posixSystem.h0000644000175000017500000000414612076364074020736 0ustar brambram// posixSystem.h // Context Free // --------------------- // Copyright (C) 2005-2007 Mark Lentczner - markl@glyphic.com // Copyright (C) 2007-2012 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // Mark Lentczner can be contacted at markl@glyphic.com or at // Mark Lentczner, 1209 Villa St., Mountain View, CA 94041-1123, USA // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #ifndef INCLUDE_POSIX_SYSTEM #define INCLUDE_POSIX_SYSTEM #include "cfdg.h" #include #include class PosixSystem : public AbstractSystem { protected: bool mQuiet; bool mErrorMode; std::string* mInputBuffer; public: PosixSystem(bool q = false) : mQuiet(q), mErrorMode(false), mInputBuffer(0) {}; ~PosixSystem(); virtual void message(const char* fmt, ...); virtual void syntaxError(const CfdgError& err); virtual bool error(bool errorOccurred = true); virtual std::istream* openFileForRead(const std::string& path); virtual std::istream* tempFileForRead(const std::string& path); virtual std::ostream* tempFileForWrite(std::string& prefixInNameOut); // caller must delete returned streams when done virtual std::string relativeFilePath( const std::string& base, const std::string& rel); virtual void stats(const Stats&); virtual void orphan() {}; }; #endif // INCLUDE_POSIX_SYSTEM contextfree-3.0.5+dfsg1.orig/src-unix/pngCanvas.cpp0000644000175000017500000001520512076364074020640 0ustar brambram// pngCanvas.cpp // Context Free // --------------------- // Copyright (C) 2005-2007 Mark Lentczner - markl@glyphic.com // Copyright (C) 2007-2012 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // Mark Lentczner can be contacted at markl@glyphic.com or at // Mark Lentczner, 1209 Villa St., Mountain View, CA 94041-1123, USA // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #include "pngCanvas.h" #include "png.h" #include #include #include using namespace std; namespace { void pngWriteError(png_structp png_ptr, png_const_charp message) { cerr << message << endl; throw false; } void pngWriteWarning(png_structp png_ptr, png_const_charp message) { cerr << message << endl; } } void pngCanvas::output(const char* outfilename, int frame) { FILE *out = 0; png_structp png_ptr = 0; png_infop info_ptr = 0; png_bytep row = (mPixelFormat & Has_16bit_Color) ? NULL : new png_byte[mStride]; png_uint_16p row16 = (mPixelFormat & Has_16bit_Color) ? new png_uint_16[mStride >> 1] : NULL; try { png_ptr = png_create_write_struct( PNG_LIBPNG_VER_STRING, 0, pngWriteError, pngWriteWarning); if (!png_ptr) throw "couldn't create png write struct"; png_infop info_ptr = png_create_info_struct(png_ptr); if (!info_ptr) throw "couldn't create png info struct"; if (*outfilename) { out = fopen(outfilename, "wb"); } else { out = stdout; #ifdef WIN32 setmode(fileno(stdout), O_BINARY); #endif } if (!out) { cerr << "Couldn't open " << outfilename << "\n"; throw false; } png_init_io(png_ptr, out); int pngFormat; switch (mPixelFormat) { case aggCanvas::RGBA8_Blend: case aggCanvas::RGBA16_Blend: pngFormat = PNG_COLOR_TYPE_RGB_ALPHA; break; case aggCanvas::RGB8_Blend: case aggCanvas::RGB16_Blend: pngFormat = PNG_COLOR_TYPE_RGB; break; case aggCanvas::Gray8_Blend: case aggCanvas::Gray16_Blend: pngFormat = PNG_COLOR_TYPE_GRAY; break; default: throw "Unknown pixel format"; } int width = mFullWidth; int height = mFullHeight; int srcx = 0; int srcy = 0; if (mCrop) { width = cropWidth(); height = cropHeight(); srcx = cropX(); srcy = cropY(); } if (frame == -1 && !mQuiet) { cerr << endl << "Writing " << width << "w x " << height << "h pixel image..." << endl; } png_set_IHDR(png_ptr, info_ptr, width, height, (mPixelFormat & Has_16bit_Color) + 8, pngFormat, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); png_text comments[1]; memset(comments, 0, sizeof(comments)); comments[0].compression = PNG_TEXT_COMPRESSION_NONE; comments[0].key = (char*)"Software"; comments[0].text = (char*)"Context Free"; comments[0].text_length = strlen(comments[0].text); png_set_text(png_ptr, info_ptr, comments, sizeof(comments)/sizeof(comments[0])); png_write_info(png_ptr, info_ptr); png_bytep rowPtr = mData + srcy * mStride + srcx * aggCanvas::BytesPerPixel[mPixelFormat]; for (int r = 0; r < height; ++r) { if (mPixelFormat == aggCanvas::RGBA8_Blend) { // Convert each row to non-premultiplied alpha as per PNG spec // This is done in a separate array instead of in-situ because // for animations the main buffer might be drawn into again for (int c = 0; c < width * 4; c += 4) { agg::rgba8 pix(rowPtr[c + 0], rowPtr[c + 1], rowPtr[c + 2], rowPtr[c + 3]); pix.demultiply(); row[c + 0] = pix.r; row[c + 1] = pix.g; row[c + 2] = pix.b; row[c + 3] = pix.a; } png_write_row(png_ptr, row); } else if (mPixelFormat == aggCanvas::RGBA16_Blend) { // Ditto for rgba16 png_uint_16p rowPtr16 = (png_uint_16p)rowPtr; for (int c = 0; c < width * 4; c += 4) { agg::rgba16 pix(rowPtr16[c + 0], rowPtr16[c + 1], rowPtr16[c + 2], rowPtr16[c + 3]); pix.demultiply(); row16[c + 0] = htons(pix.r); // Also convert to network byte order row16[c + 1] = htons(pix.g); row16[c + 2] = htons(pix.b); row16[c + 3] = htons(pix.a); } png_write_row(png_ptr, (png_bytep)row16); } else if (mPixelFormat & Has_16bit_Color) { // Convert rgb16/gray16 to network byte order png_uint_16p rowPtr16 = (png_uint_16p)rowPtr; for (int c = 0; c < width * (BytesPerPixel[mPixelFormat] >> 1); ++c) row16[c] = htons(rowPtr16[c]); png_write_row(png_ptr, (png_bytep)row16); } else { png_write_row(png_ptr, rowPtr); } rowPtr += mStride; } png_write_end(png_ptr, 0); if (out != stdout) { if (fclose(out) != 0) throw "File I/O error!?!?!"; out = 0; } } catch (const char* msg) { cerr << "***" << msg << endl; } catch (bool) { } if (row) delete[] row; if (row16) delete[] row16; if (out && out != stdout) fclose(out), out = 0; if (png_ptr) png_destroy_write_struct(&png_ptr, &info_ptr); } contextfree-3.0.5+dfsg1.orig/src-unix/posixSystem.cpp0000644000175000017500000001046112076364074021266 0ustar brambram// posixSystem.cpp // Context Free // --------------------- // Copyright (C) 2005-2007 Mark Lentczner - markl@glyphic.com // Copyright (C) 2007-2008 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // Mark Lentczner can be contacted at markl@glyphic.com or at // Mark Lentczner, 1209 Villa St., Mountain View, CA 94041-1123, USA // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #include "posixSystem.h" #include #include "stdarg.h" #include #include #include #include #include #include using namespace std; void PosixSystem::message(const char* fmt, ...) { if (mQuiet && !mErrorMode) return; char buf[256]; { va_list args; va_start(args, fmt); vsnprintf(buf, sizeof(buf), fmt, args); buf[sizeof(buf)-1] = '\0'; va_end(args); } cerr << buf << " " << endl; } void PosixSystem::syntaxError(const CfdgError& err) { // this version doesn't high-light the line in error // the parser will have already called message() with // the syntax error information error(); message("Error in %s at line %d - %s", err.where.begin.filename->c_str(), err.where.begin.line, err.what); } bool PosixSystem::error(bool errorOccurred) { mErrorMode = mErrorMode || errorOccurred; return mErrorMode; } istream* PosixSystem::openFileForRead(const string& path) { if (path == "-") { if (!mInputBuffer) { mInputBuffer = new string(istreambuf_iterator(cin), istreambuf_iterator()); } return new istringstream(*mInputBuffer, ios::binary); } return new ifstream(path.c_str(), ios::binary); } istream* PosixSystem::tempFileForRead(const string& path) { return new ifstream(path.c_str(), ios::binary); } PosixSystem::~PosixSystem() { delete mInputBuffer; } ostream* PosixSystem::tempFileForWrite(string& prefixInNameOut) { #ifdef WIN32 char* path = _tempnam(0, prefixInNameOut.c_str()); prefixInNameOut = path; ofstream* f = new ofstream(path, ios::binary | ios::out | ios::trunc); free((void*)path); return f; #else string t = "/tmp/" + prefixInNameOut + "XXXXXX"; char* b = new char[t.size() + 1]; strcpy(b, t.c_str()); ofstream* f = 0; // Please ignore the warning about mktemp() being unsafe. There is no // standard way to turn the descriptor returned by mkstemp() into an // ostream object. We could add the boost library to the project (NO!!!!) // or roll our own file descriptor ostream class (code exists on the // internet). But it just doesn't seem worth the bother. mktemp() is // unsafe for some types of programs, but who cares if an attacker takes // down your Context Free. if (mktemp(b)) { f = new ofstream; f->open(b, ios::binary); prefixInNameOut = b; } delete b; return f; #endif } string PosixSystem::relativeFilePath(const string& base, const string& rel) { string s = base; string::size_type i = s.rfind('/'); if (i == string::npos) { return rel; } i += 1; s.replace(i, s.length() - i, rel); return s; } void PosixSystem::stats(const Stats& s) { if (mQuiet || mErrorMode) return; cerr << " " << s.shapeCount << " shapes"; if (s.toDoCount > 0) cerr << " - " << s.toDoCount << " expansions to do"; else cerr << " "; cerr << " \r"; cerr.flush(); } contextfree-3.0.5+dfsg1.orig/src-unix/main.cpp0000644000175000017500000004572012076364074017651 0ustar brambram/* * Context Free Design Grammar - version 0.1 Copyright (C) 2005 Chris Coyne - ccoyne77@gmail.com Copyright (C) 2005-2008 Mark Lentczner - markl@glyphic.com Copyright (C) 2008-2012 John Horigan - john@glyphic.com [Send me anything cool you make with it or of it.] This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include #include #include #include #ifdef _WIN32 #include "getopt.h" #else #include #endif #include #include "cfdg.h" #include "variation.h" #ifdef _WIN32 #include "WinPngCanvas.h" #else #include "pngCanvas.h" #endif #include "SVGCanvas.h" #include "ffCanvas.h" #include "posixSystem.h" #include "version.h" #include "Rand64.h" #include "makeCFfilename.h" #include using namespace std; void setupTimer(Renderer* renderer); ostream* myCout = &cerr; const char* invokeName = ""; static Renderer* TheRenderer = 0; #ifdef _WIN32 #include BOOL CtrlHandler(DWORD ctrlType) { if (!TheRenderer) return FALSE; if (ctrlType != CTRL_C_EVENT && ctrlType != CTRL_BREAK_EVENT) return FALSE; #else #include void termination_handler(int signum) { if (!TheRenderer) return; #endif if (!TheRenderer->requestFinishUp) { TheRenderer->requestFinishUp = true; cerr << endl << "Render interrupted, drawing current shapes" << endl; } else if (!TheRenderer->requestStop) { TheRenderer->requestStop = true; cerr << endl << "Render interrupted, skipping drawing, cleaning up temporary files" << endl; } else { exit(9); } #ifdef _WIN32 return TRUE; #endif } void usage(bool inError) { ostream& out = inError ? cerr : *myCout; out << APP_NAME(invokeName) << " - " << APP_VERSION() << "(v" << APP_BUILD() << ")" << endl; out << endl; out << "Usage: " << endl << APP_NAME(invokeName) << " [options] input.cfdg [output.png/svg]" << endl; out << " or to pipe a cfdg file on standard input:" << endl; out << APP_NAME(invokeName) << " [options] - [output.png/svg]" << endl; out << "If the output file name is omitted and the " << APP_OPTCHAR() << "o option and the " << APP_OPTCHAR() << "C option are not used" << endl; out << "then the output will be sent to stdout." << endl << endl; out << "Options: " << endl; out << " " << APP_OPTCHAR() << "w num width in pixels(png) or mm(svg) (default 500)" << endl; out << " " << APP_OPTCHAR() << "h num height in pixels(png) or mm(svg) (default 500)" << endl; out << " " << APP_OPTCHAR() << "s num set both width and height in pixels/mm" << endl; out << " " << APP_OPTCHAR() << "s WIDTHxHEIGHT" << endl; out << " set width to WIDTH and height to HEIGHT in pixels/mm" << endl; out << " " << APP_OPTCHAR() << "T num multiply tiled output size by num in width and height" << endl; out << " " << APP_OPTCHAR() << "T WIDTHxHEIGHT" << endl; out << " multiply tiled output size by WIDTH in width and HEIGHT in height" << endl; out << " " << APP_OPTCHAR() << "m num maximum number of shapes (default none)" << endl; out << " " << APP_OPTCHAR() << "x float minimum size of shapes in pixels/mm (default 0.3)" << endl; out << " " << APP_OPTCHAR() << "b float border size [-1,2]: -1=-8 pixel border, 0=no border," << endl; out << " 1=8 pixel border, 2=variable-sized border" << endl; out << " " << APP_OPTCHAR() << "v str set the variation code (default is random)" << endl; out << " " << APP_OPTCHAR() << "o str set the output file name, supports variable expansion" << endl; out << " %f expands to the animation frame number," << endl; out << " %v and %V expands to the variation code in lower or upper case," << endl; out << " %% expands to %" << endl; out << " " << APP_OPTCHAR() << "a num generate num animation frames at 15fps (PNG or Quicktime only)" << endl; out << " " << APP_OPTCHAR() << "a TIMExFPS" << endl; out << " generate TIMExFPS animation frames at specified fps (PNG or Quicktime only)" << endl; out << " " << APP_OPTCHAR() << "z zoom out during animation" << endl; out << " " << APP_OPTCHAR() << "V generate SVG (vector) output" << endl; out << " " << APP_OPTCHAR() << "Q generate Quicktime movie output" << endl; #ifdef _WIN32 out << " " << APP_OPTCHAR() << "W generate desktop wallpaper output" << endl; #endif out << " " << APP_OPTCHAR() << "c crop image output" << endl; out << " " << APP_OPTCHAR() << "q quiet mode, suppress non-error output" << endl; out << " " << APP_OPTCHAR() << "C Check syntax, check syntax of cfdg file and exit" << endl; out << " " << APP_OPTCHAR() << "t time output, output the time taken to render the cfdg file" << endl; out << " " << APP_OPTCHAR() << "? show this message, then exit" << endl; out << endl; exit(inError ? 2 : 0); } struct options { enum OutputFormat { PNGfile = 0, SVGfile = 1, MOVfile = 2, BMPfile = 3 }; int width; int height; int widthMult; int heightMult; int maxShapes; float minSize; float borderSize; int variation; bool crop; bool check; int animationFrames; int animationTime; int animationFPS; bool animationZoom; const char* input; const char* output; const char* output_fmt; OutputFormat format; bool quiet; bool outputTime; bool outputStdout; bool outputWallpaper; options() : width(500), height(500), widthMult(1), heightMult(1), maxShapes(0), minSize(0.3F), borderSize(2.0F), variation(-1), crop(false), check(false), animationFrames(0), animationTime(0), animationFPS(15), animationZoom(false), input(0), output(0), output_fmt(0), format(PNGfile), quiet(false), outputTime(false), outputStdout(false), outputWallpaper(false) { } }; int intArg2(char arg, const char* str, int& x, int& y) { char* end; long int v = -1; v = strtol(str, &end, 10); if (end == str || v <= 0) { if (arg == '-') cerr << "Argument must be a positive integer or a pair of positive integers (e.g., 500x300)" << endl; else cerr << "Option -" << arg << " takes a positive integer argument or a pair of positive integers (e.g., 500x300)" << endl; usage(true); } x = (int)v; if (*end == 'x') { str = end + 1; v = strtol(str, &end, 10); if (end == str || v <= 0) { if (arg == '-') cerr << "Argument must be a positive integer or a pair of positive integers (e.g., 500x300)" << endl; else cerr << "Option -" << arg << " takes a positive integer argument or a pair of positive integers (e.g., 500x300)" << endl; usage(true); } y = (int)v; } else { y = x; return 1; } return 2; } int intArg(char arg, const char* str) { char* end; long int v = -1; v = strtol(str, &end, 10); if (end == str || v <= 0) { if (arg == '-') cerr << "Argument must be a positive integer" << endl; else cerr << "Option -" << arg << " takes a positive integer argument" << endl; usage(true); } return (int)v; } float floatArg(char arg, const char* str) { float v = (float)atof(str); if (v < 0) { if (arg == '-') cerr << "Argument must be a positive float" << endl; else cerr << "Option -" << arg << " takes a positive float argument" << endl; usage(true); } return v; } #ifdef _WIN32 #define OPTCHARS ":w:h:s:m:x:b:v:a:o:T:cCVzqQtW?" #else #define OPTCHARS ":w:h:s:m:x:b:v:a:o:T:cCVzqQt?" #endif void processCommandLine(int argc, char* argv[], options& opt) { extern char *optarg; extern int optind, optopt; invokeName = argv[0]; int i; while ((i = getopt(argc, argv, OPTCHARS)) != -1) { char c = (char)i; switch(c) { case 'w': opt.width = intArg(c, optarg); break; case 'h': opt.height = intArg(c, optarg); break; case 's': intArg2(c, optarg, opt.width, opt.height); break; case 'T': intArg2(c, optarg, opt.widthMult, opt.heightMult); break; case 'm': opt.maxShapes = intArg(c, optarg); break; case 'x': opt.minSize = floatArg(c, optarg); break; case 'b': opt.borderSize = (float)atof(optarg); if (opt.borderSize < -1 || opt.borderSize > 2) usage(true); break; case 'v': opt.variation = Variation::fromString(optarg); break; case 'o': opt.output_fmt = optarg; break; case 'a': { int fps = 15, time = 0; if (opt.format == options::SVGfile) usage(true); if (intArg2(c, optarg, time, fps) == 2) { opt.animationTime = time; opt.animationFPS = fps; opt.animationFrames = time * fps; } else { opt.animationTime = time / opt.animationFPS; opt.animationFrames = time; } break; } case 'V': if (opt.format != options::PNGfile) usage(true); opt.format = options::SVGfile; break; case 'Q': if (opt.format != options::PNGfile || opt.crop) usage(true); opt.format = options::MOVfile; break; case 'W': if (opt.format != options::PNGfile || opt.crop) usage(true); opt.format = options::BMPfile; opt.outputWallpaper = true; break; case 'c': if (opt.format == options::MOVfile) usage(true); opt.crop = true; break; case 'C': opt.check = true; break; case 'z': opt.animationZoom = true; break; case ':': cerr << "Option -" << (char)optopt << " requires an argument" << endl; usage(true); break; case '?': if (optopt == '?') usage(false); cerr << "Unrecognized option: -" << optopt << endl; usage(true); break; case 'q': opt.quiet = true; break; case 't': opt.outputTime = true; break; } } if (optind < argc) { opt.input = argv[optind++]; } if (optind < argc && !opt.output_fmt) { opt.output = argv[optind++]; } if (optind < argc) { cerr << "Too many arguments" << endl; usage(true); } if (!opt.input) { cerr << "Missing input file" << endl; usage(true); } if ((!opt.output || strcmp(opt.output, "-") == 0) && !opt.output_fmt && !opt.check) { opt.outputStdout = true; opt.output_fmt = "-"; opt.quiet = true; } } class nullstreambuf : public streambuf { protected: int overflow(int c) { return c; } }; class nullostream : public ostream { public: nullostream() : ostream (new nullstreambuf()) {} }; static nullostream cnull; int main (int argc, char* argv[]) { options opts; int var = Variation::random(6); #ifdef _WIN32 SetConsoleCtrlHandler((PHANDLER_ROUTINE)CtrlHandler, TRUE); #else struct sigaction new_action, old_action; new_action.sa_handler = termination_handler; sigemptyset(&new_action.sa_mask); new_action.sa_flags = 0; sigaction(SIGINT, NULL, &old_action); if (old_action.sa_handler != SIG_IGN) sigaction(SIGINT, &new_action, NULL); #endif processCommandLine(argc, argv, opts); if (opts.quiet) myCout = &cnull; clock_t startTime = clock(); clock_t fromTime = startTime; clock_t clocksPerMsec = CLOCKS_PER_SEC / 1000; if (opts.variation < 0) opts.variation = var; char code[Variation::maxStringLength]; Variation::toString(opts.variation, code, false); PosixSystem system(opts.quiet);; CFDG* myDesign = CFDG::ParseFile(opts.input, &system, opts.variation); if (!myDesign) return 1; if (opts.check) return 0; if (opts.widthMult != 1 || opts.heightMult != 1) { if (!myDesign->isTiled() && !myDesign->isFrieze()) { cerr << "Tiled output multiplication only allowed for tiled or frieze designs." << endl; return 6; } if (opts.format != options::PNGfile && opts.format != options::BMPfile) { cerr << "Tiled output multiplication only allowed for PNG output." << endl; return 6; } } // If a static output file name is provided then generate an output // file name format string by escaping any '%' characters. If this is // an animation run then add "_%f" before the extension. string newOutput; if (!opts.output_fmt) { stringstream escname(stringstream::out); for (const char* p = opts.output; *p; ) { const char* perc = strchr(p, '%'); if (perc) { escname.write(p, perc-p); escname << "%%"; p = perc + 1; } else { escname << p; break; } } newOutput = escname.str(); if (opts.animationFrames && opts.format != options::MOVfile) { #ifdef _WIN32 const char dirchar = '\\'; #else const char dirchar = '/'; #endif size_t ext = newOutput.find_last_of('.'); size_t dir = newOutput.find_last_of(dirchar); if (ext != string::npos && (dir == string::npos || ext > dir)) { newOutput.insert(ext, "_%f"); } else { newOutput.append("_%f"); } } opts.output_fmt = newOutput.c_str(); } bool useRGBA = myDesign->usesColor; aggCanvas::PixelFormat pixfmt = aggCanvas::SuggestPixelFormat(myDesign); bool use16bit = pixfmt & aggCanvas::Has_16bit_Color; const char* fmtnames[4] = { "PNG image", "SVG vector output", "Quicktime movie", "Wallpaper BMP image" }; *myCout << "Generating " << (use16bit ? "16bit " : "8bit ") << (useRGBA ? "color" : "gray-scale") << ' ' << fmtnames[opts.format] << ", variation " << code << "..." << endl; pngCanvas* png = 0; SVGCanvas* svg = 0; ffCanvas* mov = 0; Canvas* myCanvas = 0; TheRenderer = myDesign->renderer(opts.width, opts.height, opts.minSize, opts.variation, opts.borderSize); if (TheRenderer == 0) { return 9; } TheRenderer->setMaxShapes(opts.maxShapes); TheRenderer->run(NULL, false); opts.width = TheRenderer->m_width; opts.height = TheRenderer->m_height; opts.crop = opts.crop && !(myDesign->isTiled() || myDesign->isFrieze()); switch (opts.format) { case options::BMPfile: case options::PNGfile: { png = new pngCanvas(opts.output_fmt, opts.quiet, opts.width, opts.height, pixfmt, opts.crop, opts.animationFrames, opts.variation, opts.format == options::BMPfile, TheRenderer, opts.widthMult, opts.heightMult); myCanvas = (Canvas*)png; if (png->mWidth != opts.width || png->mHeight != opts.height) { TheRenderer->resetSize(png->mWidth, png->mHeight); opts.width = TheRenderer->m_width; opts.height = TheRenderer->m_height; } break; } case options::SVGfile: { string name = makeCFfilename(opts.output_fmt, 0, 0, opts.variation); svg = new SVGCanvas(name.c_str(), opts.width, opts.height, opts.crop); myCanvas = (Canvas*)svg; break; } case options::MOVfile: { string name = makeCFfilename(opts.output_fmt, 0, 0, opts.variation); mov = new ffCanvas(name.c_str(), pixfmt, opts.width, opts.height, opts.animationFPS); if (mov->mError) { cerr << "Failed to create movie file: " << mov->mError << endl; exit(8); } myCanvas = (Canvas*)mov; break; } } if (system.error(false) || TheRenderer->requestStop) { setupTimer(0); Renderer::AbortEverything = true; delete TheRenderer; TheRenderer = 0; return 5; } if (opts.outputTime) { clock_t toTime = clock(); clock_t runTime = (toTime - fromTime) / clocksPerMsec; *myCout << "The cfdg file took " << runTime << " msec to execute." << endl; fromTime = toTime; } if (!opts.quiet) setupTimer(TheRenderer); if (opts.animationFrames) { TheRenderer->animate(myCanvas, opts.animationFrames, opts.animationZoom); } else { TheRenderer->draw(myCanvas); } *myCout << endl; if (!opts.quiet) setupTimer(0); *myCout << "DONE!" << endl; *myCout << "The output file name is " << makeCFfilename(opts.output_fmt, 0, 0, opts.variation) << endl; if (opts.outputTime) { clock_t toTime = clock(); clock_t runTime = (toTime - fromTime) / clocksPerMsec; *myCout << "The cfdg file took " << runTime << " msec to render." << endl; runTime = (toTime - startTime) / clocksPerMsec; *myCout << "The cfdg file took a total of " << runTime << " msec to process." << endl; } delete png; delete svg; delete mov; Renderer::AbortEverything = true; delete TheRenderer; TheRenderer = 0; return 0; } contextfree-3.0.5+dfsg1.orig/src-unix/posixTimer.cpp0000644000175000017500000000337112076364074021064 0ustar brambram// posixTimer.cpp // Context Free // --------------------- // Copyright (C) 2008-2011 John Horigan // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #include "cfdg.h" #include #include Renderer* runningRenderer = 0; void statusTimer(int signal) { if (runningRenderer) runningRenderer->requestUpdate = true; } void setupTimer(Renderer* renderer) { runningRenderer = renderer; if (renderer) { struct sigaction doit; doit.sa_handler = statusTimer; sigemptyset(&doit.sa_mask); doit.sa_flags = SA_RESTART; sigaction(SIGALRM, &doit, 0); itimerval period; period.it_interval.tv_sec = 0; period.it_interval.tv_usec = 250000; // 1/4 second period.it_value = period.it_interval; setitimer(ITIMER_REAL, &period, 0); } else { itimerval period; period.it_interval.tv_sec = 0; period.it_interval.tv_usec = 0; period.it_value = period.it_interval; setitimer(ITIMER_REAL, &period, 0); } } contextfree-3.0.5+dfsg1.orig/src-unix/pngCanvas.h0000644000175000017500000000324112076364074020302 0ustar brambram// pngCanvas.h // Context Free // --------------------- // Copyright (C) 2005-2007 Mark Lentczner - markl@glyphic.com // Copyright (C) 2007-2012 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // Mark Lentczner can be contacted at markl@glyphic.com or at // Mark Lentczner, 1209 Villa St., Mountain View, CA 94041-1123, USA // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #include "abstractPngCanvas.h" class pngCanvas : public abstractPngCanvas { public: pngCanvas(const char* outfilename, bool quiet, int width, int height, PixelFormat pixfmt, bool crop, int frameCount, int variation, bool wallpaper, Renderer *r, int mx, int my) : abstractPngCanvas(outfilename, quiet, width, height, pixfmt, crop, frameCount, variation, wallpaper, r, mx, my) { } protected: virtual void output(const char * outfilename, int frame = -1); }; contextfree-3.0.5+dfsg1.orig/src-unix/posixVersion.cpp0000644000175000017500000000244512076364074021432 0ustar brambram// posixVersion.cpp // Context Free // --------------------- // Copyright (C) 2008-2013 John Horigan // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #include "version.h" #include const char* APP_NAME(const char* argv0) { if (argv0 == 0) return "cfdg"; const char* dir = strrchr(argv0, '/'); if (dir) return dir + 1; return argv0; } const char* APP_VERSION() { return "3.0.5"; } int APP_BUILD() { return 21; } char APP_OPTCHAR() { return '-'; } contextfree-3.0.5+dfsg1.orig/src-osx/0000755000175000017500000000000012245646004016031 5ustar brambramcontextfree-3.0.5+dfsg1.orig/src-osx/ImageCanvas.mm0000644000175000017500000000337312076364074020556 0ustar brambram// ImageCanvas.mm // this file is part of Context Free // --------------------- // Copyright (C) 2006 Mark Lentczner - markl@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // Mark Lentczner can be contacted at markl@glyphic.com or at // Mark Lentczner, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #import "imagecanvas.h" #import #import "GView.h" #import "BitmapImageHolder.h" ImageCanvas::ImageCanvas(GView* view, BitmapImageHolder* bitmap, PixelFormat format) : aggCanvas(format), mView(view) { attach([bitmap bitmapData], [bitmap pixelsWide], [bitmap pixelsHigh], [bitmap bytesPerRow]); } ImageCanvas::~ImageCanvas() { } void ImageCanvas::start(bool clear, const agg::rgba& background, int width, int height) { aggCanvas::start(clear, background, width, height); } void ImageCanvas::end() { aggCanvas::end(); [mView performSelectorOnMainThread: @selector(redisplayImage:) withObject: [NSValue valueWithRect: NSMakeRect(cropX(), cropY(), cropWidth(), cropHeight())] waitUntilDone: YES]; } contextfree-3.0.5+dfsg1.orig/src-osx/ClassDesign.xcclassmodel/0000755000175000017500000000000012245646004022710 5ustar brambramcontextfree-3.0.5+dfsg1.orig/src-osx/ClassDesign.xcclassmodel/layout0000644000175000017500000013543212076364074024166 0ustar brambrambplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver Trootn %& 0` uvz  &*4>?CGILOWXY[_imw   !+,0469<DEFHLVZdnoswy|  ",67;?ADGOPQSWaeoyz~ $%)-/25=>?AEIJOZ`cfjsvy|^   $ 09:;? LRUWX]behloru{  9:  9:   %*,0258=FJ V9:_c oqrw|~ 9:  9:  "&(+.4=A LUY e9:nr ~  9:   #,0 <9:EI UWX]bdhjmpv  9:      9:  !  - / 0 5 : < @ B E H N W [  g p t  9:         9:           % . 2  >9: G K  W Y Z _ d f j l o r w   9:         9:        " & ( + . 4 = A  L U Y  e9: n r  ~    9:          #9: , 0  < > ? D I K O Q T W ] f j  v    9:         9:      ! & + - 1 3 6 9 ? H L  X a e  q9: z ~        9:   !*. :CG S9:\` lnxy~  9:   %.2 >9:GK WYcdinptvy|  9:   )9:26 BDNOTY[_adgmvz  9:   9:! -/1   #%(*-/2479<>ACFHKMPRUWZ\_adfiknpqrstuvwxyz{|}~U$null ZNS.objectsWNS.keysV$classge^USER_MODEL_KEY\DISPLAY_SPEC !"#$U_nameXmappings__autoManageElements^diagramStorage__refreshElements f_src-common_2.xcclassmodel'()*+,-.+ZXDDelegate_XDDiagramControllerZXDGraphics\XDDataSource ܀ 1_-23456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^ $5FVfvˀۀȀʀڀueCTE24"̀2Tv,abc'defghij"l+nopqrst]XDHeadLineEnd_XDDiagramStorage_XDHeadConnection_XDTailConnection_XDDrawingStylesXXDBoundsZXDLineTypeZXDUniqueID^XDGraphicFlags ! #4j_{{1448.17, 63}, {1.66675, 225}} wyx {|}~q2XXDShadow_XDShadowStyleFlagsYXDGraphic _NSShadowBlurRadius\NSShadowVert"A"X$classesZ$classnameXNSShadowXNSObject]XDShadowStyle^XDDrawingStyleWNSArrayVXDUUIDYNS.string_$72691239-0F38-4779-B39A-4ED2FA829F95_NSMutableStringXNSString[XDGraphicID}q2\XDIdentifierYXDLineGap^XDLineEndFlagsWXDSlopeWXDWidthXXDOriginUXDGap\XDBezierPathVXDName" "?_XDEmptyArrowLineEnd[Empty Arrow]{1448.17, 63}_{-1.66675, -225}ZNSFlatness[NSLineWidthZNSSegments"?"@O-A@@A@Ģ\NSBezierPathǢYXDLineEnd}X2_XDTargetGraphic *b'efhi+"+_XDCollapsedCompartments^XDCompartments_XDCompartmentGraphicFlags  Lzޢ\XDConnection}U2̀" *b'efhi+"+ۀ  L}]XDLineGraphicabc'defghi"+qr+1 3&%#)j_{{282, 414}, {0, 37}} y'{|}q3($* _$999B85EA-D067-4372-99D6-D1D0B98A9E2C} q3,/.$0-Z{282, 414}X{0, -37}}S3̀2$ *b'efhi+"+!"#%ۀ h IHPLN}T3̀4$ *b'efhi+"-+/013ۀ  jiqLoabc'defghi5"7+9:;qr=<B D76#:_{{167.598, 162}, {78.3415, 44}} @yA8{|}Dq495J;M_$79D02A88-6817-46CB-A546-FBC5A9FD00B8}PqQR4TV=@?5A>^{245.939, 162}^{78.3415, -44}}P4̀C5 *b'efhi+"b+defhۀ  L}R4̀E5 *b'efhi+"p+rstvۀ G 0/7L5abc'defghix"z+|}~qrMS UHG#K_{{286, 80}, {0, 37}} yI{|}q5JFL_$35B58716-A2B0-4FFE-9383-65D16D7D657F}q5NQPFROY{286, 80}}Q5̀TF *b'efhi+"+ۀ . L}P5̀CF abc'defghi"+qr]c dXW#[_{{286, 162}, {0, 44}} yY{|}q6ZV\_$03DA5701-AC84-4125-BF68-50350B239441}q6р^a`Vb_Z{286, 162}X{0, -44}}P6̀CV }O6̀eV *b'efhi+"+ۀ  Ձԁ܁Labc'defghi"+qrtms thg#k_{{326.061, 162}, {78.3415, 44}} yi{|}q7jfl_$F2424B11-9243-4ED9-B6C6-3603ABA65D7E}q7 nqpfro^{326.061, 162}_{-78.3415, -44}}P7̀Cf }N7̀uf *b'efhi+"+ ۀ Ӏ ÁLabc'defghi""$+&'(qr*} xw#{_{{881.394, 63}, {379.213, 336}} -y.y{|}1q8zv7|:_$84AF0764-6906-48BE-B51E-D48526398318}=q>?8AC~v]{1260.61, 63}_{379.213, -336}}M8̀v *b'efhi+"O+QRSUۀ  L}L8̀v *b'efhi+"]+_`acۀ  zyLabc'defghie"g+ijkqrm #_{{103, 81}, {0, 37}} pyq{|}tq9z}_$556FD04B-E29B-4525-85E7-009C4F71E865}q9Y{103, 81}}J9̀ *b'efhi+"+ۀ W 87?L=}K9̀ *b'efhi+"+ۀ x YX`L^abc'defghi"+qr #_{{585.03, 224}, {32.9391, 37}} y{|}q:_$E6D633AC-1BF9-4D2D-9317-5692F860B4AE}q:Ȁ]{617.97, 224}^{32.9391, -37}}B:̀ *b'efhi+"+ۀ n NMVLT}I:̀ *b'efhi+"+ۀ 6 Labc'defghi"+qr #_{{883.7, 126}, {221.6, 180}} y{|}q;_$91692499-FDBA-47FB-830B-7735A57853BF}q;  ]{1105.3, 126}]{221.6, -180}}G;̀ *b'efhi+"+ۀ  Ձԁ܁L}H;̀ *b'efhi+"%+'()+ۀ  Labc'defghi-"/+123qr5ǀ ɀ#_{{644.54, 306}, {56.9653, 135}} 8y9{|}<q<BE_$CF7C158A-E30D-443E-BBDB-4B7BFE0036E4}HqIJ<LN€ŀĀƀ^{701.506, 306}_{56.9653, -135}}A<̀Ȁ *b'efhi+"Z+\]^`ۀ J   L}E<̀ʀ *b'efhi+"h+jklnۀ  Labc'defghip"r+tuvqrxҀ؀ ـ̀̀#_{{651.799, 306}, {39.1708, 44}} {y|΀{|}q=πˀр_$002885BB-25EC-4CCE-BC89-0F90BCAACE4D}q=ӀրՀˀ׀]{690.97, 306}^{39.1708, -44}}A=̀Ȁˀ }F=̀ڀˀ *b'efhi+"+ۀ Ӏ ÁLabc'defghi"+qr ݀܀#_ {{644.935, 306}, {58.9013, 185}} yހ{|}q>߀ۀ_$08E0FE28-B9A7-4BD4-84C7-9607F0293BAA}q>ʀۀ^{703.836, 306}_{58.9013, -185}}A>̀Ȁۀ }C>̀ۀ *b'efhi+"+ۀ  poxLvabc'defghi"+qr #_{{648.598, 306}, {49.9219, 90}} y{|}q?_$278D71F6-5402-4DAE-95B1-A84B9B0FEFDD}q?]{698.52, 306}^{49.9219, -90}}A?̀Ȁ }D?̀ *b'efhi+"+ۀ  Labc'defghi"+ !qr#t  #_{{658.03, 224}, {32.9391, 37}} &y'{|}*q@03_$B2405C35-3A03-47AE-96FD-B62A3B23B20C}6q78@:<]{658.03, 224}_{-32.9391, -37}}B@̀ }A@̀Ȁ _{{647, 261}, {128, 45}} KyLM PQR}STUVAXY[XDFillColor_XDGradientColor_XDFillStyleFlags_XDGradientAngle ȁ"C[\]^_UNSRGB\NSColorSpaceO!0.77759999 0.83840001 0.95999998abbWNSColor[\d^_O!0.92586666 0.94613338 0.98666668ghhi_XDCompartmentGraphicFillStyle[XDFillStylekl}mnoAqr]XDStrokeColor_XDStrokeStyleFlags[XDLineWidthȁ"?[\t^_O!0.51839995 0.55893332 0.63999993wxx]XDStrokeStylez}_$E485B895-618D-48FC-8A6D-332780021F46 _:B,A_XDCompartmentGraphic[XDIconImage_XDCompartmentItem_XDCompartmentItemMinSizeWXDLabel_XDBackgroundColor_XDCompartmentFlagsȀ89@_/XDSCCompartmentGraphicNameCompartmentIdentifierZXDDataCell]XDCompartment7q_NSBackgroundColor[NSTextColor^XDButtonAction_XDCompartmentItemCellFlagsWXDImage_XDAlternateImageYNSSupportZNSContents_XDButtonDoubleAction^XDButtonTarget[NSCellFlags\NSCellFlags2#4&/56@PVNSSizeVNSNameXNSfFlags"A0\LucidaGrandeâVNSFontb\_[NSColorName]NSCatalogName"! VSystem_textBackgroundColor\_WNSWhiteB1b\_%$ YtextColor\_B0bVNSReps\NSImageFlags-'.(_#XDFlatRoundButton-Forward-Normal-13 _), y*+_/Library/Application Support/Apple/Developer Tools/Plug-ins/XDClassModel.xdplugin/Contents/Resources/XDFlatRoundButton-Forward-Normal-13.tiff^NSMutableArray\_D0 0WNSImageb-0.1_$XDFlatRoundButton-Forward-Pressed-13 _2, y*3_/Library/Application Support/Apple/Developer Tools/Plug-ins/XDClassModel.xdplugin/Contents/Resources/XDFlatRoundButton-Forward-Pressed-13.tiff__compartmentItemCellAction:_!_compartmentItemCellDoubleAction:    _XDCompartmentItemCell_NSTextFieldCell\NSActionCellVNSCellW{0, 15}AȀ;=A<9_5XDSCCompartmentGraphicAttributesCompartmentIdentifierZProperties!>7'q-#?=&/@6A3456ȀCEID9_5XDSCCompartmentGraphicOperationsCompartmentIdentifierZOperations<F7BC4I#G`E&/H6MNO^P^QZNSLocationXNSLength\NSRangeCountKSTTZNSIndexSetV}_{{574, 179}, {128, 45}} YyZ[ORPQR}S^_VBXYPQ[\c^_O!0.61559999 0.66373336 0.75999999[\f^_O 0.8718667 0.88791114 0.91999996kl}mioBqrS[\m^_O 0.41039997 0.44248888 0.5066666pUs_$CBF27958-1078-4455-8BFA-94D41849936E v_wxyW^f,B~XY]9Z7q#[Y&/\6B_ae`9b7C#ca&/d6Bgimh9j7C#ki&/l6MNO^P^QK_{{576, 491}, {128, 31}} ýqtPQR}SVCXYrs[\^_O!0.86847997 0.95999998 0.83520001[\^_O!0.95615995 0.98666668 0.94506669kl}moCqru[\^_O!0.57898659 0.63999993 0.55679995w_$2AD1201C-02D9-4D42-BD95-813B00473565 _y,Cz{9|7q#}{&/~6C  97C#&/6MNO^^^QK_{{576, 396}, {128, 31}} !y"#PQR}S'VDXYr[\^_kl}m-oDqr[\^_36_$2BED8C8E-5809-4650-8B41-79486936EA8F 9_:;,D@AB9G7MqAS#&/6DYZ[\9`7fCZl#&/6MNO^^^QK_{{574, 441}, {128, 31}} sytuPQR}SyVEXYrʁ[\^_kl}moEqrʁ[\^__$9FB48D45-5438-444A-9FDE-488841E56FDC _,Eʀ97q#&/6Eʀ97C#&/6MNO^^^QK_{{574, 350}, {128, 31}} yǁPQR}SVFXYrځ[\^_kl}moFqrځ[\^_€_$EA92BC46-6A4C-49A8-A8B5-2A634DCCFF09 _߁āˁ,FڀŁƁʀ9ǀ7q#ȁƁ&/Ɂ6Fڀ́΁ҁ̀9π7 C#Ё΁&/с6MNO^^^QK_{{1069, 81}, {128, 45}} yց؀PQR}STVGXY ׀[\d^_kl}m#oGqrـ[\t^_)ۀ,_$6BB4E6C9-546C-485D-B1C0-AA0ABF224D3C /_012݁,G789ށ߁9>0݁7Dq8I#߁&/6GOPQR9V7\CPb#&/6Ghijk9o7uCi{#&/6MNO^P^QK_{{792, 306}, {128, 45}} yPQR}STVHXY [\d^_kl}moHqr[\t^__$E5419874-214D-4EF9-BD12-BF55428B3CAB _ ,H97q#&/6H 9 7q# &/ 6H97C#&/6MNO^P^QK_{{501, 261}, {128, 45}} yPQR}STVIXY [\d^_kl}moIqr[\t^__$063570A9-B72D-4ED5-AD26-15EEEA9D3FA0 _&.,I  !%9"7q ##!&/$6I&'()')-(9-*73C'9#+)&/,6I?@AB/1509F27LC@R#31&/46MNO^P^QK_{{39, 36}, {128, 45}} YyZ[9;PQR}S^_VJXYP:[\f^_kl}meoJqr<[\m^_k>n_$ED660935-EF65-4B81-8866-4EAA5B608FED q_rst@GO,Jyz{ABF9C7qz#DB&/E6JHJNI9K7C#LJ&/M6JPRVQ9S7C#TR&/U6MNO^P^QK_{{39, 118}, {128, 45}} yǁZ\PQR}STVKXY [[\d^_kl}moKqr][\t^___$FEC6B277-CBC5-4F65-914D-A78B43048793 _ahp,Kbcg9d7q#ec&/f6K ikoj9 l7 q #mk&/n6K    qswr9 t7 $C  *#us&/v6MNO^P^QK_{{792, 399}, {128, 45}}  1y 2 3{}PQR}ST 7VLXY |[\d^_kl}m =oLqr~[\t^_ C F_$AFF4D5C3-C85E-4E63-A42E-50D90A09C692  I_ J K L,L Q R S9 X7 ^q R d#&/6L j k l m9 q7 wq k }#&/6L 9 7 C  #&/6MNO^P^QK_{{1222, 18}, {128, 45}}  y PQR}ST VMXY [\d^_kl}m oMqr[\t^_  _$8A1801F3-D97E-4B1E-9A8C-B569DE402400  _ ,M 9 7 q  #&/6M 9 7 C  #&/6M 9 7 C  #&/6MNO^P^QK_{{368, 206}, {128, 31}}  y PQR}S VNXYru[\^_kl}m oNqru[\^_ € _$8FB9A9B4-6CF8-47B2-AF95-D0551764FD91  !_ " #āˁ,N ( ) *uŁƁʀ9 /ǀ7 5q ) ;#ȁƁ&/Ɂ6N A B C Dú΁ҁ̀9 Hπ7 NC B T#Ё΁&/с6MNO^^^QK_{{222, 206}, {128, 31}}  [y \ ]ց؀PQR}S aVOXYr׀e[\^_kl}m goOqrـe[\^_ mۀ p_$F482934D-50D1-4D12-AAC8-FD221BC76D08  s_ t u݁,O z { |eށ߁9 t݁7 q { #߁&/6O e9 7 C  #&/6MNO^^^QK_{{222, 117}, {128, 45}}  y PQR}ST VPXY C[\d^_kl}m oPqrC[\t^_  _$DB29DAB7-B4A0-406B-B2A0-351594C243B5  _ ǁ,P C9 7 q  #&/6P C9 7 q  #&/6P C 9  7 C  # &/ 6MNO^P^QK_{{222, 35}, {128, 45}}  y  PQR}S^ VQXYPT[\f^_kl}m #oQqrT[\m^_ ) ,_$3F8A399B-E7A6-42A7-AD2B-B1FE70C56B7E  /_ 0 1 2&,Q 7 8 9T9 > 07 Dq 8 I#&/6Q O P Q RT!% 9 V"7 \C P b##!&/$6Q h i j kT')-(9 o*7 uC i {#+)&/,6MNO^P^QK_{{76, 206}, {128, 31}}  y 13PQR}S VRXYr2E[\^_kl}m oRqr4E[\^_ 6 _$E36E0566-6D43-40D4-A6AA-AC04D5010A1E  _ 8?,R E9:>9 ;7 q  #<:&/=6R E@BFA9 C7 C  #DB&/E6MNO^^^QK_{{218, 369}, {128, 45}}  y ցJLPQR}S^ VSXYPK2[\f^_kl}m oSqrM2[\m^_ O _$5D33E6F6-2E58-4018-800A-5B09589DC5A2  _ QX`,S 2RSW9 T7 q  #US&/V6S   2Y[_Z9 \7 C  #][&/^6S & ' ( )2acgb9 -d7 3q ' 9#ec&/f6MNO^P^QK_{{218, 451}, {128, 45}}  @y A BkmPQR}ST FVTXY l4[\d^_kl}m LoTqrn4[\t^_ Rp U_$47613CB0-B636-4DED-A253-99D24528A8C1  X_ Y Z [ry,T ` a b4stx9 gu7 mq a s#vt&/w6T y z { |4z|{9 }7 C z #~|&/6T 49 7 C  #&/6MNO^P^QK_{{1386, 288}, {128, 45}}  y PQR}ST VUXY "[\d^_kl}m oUqr"[\t^_  _$511EF2EA-54F8-4A1D-ABA0-182B544776FD  _ ǁ,U "9 7 q  #&/6U "9 7 C  #&/6U "9 7 C  #&/6MNO^P^QK*b'efhi+" +    ۀ ̀ L_{{1548, 450}, {128, 45}}  "y # $PQR}ST (VVXY [\d^_kl}m .oVqr[\t^_ 4 7_$0B454634-0034-4A34-A900-65D421D1BAB3  :_ ; < =ā,V B C D9 I7 Oq C U#&/6V [ \ ] ^Á9 b7 hC \ n#&/6V t u v wŁǁˁƀ9 {Ȁ7 C u #Ɂǁ&/ʁ6MNO^P^QK*b'efhi+" + ۀ  ρ΁ցL_{{1548, 288}, {128, 45}}  y ЁҀPQR}ST VWXY с́[\d^_kl}m oWqrӁ́[\t^_ Հ _$A67ED18C-30EF-4AE7-8A4A-7509A0B4C2CB  _ ׁށ,W ̀؁ف݀9 ڀ7 q  #ہف&/܁6W ̀߁9 7 C  #&/6W ̀9 7 C  #&/6MNO^P^QK_{{1384, 18}, {128, 45}} yPQR}ST VXXY [\d^_kl}moXqr[\t^__$5C4E92EF-6718-469B-8F14-C5987C121C97 _,X$%&9+71q%7#&/6X=>?@9D7JC>P#&/6XVWXY  9] 7cCWi#  &/ 6MNO^P^QK*b'efhi+"q+stuwۀ 1 L_{{1546, 369}, {128, 45}} zy{|PQR}STVYXY [\d^_kl}moYqr[\t^__$27B64870-9C34-4726-8BC7-76AF1BB0A758 _!),Y 97q#&/6Y"$(#9%7C#&$&/'6Y*,0+9-7C#.,&//6MNO^P^QK*b'efhi+"+ۀ S 43;L9_{{1069, 18}, {128, 45}} y57PQR}STVZXY 62[\d^_kl}moZqr82[\t^_:_$D36D8C10-52C4-4BAD-8A0D-7C385BE91BBB _   <CK,Z2=>B9 ?<7q"#@>&/A6Z()*+2DFJE9/G75C);#HF&/I6ZABCD2LNRM9HO7NCBT#PN&/Q6MNO^P^QK*b'efhi+"\+^_`bۀ u VU]L[_{{1386, 369}, {128, 45}} eyfgWYPQR}STkV[XY XT[\d^_kl}mqo[qrZT[\t^_w\z_$A0307602-9AFC-4AF9-8AA0-700CC9959404 }_~^em,[T_`d9a7q#b`&/c6[Tfhlg9i7C#jh&/k6[Tnpto9q7C#rp&/s6MNO^P^QK*b'efhi+"+ۀ  xwL}_{{1537, 18}, {128, 45}} y݁y{PQR}STV\XY zv[\d^_kl}mo\qr|v[\t^_~_$894E517B-29B6-4E5F-87F7-3501586B27D3 _,\v97q #&/6\v97 C&#&/6\,-./v9379C-?#&/6MNO^P^QK*b'efhi+"G+IJKMۀ  L_{{1098, 288}, {128, 45}} PyQRPQR}STVV]XY [\d^_kl}m\o]qr[\t^_be_$B677F8B3-C480-495A-95FC-C75616DC04FF h_ijk,]pqr9wi7}qq#&/6]97C#&/6]97C#&/6MNO^P^QK*b'efhi+"+ۀ ۀ ÁL_{{1098, 351}, {128, 45}} yǁPQR}STV^XY [\d^_kl}mo^qr[\t^_€_$4F2E054B-8929-4ED4-A619-25651645BA15 _āˁӁ,^ŁƁʀ9ǀ7q#ȁƁ&/Ɂ6^́΁ҁ̀9π7 C#Ё΁&/с6^ԁցځՀ9׀7$C*#؁ց&/ف6MNO^P^QK0bb 2`-3456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_89:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcd-abcdefghijklmnopqrstuvwxyz{|}~ށ   "$&(*,.0246e߀  F , nsM, }:z6   E  7 3 p e !& + U05!:#?%D'I)N+S-X/]1 b3g5}l7m_mmm7mm@m@mmmmmCm^mmmemmmmzm,mm-mmm m3m=mmVm;m4mwmm{mmmZmmymmmmZm_NSMutableDictionary\NSDictionary_XDSCTrackingUserModel]XDSCUserModel_XDModelReference!!#!!!#!!!!#!!#![showDerived_useClassifierFilter_showParameterList_showOperationProperties^showVisibility_showPropertyStereotypes_showClassStereotypes_showPropertyProperties_classifierFilter_operationsFilter[showDefault_propertiesFilter_showMultiplicity^showReturnTypeXshowType_useOperationsFilter_showOperationStereotypes[showPackage_usePropertiesFilter_sortDescriptors m   h yҁi#UNSKeyZNSSelector[NSAscendingjkl TnameXcompare:_NSSortDescriptor_XDSCDisplaySpecification#,1:LQV[] = C P [ c j o q t y { }      $ 9 D Z e r t v y { }              ! # % ' ) + . 1 3 6 9 < ? B E H u   7@CEGXav"+08AHJLU_ (09?LSUZ\^`egik&+8AFP]oqsu,9;=?lnpsux{~  !#%24=?AJqs!$'*-:<>@moqtvy|   %')2Y[  ,.02_acfhknqtw @Boqsuwy{}2468:<>@BD\ehjl}   13@BDFSUWY   "$&35>@BKrt 68:=?BEHKN{}"$QSUWY[]_m*,.1369<?Boqsuwy{}  :<>@BDFHRcertvx  BDFHJLNPRTu~      ! # % 3 B S U b d f h !!!2!4!6!8!:!!@!B!D!c!l!o!q!s!!!!!!!!!!!!""" " " """"!"/"@"B"O"Q"S"U""""""""""""""""""""""""##!###%#'#)#+#-#/#1#S#\#_#a#c#t#v#x#z##############$$$$$$5$7$D$F$H$J$w$y${$~$$$$$$$$$$$$$$$$$$$$%%%%%%% %"%$%&%H%Q%T%V%X%i%k%m%o%|%~%%%%%%%%%%%%%%&&&&&(&5&7&9&;&H&J&L&N&{&}&&&&&&&&&&&&&&&&&&&&'''''''')'+'4'6'8'A'h'j''''''''''''''''''''(,(.(0(3(5(8(;(>(A(D(q(s(u(w(y({(}(((((((((((((((((()))G)I)K)M)O)Q)S)U)c)r))))))))))))))))))))** *"*%*'***,*.*0*3*T*]*`*b*d*u*w*y*{***********+++++ ++*+;+=+J+L+N+P+]+_+a+c+}+++++++++++++,,,,,,(,L,N,Q,Z,_,g,t,,,,,,,,--- -)-+-.-3-@-d-g-p-w-------------...).=.X.`.t................//;/O/[/j////////////0000 000000000070>0G0L0O0R0T0a0j0o0v0000000000000001111 111%1(1+1@1G1T1W1Z1]1`1e11111111112C2L2S2b2o2t2w222222222222222222333333444"4+40484A4F4k4m4o4r4u4x4{4}4444444555555 5#5&5)5,5/515V5X5Z5]5`5c5f5h5k55555555666 6 6666666!626=6F6S6U6X6a6f6q6z666666666666677 7797<7Q7T7V7Y7f777777777777778 88888888!8.8183868o8r8u8x8{8~88888888888888888889999 9#9&9)9,9/9295979\9^9`9c9f9i9l9n9q9~99999999999999999: ::::!:#:<:?:B:D:G:T:x:{:::::::::;; ; ;;;>;@;I;N;Q;T;W;|;~;;;;;;;;;;;;;;;;;;;;;;;<#<%<'<*<-<0<3<5<8)>,>/>2>5>8>;>>>A>D>G>I>n>p>r>u>x>{>~>>>>>>>>>>>>>>>>>>????(?-?0?3?5?N?Q?T?V?Y?f?i?~????????????????@@@@@@@!@#@&@3@6@8@;@t@w@z@}@@@@@@@@@@@@@@@@@@@@@AAA"A%A(A+A.A1A4A7A:AN@NCNPNSNUNXNNNNNNNNNNNNNNNNNNNNNNNNOO9OSESHSKSNSQSvSxSzS}SSSSSSSSSSSSSSSSSSSSSTTT!T$T'T*T-T/T2T?TBTDTGTTTTTTTTTTTTTTTTTTTTTTTTTU(U+U.U1U4U7U:U=U@UCUFUHUYU\UvUUUUUUUUUUUUUUUUUUUUUVV+V-V6V=V@VCVFVIVnVpVrVuVxV{V}VVVVVVVVVVVVVVVVVVWWWWWW"W%W'W*W7W:WX@XQXTXnXwX|XXXXXXXXXXXXXXXXXXXXY#Y%Y.Y3Y6Y9Y[G[n[p[y[~[[[[[[[[[[[[[[[[\ \\\\\\\ \#\&\(\M\O\Q\T\W\Z\]\_\b\o\r\t\w\\\\\\\\\\\\\\\]] ]]]]-]0]3]5]8]E]H]]]`]b]e]r]u]~]]]]]]]]]]]]]]]^^^^^ ^^^^ ^U^X^[^^^a^d^g^j^m^p^r^^^^^^^^^^^^^^^____ _ ______?_A_C_F_I_L_O_Q_T_a_d_f_i_________________`````!`$`&`)`6`9`N`Q`S`V`c`f`o`r`t`}`````````````````aa aaaFaIaLaOaRaUaXa[a^aaacaaaaaaaaaaaaaaaaaaaabbbb b b0b2b4b7b:b=b@bBbEbRbUbWbZbbbbbbbbbbbbbbbbbbbbcccccc'c*c?cBcDcGcTcWc`cccecnccccccccccccccccccccd5d8d;d>dAdDdGdJdMdPdSdUdzd|d~ddddddddddddddddddddddeee+e4e9emcmemgmjmmmpmsmumxmmmmmmmmmmmmmmmmmmn'n)n+n.n0n3n6n9nxAxNxQxZx]x_xhxxxxxxxxxxxxxxxxxxxxxy5y8y;y>yAyDyGyJyMyPySyUyzy}yyyyyyyyyyyyyyyyyyyyyyyz#z&z(z+z.z1z4z6z9zFzIzKzNzzzzzzzzzzzzzzzzzzzzzzz{{{#{({+{.{0{I{L{O{R{U{b{e{z{}{{{{{{{{{{{{{{{{||||||"|$|&|)|6|9|<|?|t|w|z|}||||||||||||||||||||}}} }#}&})},}/}2}5}8}:}_}b}d}g}j}m}p}r}u}}}}}}}}}}}}}}}}}}~$~&~(~+~-~0~3~6~9~<~W~`~e~h~k~m~~~~~~~~~~~~~~~~~ #&),QTVY\_acfsvx{ !$]`cfilorux{}ŀȀʀ́ !$&7:giknpsvy|ȁˁ΁сԁ )PR[behkn 58:=@CFHKX[]`ރ BEHKNQTWZ]`bsvք߄ !69ACF!$')BEHKN[^svy|ʈ̈Ո܈߈ "/247psvy|ÉƉȉˉ؉ۉ݉"%(+.1479^acfiloqtŠŊȊˊΊъԊ׊ڊ݊nqtwz}‹ŋȋˋ΋ыԋ׋ڋ݋RUX[^adgjmpsvy|Čnjʌ͌Ќӌ֌ٌ܌ %'035>@ILNWYbegpr{~ƍɍˍԍ֍ߍ!*-/8:CFHQS\_ajluxzÎŎΎЎَ܎ގ $')24=@BKMVY[dfort}ȏʏӏ֏؏ !#,.7:BEIPQT^a{| $%)-0347AD^_cfilvy ()-036@C MP Z]wx |       * - 7 : D G K     $ * 0 6 < B H N T Z ` f l r x ~      " & ' + / 2 5 9 < A I L T Y ^ c f n q t  " U$null ZNS.objectsWNS.keysV$class_CLASSIFIERS_FOR_FILES_KEY_TRACKED_ELEMENTS_KEY_CREATED_DURING_WATERMARK_KEY^META_MODEL_KEY  8!"#$%&'()*+,-./0123456769:;<=>?@ABCDEFGHIJKLMNO  "$&(*,.024RSTUVWXYVR$2R$3R$0R$1ͪC _FD81610608146C33009AB595]^_`X$classesZ$classname`ab_XDSCPBXReferenceID_XDSCPBXObjectIDXNSObjectRSTUVefYVD¤ _FD1EF0A20811AE1900FD38C6RSTUVlmYVxڇm _FDB2FA75081B696300901B0ERSTUVstYVk6 _FD3C074208202C3C00693028RSTUVz{YVDŢ _FD1EF08E0811ADE500FD38C6RSTUVYV _FDDE8EAB08122C540091FACDRSTUVYVZzg _FD2D472408411CB600697CE7RSTUVYVss _FD29F41B082732FA005B4B87RSTUVYV2B _FD81610508146C33009AB595RSTUVYVņ _FD1EF0900811ADE500FD38C6RSTUVYV\5 _FD3C074108202C3C00693028RSTUVYV!R| _FD1EF0980811AE1900FD38C6RSTUVYV! _FD1EF08D0811ADE500FD38C6RSTUVYV҄# _FD1EF0A00811AE1900FD38C6RSTUVYVjf% _FD2D472308411CB600697CE7RSTUVYVX$' _FDA4E5B20831DF3D00460DCERSTUVYV&) _FD1EF08C0811ADE500FD38C6RSTUVYV\+ _FD1EF09F0811AE1900FD38C6RSTUVYVRn- _FDB2FA76081B696300901B0ERSTUVYV/ _FD1EF08B0811ADE500FD38C6RSTUVYV&1 _FDA4E5B10831DF3D00460DCERSTUVYVuգ3 _FD1EF08F0811ADE500FD38C6RSTUVYV3t5 _FD29F41C082732FA005B4B87 7oIv       "# %&' )&& -..0.234.&7 &&;_$XDBucketForOwnedOperationswasEncoded_$XDBucketForGeneralizationswasEncoded[_isAbstractV_owner_$XDBucketForSpecializationswasEncoded__fileRetainCount_'XDBucketForImplementedInterfacesordered__uniqueElementID_ XDBucketForStereotypeswasEncoded\_compactVars_!XDBucketForOwnedOperationsordered_XDBucketForStereotypesordered_*XDBucketForImplementedInterfaceswasEncodedU_name_$XDBucketForOwnedOperationsduplicates_$XDBucketForGeneralizationsduplicates_!XDBucketForGeneralizationsstorage_$XDBucketForSpecializationsduplicates_XDBucketForStereotypesstorage_!XDBucketForSpecializationsstorage_*XDBucketForImplementedInterfacesduplicates_!XDBucketForOwnedAttributesordered[_visibility_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForGeneralizationsordered_!XDBucketForSpecializationsordered_'XDBucketForImplementedInterfacesstorage::8::@ ::=>?@ABCD E G  7 LVNOVQR_XDBucketForDataTypeswasEncoded__xd_owningModel_XDBucketForPackageswasEncoded_XDBucketForClasseswasEncoded_XDBucketForInterfaceswasEncoded_XDBucketForClassesstorage_XDBucketForInterfacesstorage_XDBucketForDataTypesstorage_XDBucketForPackagesstorage:9:::;PSYES VBWXYZ[\]^_`abcdefgjklmnopqrstuwxyz{|}~~%(@CFI7RU\_befiloځ5ЁvǁӀ΁ցف܁߁/Bۀ<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}WNSCoderTimplWNSTimer_NSWindowControllerTRule\NSDictionaryUGView_GView/variationControl]NSUndoManager_NSProgressIndicatorYVariationUNSURL[ImageCanvas\NSInvocation]renderer_base[NSSavePanelZNSDocument\CFDGDocument\NSScrollViewVTopBar_CFDGController/updateUShapeXNSString]NSFileWrapper_GView/renderControl]NSApplicationXNSButtonVNSMenuVNSDataXNSCursorVSystemWNSImageXRenderer_NSPrintOperation^GView/internalWNSPanel_NSMethodSignature^NSNotification_VariationFormatterYNSStepperRidWBuilder[NSTextField[NSFormatter_CFDGController/setup_NSAttributedString\fast_ellipseVCanvasZUnitSquareVNSViewTCFDGWNSEventYDocSystemXCFDGImpl[NSPrintInfo^CFDGController_GView/renderThreadWNSArray_CFDGController/internal\trans_affineZNSMenuItemXNSWindowZNSTextView\NSPageLayoutYaggCanvas   7&!." 7#&V4 :8ZduplicatesWordered ,-]^/00b^NSMutableArray]^23345678bYXDSCClass]XDUMLClassImp_XDUMLClassifierImp_XDUMLNamespaceImp_XDUMLNamedElementImp_XDUMLElementImp       "# ?&A C&& G..J.LM4.&7 &&T::8::@::m WX]^[\\b_NSMutableDictionary ^- a- d-  7!"7#4V>8   7m&!." 7#sV4:8 w-       "# %& C&& ...4.&7 &&::8::::m-  - - -   7&!." 7#V4:8 -       "# %& )&& ...4.&7 &&ǀ::8::::m^  -π V]7]Y_specificX_generalm       "# & && ...4.&7 &&::8:: ::m  - - Vk7k        "# %& )&& ...4.&7 &&$::8::::m '( +- /- 2-m]^67778b_XDUMLGeneralizationImp 9- <-=>?@̀ـ V^7^]H       "# %&P R&& V..Y.[\4.7_&&::8:: :m dfegXCategory k"7^nV]^qrr45678b_XDUMLStereotypeImp t-= x- {-mZ Vp7p]€€       "# %& R&& ...4.7&&::8:À::ȀɀĀʀˀmy ơŀ "7pnV€ -> - -m V7]΀΀       "# %& R&& ...4.7&&::8:π::ԀՀЀր׀m ׀ҡـр "7nV΀ -?̀ - -m_ Vz7z]ڀڀ       "#%& R& ..4.7&&::8ۀ::܀、m{    ޡ ݀ "7znVڀ -@ـ - -m !-   7$&!." 7#*V4瀁:8 .-  7!"7#4VE8       "# %&= && B..E.GH4.&7 &&O::8:::퀀:m RS V- Y-Z V7abꀱ       "# %&j )&& o..r.tu4.&7 &&|::8:::􀀀:m@  -Z - V7񀱁       "# %& R&& ...4.7&&::8:::m;  "7nV - - -m V7ɀ񀱁       "# %& R&& ...4.7&&::8:::    m3  "7nV  - - -mV Vl7l񀱁       "# %& R&&  ...4.&7 &&::8::::m   #"7lnV )- -- 0-m 4-m= 8-       "# %&A C&& F..I.KL4.&7 &&S::8:::!" #:$m VW Z- ]- `-   7c&!." 7#iV4&:8' m-       "# ?&v C&& {..~.4.&7 &&::8:)::+,*>:?mC  -- Vd7d((/.me       "# & C&& ...4.&7 &&::8:0::231<:=m  -4 V7V//5       "# & C&& ...4.&7 &&ހ::8:6::897::;mw  - -4 - -- - - -   7&!." 7#V4A:8B -   7 & ." 7#V4D@:8E -   7&!." 7#V4G:8H !-       "# %&* && /..2.454.&7 &&<::8:J::LMKN:Qm@ ?@ C- F-GO V7O77IPmZ R-   7U&!." 7#[V4S:8T _-       "# %&h C&& m..p.rs4.&7 &&z::8:V::XYWZ:[m }~ - - -   7&!." 7#V4]:8^ -   7&!." 7#V4`:8a -   7&!." 7#V4c:8d -  7!"7#4VW8   7&!." 7#V4g:8h -   7&!." 7#V4j:8k -   7&!." 7#V4m:8n -       "# %& C&& ...4.&7 &&::8:p::rsqt:~m  - -u V7 vvo}       "# ?& C&& ...4.&7 &&#::8:w::yzx{:|m7 &' *-u .- 1-m 5-   78&!." 7#>V4:8 B-       "# ?&K C&& P..S.UV4.&7 &&]::8::::m `a d- g- j-   7m&!." 7#sV4:8 w-   7z&!." 7#V4:8 -   7&!." 7#V4:8 -   7&!." 7#V4:8 -       "# %& )&& ...4.&7 &&::8::::m4  - V~7~ɀm,       "# %& && ...4.&7 &&::8::::m  - - - - -  7!"7#4Vd8   7&." 7#V4:8  -       "# %& C&& ... 4.&7 &&'::8::::m *+ .- 1- 4-   77&!." 7#=V4:8 A-   7D&!." 7#JV4:8 N-   7Q& ." 7#WV4:8 [-       "# ?&d C&& i..l.no4.&7 &&v::8::::m yz }- - -       "# & C&& ...4.&7 &&::8:::Àŀ:mz  - -ƀ V7ǁǁ       "# %& C&& ...4.&7 &&ˀ::8:Ȁ::ʀˀɁ̀:m  -ƀ - -m -   7&!." 7#V4р:8Ҁ -   7&!." 7#V4Ԁ:8Հ -   7&!." 7# V4׀:8؀  -   7 & ." 7# V4ڀ:8ۀ  -   7 &!." 7# V4݀:8ހ  -   7 !&!." 7# 'V4:8  +-   7 .&!." 7# 4V4、:8  8-   7 ;&!." 7# AV4态:8  E-  H I  L 2 M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~!#%')+-/13579;=?ACEGIKMOQSUWY[]_acegikmoqsuwy{}2      VNSZoneTBOOLZ__docFlagsSIMP_unsigned short []XunsignedY__VFlags2WNSRange^renderer_solid[const StatsVchar *Yconst std_NSWindowOrderingMode__NSViewAuxiliaryWistreamWNSPointUClassSSEL^NSRangePointerUfloatVvoid *\pixfmt_gray8Vdouble_rendering_buffer\NSToolTipTagYShapeType\const char *UconstVNSRectTlong_RenderParameters *VNSSizeSstdSint_NSTrackingRectTagWostream[TransSquare_NSSaveOperationType_NSDocumentChangeTypeUStats\unsigned intZProtocol *[scanline_p8TboolVstringUint *Xdouble *W_VFlagsWUnknownTvoid "7# V8]^ 5678b_XDUMLDataTypeImp "7# V 8 "7# V"8 "7# V$8 "7# V&8 "7# V(8 "7# V*8 "7# V,8 "7# V.8 "7# V08 %"7# V28 +"7# V48 1"7# V68 7"7# V88 ="7# V:8 C"7# V<8 I"7# V>8 O"7# V@8 U"7# VB8 ["7# VD8 a"7# VF8 g"7# VH8 m"7# VJ8 s"7# VL8 y"7# VN8 "7# VP8 "7# VR8 "7# VT8 "7# VV8 "7# VX8 "7# VZ8 "7# V\8 "7# V^8 "7# V`8 "7# Vb8 "7# Vd8 "7# Vf8 "7# Vh8 "7# Vj8 "7# Vl8 "7# Vn8 "7# Vp8 "7# Vr8 "7# Vt8 "7# Vv8 "7# Vx8 "7# Vz8 "7# V|8 "7# V~8 "7# V8       #   !__xd_rootPackage\_xd_comments__xd_modelManager]_xd_modelName8]^ # $ $ %678b^XDModelPackage_XDUMLPackageImpm  ( )  ,-GO  0-  3-]^ 6 7 7 8b\NSMutableSetUNSSet  :  =~  Bal  J  Mm[Uǁ  U5/  Zk  _I7  d  gal  o  r  udzp^]΁(ڀ€/  X5/  b  5o  zp^]΀ڀ€  ~  mx[5Uǁ  b    k  - RSTUV YV~6 _FD1EF08A0811ADE500FD38C6RSTUV YVl _FD1EF0970811AE1900FD38C6_src-common_2.xcclassmodel  -]^ Τ bYXDSCModel_XDSCImporterModelWXDModel#,1:LQV[]  '>]ly!#%')+-/13579;=?ACEGIKMOdgjmpr{} -BDIKMOj   ) > @ I K M O j    ) > @ E G I K f { }    ! 6 8 A C E G b w y ~    ! 6 8 A C E G b w y   2 4 = ? A C ^ g p r u x { ~ ?KRy=jp )MzCEGHJLNPSUZ\^`cegjlortvxz|~.Pl~  "%(+.1   "$&(*,.02468:<>FKShmz %,DJSaw ),4@Lcx(1<IS1HZ $+AJKMVWYbcePRTUWY[]_acegikmoqsuwy{} |~   09:<ENPRTVXuwy{}             " ' 4 7 9 < > @ I b d e g i k t !Y![!]!^!`!b!d!f!h!j!l!n!p!r!t!v!x!z!|!~!!!!!!!!!!!!!!!!!!!!!!!!!!!!"""""""""""""""""""""""""""""""""""""""""""""#### ######!#>#@#B#D#F#H#J############################$$ $ $ $$$$$$ $)$*$,$5$6$8$=$F$G$I$z$|$~$$$$$$$$$$$$$$$$%4%6%8%9%;%=%?%A%C%E%G%I%K%M%O%Q%S%U%W%Y%[%]%_%a%c%f%k%x%y%z%|%%%%%%%%%%%%%%&5&7&9&:&<&>&@&B&D&F&H&J&L&N&P&R&T&V&X&Z&\&^&`&b&d&g&l&y&z&{&}&&&&&&&&&&&&&&&&&'<'>'@'A'C'E'G'I'K'M'O'Q'S'U'W'Y'[']'`'b'd'g'i'k'p'}'''''''''''''''''''''''''''(((o(q(s(t(v(x(z(}((((((((((((((((((((((((((((((((()))) ) )))1)3)6)9);)=)@)))))))))))))))))))))))))))))**** *#*&*'***,*.*7*:*=*?*H*I*K*T*U*W*\*e*f*h*m*v*w*y**********+++++ + +++++++++ +#+(+5+6+7+9+B+C+E+N+O+Q+Z+[+]+++++++++++++, ,",$,%,',),+,.,0,2,4,6,9,;,=,@,B,E,H,J,L,N,P,R,T,W,\,i,j,k,m,v,y,|,~,,,,,,,,-#-%-'-(-*-,-.-0-3-5-7-9-;->-@-B-E-G-J-M-O-Q-S-U-W-Y-\-a-n-o-p-r-{-~---------.".$.&.'.).+.-.0.2.4.6.8.;.=.?.B.D.G.J.L.N.P.R.T.V.Y.^.k.l.m.o.x.y.{.....................////// / //////N/Q/S/X/Z/[/]/_/b/d/f/o/p/r/////////////0507090:0<0>0@0C0E0G0I0K0N0P0R0U0W0Z0]0_0a0c0e0g0i0l0q0~0000000000000000000001 1111111111(1)1+11111111111111111111111111111111112222 2 22@2C2E2G2H2J2L2O2Q2S2\2]2_222222222222222222222222223 3"3#3%3'3)3Z3]3_3a3b3d3f3i3k3m3v3w3y333333333333333344444 4 4 44444444444444444444444444444444444444444555555 5#555555555555555555555555555555555555566 6 6 66666N6Q6S6U6V6X6Z6]6_6a6j6k6m66666666666666677777 7 7777777)7*7+7-7677797B7C7E7N7O7Q777777777777777777777777778"8%8'8)8*8,8.8183858>8?8A8r8u8w8y8z8|8~8888889999 9 9 999999999!9$9&9)9,9.90929496989;9@9M9N9O9Q9Z9]9`9b99999999:: : : ::::::::: :":$:':):,:/:1:3:5:7:9:;:>:C:P:Q:R:T:]:^:`:i:l:o:q:z:{:}::::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<'<*<,<.=>?>A>B>D>F>H>K>M>O>Q>S>V>X>Z>]>_>b>e>g>i>k>m>o>q>t>y>>>>>>>>>>>>>>>>>>?G?I?K?L?N?P?R?U?W?Y?[?]?`?b?d?g?i?l?o?q?s?u?w?y?{?~????????????????????@@@@@ @ @@@@@@@O@R@T@V@W@Y@[@^@`@b@k@l@n@@@@@@@@@@@@@@@@@@@@@AAA A AA?ABADAFAGAIAKANAPARA[A\A^AAAAAAAAAAAAAAAAAAAAAAAAAAB/B2B4B6B7B9B;B>B@BBBKBLBNB[B\B]B_BlBBBBBBBBBBBBBBBCCCC C CCCCCCC!C$C'C*C-C0C3C6C9CEKEREeErE|EEEEEEEEEEEEFFF'F2F>FCFJFPFYFaFiFnFFFFFFFFFFFFFFFFFFFGGGGG G"G%G'G@GCGDGFGIGKGdGgGhGjGmGoGGGGGGGGGGGGGGGGGGGGGGGGHHHHH!H#HIAICI\I_I`IbIeIgIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJJ4J7J8J:J=J?JXJ[J\J^JaJcJ|JJJJJJJJJJJJJJJJJJJJJJJK KKKKKK0K3K4K6K9K;KTKWKXKZK]K_KxK{K|K~KKKKKKKKKKKKKKKKKKKKLL L LLLL,L/L0L2L5L7LPLSLTLVLYL[LtLwLxLzL}LLLLLLLLLLLLLLLLLLLMMMM M MM(M+M,M.M1M3MLMOMPMRMUMWMpMsMtMvMyM{MMMMMMMMMMMMMMNNN N NNNN)N8NJNON\N]N^N`NiNlNoNqNzN{N}NNNNNNNNNNNNNNNNNNNNNNNNNOO OOOOOO"O%O.O3O6O9O @interface TopBar : NSView { IBOutlet NSView* mLeftStatus; IBOutlet NSView* mCenterControls; IBOutlet NSView* mRightStatus; IBOutlet NSView* mProgressOne; IBOutlet NSView* mProgressTwo; } - (void)relayout; - (void)resizeSubviewsWithOldSize:(NSSize)oldBoundsSize; @end contextfree-3.0.5+dfsg1.orig/src-osx/CFDGDocument.mm0000644000175000017500000003741512076364074020606 0ustar brambram// CFDGDocument.mm // this file is part of Context Free // --------------------- // Copyright (C) 2005-2007 Mark Lentczner - markl@glyphic.com // Copyright (C) 2008-2013 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // Mark Lentczner can be contacted at markl@glyphic.com or at // Mark Lentczner, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #import "CFDGDocument.h" #import "GView.h" #import "GalleryUploader.h" #include #include #include "cfdg.h" #include "location.hh" @interface CfdgErrorWrapper : NSObject { @private yy::location mLocation; NSString* mMessage; } -(id)initWithError: (const CfdgError*) err; -(NSString*)message; -(yy::location*)location; @end namespace { using namespace std; class DocSystem : public AbstractSystem { public: DocSystem(CFDGDocument* doc) : mDoc(doc) { } virtual void message(const char* fmt, ...); virtual void syntaxError(const CfdgError& err); virtual istream* openFileForRead(const string& path); virtual istream* tempFileForRead(const string& path); virtual ostream* tempFileForWrite(string& prefixInNameOut); virtual string relativeFilePath(const string& base, const string& rel); virtual void stats(const Stats& s); virtual void orphan(); private: CFDGDocument* mDoc; CFDGDocument* findDocFor(const string& path); }; CFDGDocument* DocSystem::findDocFor(const string& path) { if (path.empty()) return mDoc; NSString* pathStr = [NSString stringWithUTF8String: path.c_str() ]; return [[NSDocumentController sharedDocumentController] documentForFileName: pathStr]; } void DocSystem::message(const char* fmt, ...) { if (!mDoc) return; char buf[256]; { va_list args; va_start(args, fmt); vsnprintf(buf, sizeof(buf), fmt, args); buf[sizeof(buf)-1] = '\0'; va_end(args); } [mDoc performSelectorOnMainThread: @selector(noteStatus:) withObject: [NSString stringWithUTF8String: buf] waitUntilDone: NO]; } void DocSystem::stats(const Stats& s) { if (!mDoc) return; NSValue* value = [NSValue value: &s withObjCType: @encode(Stats)]; [mDoc performSelectorOnMainThread: @selector(noteStats:) withObject: value waitUntilDone: NO]; } void DocSystem::syntaxError(const CfdgError& err) { if (!mDoc) return; if (err.where.begin.filename == NULL) return; CfdgErrorWrapper* objcerr = [[[CfdgErrorWrapper alloc] initWithError: &err] autorelease]; [mDoc performSelectorOnMainThread: @selector(noteError:) withObject: objcerr waitUntilDone: NO]; } istream* DocSystem::openFileForRead(const string& path) { CFDGDocument* doc = findDocFor(path); if (doc) { NSData* data = [doc getContent]; basic_stringstream* s = new stringstream; s->write((const char*)[data bytes], [data length]); s->seekp(0, ios::beg); return s; } return new ifstream(path.c_str(), ios::in); } istream* DocSystem::tempFileForRead(const string& path) { return new ifstream(path.c_str(), ios::in | ios::binary); } ostream* DocSystem::tempFileForWrite(string& prefixInNameOut) { string t = prefixInNameOut + "XXXXXX"; NSString* prefix = [NSString stringWithUTF8String: t.c_str()]; NSString* path = [NSTemporaryDirectory() stringByAppendingPathComponent: prefix]; ofstream* f = 0; char* b = strdup([path UTF8String]); if (mktemp(b)) { f = new ofstream; f->open(b, ios::binary | ios::trunc | ios::out); prefixInNameOut = b; } delete b; return f; } string DocSystem::relativeFilePath(const string& base, const string& rel) { NSString* baseStr = [NSString stringWithUTF8String: base.c_str()]; NSString* relStr = [NSString stringWithUTF8String: rel.c_str()]; NSString* newStr = [[baseStr stringByDeletingLastPathComponent] stringByAppendingPathComponent: relStr]; NSFileManager* fm = [NSFileManager defaultManager]; if (![fm fileExistsAtPath: newStr]) { NSString* libStr = [[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent: @"Examples"] stringByAppendingPathComponent: relStr]; if ([fm fileExistsAtPath: libStr]) newStr = libStr; } return string([newStr UTF8String]); } void DocSystem::orphan() { mDoc = nil; } }; @implementation CfdgErrorWrapper -(id)initWithError: (const CfdgError*) err { self = [super init]; if (self) { mLocation = err->where; mMessage = [[NSString stringWithUTF8String: err->what] retain]; } return self; } - (void)dealloc { [mMessage release]; mMessage = nil; [super dealloc]; } -(NSString*)message { return mMessage; } -(yy::location*)location { return &mLocation; } @end NSString* CFDGDocumentType = @"ContextFree Design Grammar"; @implementation CFDGDocument + (NSString*) documentType { return CFDGDocumentType; } + (BOOL)autosavesInPlace { return YES; } - (id)init { self = [super init]; if (self) { mSystem = new DocSystem(self); mContent = nil; mUploader = nil; mDisplayName = nil; } return self; } - (void)dealloc { //delete mSystem; mSystem = 0; mSystem->orphan(); // leave system orphaned on the heap [mContent release]; mContent = nil; [mUploader release]; mUploader = nil; [super dealloc]; } - (NSString *)windowNibName { return @"CFDGDocument"; } - (void)showWindows { [super showWindows]; if ([[mEditor string] length] == 0) return; BOOL render = [[NSUserDefaults standardUserDefaults] boolForKey: @"RenderOnDocumentOpen"]; if (render) [self startRender: self]; } - (void)close { mStatus = nil; mGView = nil; [self stopRender: self]; [super close]; } - (CFDG*)buildEngine { [[[mStatusText textStorage] mutableString] setString: @""]; const char* fileName = [[[self fileURL] path] UTF8String]; if (!fileName) fileName = ""; static NSLock* parseLock = [[NSLock alloc] init]; CFDG* result = 0; if ([parseLock lockBeforeDate: [NSDate dateWithTimeIntervalSinceNow: 2.0]]) { result = CFDG::ParseFile(fileName, mSystem, [mGView variation]); [parseLock unlock]; } return result; } - (void)noteStatus:(NSString*)s { if (mStatus != nil) { [mStatus setStringValue: s]; [mStatus setToolTip: s]; } if (mStatusText != nil) { [[[mStatusText textStorage] mutableString] appendString: s]; [[[mStatusText textStorage] mutableString] appendString: @"\n"]; // scroll to the end NSRange range = NSMakeRange ([[mStatusText string] length], 0); [mStatusText scrollRangeToVisible: range]; } } - (void)noteStats:(NSValue*)v { if (mGView != nil) { [mGView noteStats: v]; } } - (void)noteError:(CfdgErrorWrapper*)e { NSMutableAttributedString* msg = [[[NSMutableAttributedString alloc] initWithString: @"Parse error - "] autorelease]; NSUInteger start = [msg length]; [[msg mutableString] appendString: [e message]]; if (mStatus != nil) { [mStatus setStringValue: [msg mutableString]]; [mStatus setToolTip: [msg mutableString]]; } if (mStatusText != nil) { [msg beginEditing]; NSRange r = NSMakeRange(start, [msg length] - start); [msg addAttribute: NSLinkAttributeName value: e range: r]; // make the text appear in blue [msg addAttribute: NSForegroundColorAttributeName value: [NSColor blueColor] range: r]; // next make the text appear with an underline [msg addAttribute: NSUnderlineStyleAttributeName value:[NSNumber numberWithInt: NSSingleUnderlineStyle] range:r]; [[msg mutableString] appendString: @"\n"]; [msg endEditing]; [[mStatusText textStorage] appendAttributedString: msg]; // scroll to the end NSRange range = NSMakeRange ([[mStatusText string] length], 0); [mStatusText scrollRangeToVisible: range]; } } - (void)highlightChars:(CfdgErrorWrapper*)link { yy::location* errLoc = [link location]; NSString* text = [mEditor string]; NSRange lineRange; unsigned int lineCount; NSUInteger endOfLine; unsigned int start; unsigned int end; lineRange.location = 0; lineRange.length = 0; lineCount = 1; // lineRange(0,0) is the start of line 1! while (lineCount < errLoc->begin.line) { // find start of next line [text getLineStart: nil end: &endOfLine contentsEnd: nil forRange: lineRange]; lineRange.location = endOfLine; lineCount += 1; } start = lineRange.location + errLoc->begin.column; while (lineCount < errLoc->end.line) { // find start of next line [text getLineStart: nil end: &endOfLine contentsEnd: nil forRange: lineRange]; lineRange.location = endOfLine; lineCount += 1; } end = lineRange.location + errLoc->end.column; lineRange.location = start; lineRange.length = end - start; [mEditor setSelectedRange: lineRange]; [mEditor scrollRangeToVisible: lineRange]; [[mGView window] makeFirstResponder: mEditor]; } - (NSData *)dataRepresentationOfType:(NSString *)type { NSAssert([type isEqualToString: CFDGDocumentType], @"Unknown type"); return [self getContent]; } - (BOOL)loadDataRepresentation:(NSData *)data ofType:(NSString *)type { NSAssert([type isEqualToString: CFDGDocumentType], @"Unknown type"); mContent = [data retain]; [self showContent]; return YES; } - (void)windowControllerDidLoadNib:(NSWindowController *)windowController { [self showContent]; [mStatusText setEditable: NO]; } - (BOOL)textView:(NSTextView *)aTextView clickedOnLink:(id)link atIndex:(NSUInteger)charIndex { [self highlightChars: (CfdgErrorWrapper*) link]; return YES; } - (IBAction)toggleRenderView:(id)sender { } - (IBAction) closeAll:(id)sender { [[NSDocumentController sharedDocumentController] closeAllDocumentsWithDelegate: nil didCloseAllSelector: @selector(nosuchselector:) contextInfo: (void*)0]; } - (IBAction) enterFullscreen:(id)sender { [mGView enterFullscreen: sender]; } - (IBAction) startRender:(id)sender { [mGView startRender: sender]; } - (IBAction) repeatRender:(id)sender{ [mGView repeatRender: sender]; } - (IBAction) finishRender:(id)sender{ [mGView finishRender: sender]; } - (IBAction) stopRender:(id)sender { [mGView stopRender: sender]; } - (IBAction) saveImage:(id)sender { [mGView saveImage: sender]; } - (IBAction) saveAsSVG:(id)sender { [mGView saveAsSVG: sender]; } - (IBAction) saveAsMovie:(id)sender { [mGView saveAsMovie: sender]; } - (IBAction) insertUnicode:(id)sender { NSMenuItem* menu = (NSMenuItem*)sender; unichar codePoint = (unichar)([menu tag]); if (codePoint) { NSString* unistring = [NSString stringWithCharacters:&codePoint length:1]; [mEditor insertText: unistring]; } else { [mEditor insertText: [menu title]]; } } - (BOOL)validateMenuItem:(NSMenuItem *)anItem; { SEL action = [anItem action]; if (action == @selector(enterFullscreen:)) return YES; if (action == @selector(startRender:) || action == @selector(repeatRender:) || action == @selector(finishRender:) || action == @selector(stopRender:) || action == @selector(saveImage:) || action == @selector(saveAsSVG:) || action == @selector(saveAsMovie:) || action == @selector(showHiresRenderSheet:) || action == @selector(uploadToGallery:) || action == @selector(toggleLegacyVariations:) || action == @selector(showSvgRenderSheet:)) { return [mGView validateMenuItem: anItem]; } return [super validateMenuItem: anItem]; } - (IBAction) showHiresRenderSheet:(id)sender { [NSApp beginSheet: mHiresSheet modalForWindow: [(NSWindowController*)[[self windowControllers] lastObject] window] modalDelegate: nil didEndSelector: nil contextInfo: nil]; } - (IBAction) startHiresRender:(id)sender { if (![mHiresSheet makeFirstResponder: nil]) return; NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; float hiresWidth = [defaults floatForKey: @"HiresWidth"]; float hiresHeight = [defaults floatForKey: @"HiresHeight"]; double hiresMinSize = [defaults doubleForKey: @"HiresMinimumSize"]; [mGView startHiresRender: NSMakeSize(hiresWidth, hiresHeight) minimum: hiresMinSize]; [self cancelHiresRender:sender]; } - (IBAction) cancelHiresRender:(id)sender { [NSApp endSheet: mHiresSheet]; [mHiresSheet orderOut: sender]; } - (IBAction) uploadToGallery:(id)sender { if (!mUploader) { mUploader= [[GalleryUploader alloc] initForDocument: self andView: mGView]; } [mUploader show: self]; } - (void)showContent { if (mEditor) { NSString* s = [[NSString alloc] initWithData: mContent encoding: NSUTF8StringEncoding]; [mEditor setString: s]; [s release]; } } - (NSData*)getContent { [mContent release]; mContent = [[[mEditor string] dataUsingEncoding: NSUTF8StringEncoding] retain]; return mContent; } - (void)readFromExample:(NSString*)path { [self readFromData: [NSData dataWithContentsOfFile: path] ofType: CFDGDocumentType error: nil]; [mDisplayName release]; mDisplayName = [[[path lastPathComponent] stringByDeletingPathExtension] retain]; } - (NSString*)displayName { if (mDisplayName) return mDisplayName; return [super displayName]; } - (void)setFileURL:(NSURL *)absoluteURL { [mDisplayName release]; mDisplayName = nil; [super setFileURL: absoluteURL]; } // Delegate methods from the editor - (void) textDidChange: (NSNotification *) notification { [self stopRender: self]; [mGView reuseVariation]; } @end contextfree-3.0.5+dfsg1.orig/src-osx/GalleryUploader.mm0000644000175000017500000003560012076364074021471 0ustar brambram// GalleryUploader.mm // this file is part of Context Free // --------------------- // Copyright (C) 2007 Mark Lentczner - markl@glyphic.com // Copyright (C) 2008-2012 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // Mark Lentczner can be contacted at markl@glyphic.com or at // Mark Lentczner, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #import "GalleryUploader.h" #import "CFDGDocument.h" #import "GView.h" #import "VariationFormatter.h" #import #import #import #include #include #include "upload.h" namespace { std::string asString(NSString* ns) { NSData* d = [ns dataUsingEncoding: NSUTF8StringEncoding]; std::string s((const char*)[d bytes], [d length]); return s; } NSString* asNSString(const std::string& s) { return [NSString stringWithUTF8String: s.c_str()]; } static NSString* ccURI = @"CreativeCommonsLicenseURI"; static NSString* ccName = @"CreativeCommonsLicenseName"; static NSString* ccImage = @"CreativeCommonsLicenseImage"; } @implementation GalleryUploader - (id)initForDocument:(CFDGDocument*)document andView:(GView*)view; { self = [self initWithWindowNibName: @"GalleryUploader"]; if (!self) return self; mDocument = document; mView = view; mStatus = 0; // no need to retain - the document is retaining us! [self loadWindow]; [mFormView retain]; [mProgressView retain]; [mDoneView retain]; [mLicenseView retain]; return self; } - (void) dealloc { [mLicenseView release]; [mDoneView release]; [mProgressView release]; [mFormView release]; [mConnection release]; [mResponseBody release]; [super dealloc]; } - (NSData*)requestBody { Upload upload; upload.mUserName = asString([mUserNameField stringValue]); upload.mPassword = asString([mPasswordField stringValue]); upload.mTitle = asString([mTitleField stringValue]); upload.mNotes = asString([mNotesView string]); upload.mFileName = asString([mFileField stringValue]) + ".cfdg"; upload.mVariation = [mView variation]; upload.mTiled = 0; if ([mTiled state] == NSOnState) { upload.mTiled = [mView isFrieze]; if ([mView isTiled] && !upload.mTiled) upload.mTiled = 3; } upload.mCompression = (Upload::Compression) [[mCompressionMatrix selectedCell] tag]; upload.mccLicenseURI = asString(mDefccURI); upload.mccLicenseName = asString(mDefccName); upload.mccLicenseImage = asString(mDefccImage); BOOL crop = upload.mTiled || [[NSUserDefaults standardUserDefaults] boolForKey: @"SaveCropped"]; NSSize mult = NSMakeSize([mSaveTileWidth floatValue], [mSaveTileHeight floatValue]); NSData* textData = [mDocument getContent]; NSData* imageData = [mView pngImageDataCropped: crop multiplier: [mView isTiled] ? &mult : nil]; if (!imageData) return nil; upload.mText = (const char*)[textData bytes]; upload.mTextLen = [textData length]; upload.mImage = (const char*)[imageData bytes]; upload.mImageLen = [imageData length]; std::ostringstream payloadStream; upload.generatePayload(payloadStream); std::string payloadString = payloadStream.str(); return [NSData dataWithBytes: payloadString.data() length: payloadString.length()]; } - (void)setView:(NSView*)view { NSRect contentFrame = [mContentView frame]; NSSize oldContentSize = contentFrame.size; NSSize newContentSize = [view frame].size; NSSize deltaSize; deltaSize.width = newContentSize.width - oldContentSize.width; deltaSize.height = newContentSize.height - oldContentSize.height; NSView* container = [mContentView superview]; [mContentView removeFromSuperview]; contentFrame.size = newContentSize; [view setFrame: contentFrame]; [container addSubview: view]; mContentView = view; NSWindow* window = [self window]; NSRect f = [window frame]; f.origin.x -= deltaSize.width / 2.0; f.origin.y -= deltaSize.height; f.size.width += deltaSize.width; f.size.height += deltaSize.height; [window setFrame: f display: YES animate: YES]; } - (void)allDone:(NSString*)message { [mConnection release]; mConnection = nil; if (message) mStatus = -1; [mRetryButton setEnabled:NO]; switch (mStatus) { case -1: [mMessage setString: message]; break; case 0: [mMessage setString: @"Upload completed without a status code (?!?!?!)."]; break; case 409: [mRetryButton setEnabled:YES]; case 200: { NSAttributedString *theParsedHTML; // Take the raw HTML data and then initialize an NSMutableAttributed // string with HTML code theParsedHTML = [[NSAttributedString alloc] initWithHTML:mResponseBody documentAttributes: nil]; int responseLength = [mResponseBody length]; char* rawHTML = (char*)[mResponseBody mutableBytes]; // This UUID will only be found in the response body if the upload // failed. Give the user another chance if failure occured. if (responseLength && strnstr(rawHTML, "AFD8D2F0-B6EB-4569-9D89-954604507F3B", responseLength)) { [mRetryButton setEnabled:YES]; } // no parsing or fetching error.. so lets display it if (theParsedHTML) { [[mMessage textStorage] setAttributedString:theParsedHTML]; [theParsedHTML release]; } break; } case 404: [mMessage setString: @"Upload service is offline."]; break; default: [mMessage setString: [NSString localizedStringWithFormat: @"Failed with unexpected status code: %d, %@", mStatus, [NSHTTPURLResponse localizedStringForStatusCode: mStatus]]]; break; } [mResponseBody release]; mResponseBody = nil; [self setView: mDoneView]; } - (IBAction)retry:(id)sender { [self setView: mFormView]; } - (IBAction)show:(id)sender { [self setView: mFormView]; if ([[mTitleField stringValue] length] == 0) { [mTitleField setStringValue: [mDocument displayName]]; } if ([[mFileField stringValue] length] == 0) { NSString* file = [[mDocument fileURL] path]; if (file) { file = [[file stringByDeletingPathExtension] lastPathComponent]; } else { file = [mDocument displayName]; } [mFileField setStringValue: file]; } [mVariationField setIntValue: [mView variation]]; int bestCompression = [mView canvasColor256] ? Upload::CompressPNG8 : Upload::CompressJPEG; [mCompressionMatrix selectCellWithTag: bestCompression]; bool tiled = [mView isTiled]; [mTiled setEnabled: tiled]; [mCropCheck setEnabled: !tiled]; [mSaveTileWidth setHidden: !tiled]; [mSaveTileHeight setHidden: !tiled]; [mWidthLabel setHidden: !tiled]; [mHeightLabel setHidden: !tiled]; [mMultLabel setHidden: !tiled]; [mTiled setState: (tiled ? NSOnState : NSOffState)]; if (tiled) { CFDG::frieze_t frz = (CFDG::frieze_t)[mView isFrieze]; [mSaveTileWidth setEnabled: frz != CFDG::frieze_y]; [mSaveTileHeight setEnabled: frz != CFDG::frieze_x]; NSNumber* one = [NSNumber numberWithInt: 1]; NSNumber* hundred = [NSNumber numberWithInt: 100]; NSNumberFormatter* fmt = [mSaveTileWidth formatter]; [fmt setMinimum: one]; [fmt setMaximum: hundred]; fmt = [mSaveTileHeight formatter]; [fmt setMinimum: one]; [fmt setMaximum: hundred]; [mSaveTileWidth setFloatValue: 1.0]; [mSaveTileHeight setFloatValue: 1.0]; } [self updateCCInfo]; [NSApp beginSheet: [self window] modalForWindow: [mView window] modalDelegate: nil didEndSelector: nil contextInfo: nil]; } - (void)updateCCInfo { mDefccURI = [[NSUserDefaults standardUserDefaults] stringForKey: ccURI]; mDefccName = [[NSUserDefaults standardUserDefaults] stringForKey: ccName]; mDefccImage = [[NSUserDefaults standardUserDefaults] stringForKey: ccImage]; if (!mDefccURI || !mDefccName || !mDefccImage || [mDefccURI length] == 0 || [mDefccName length] == 0 || [mDefccImage length] == 0) { mDefccURI = @""; mDefccName = @"no license chosen"; mDefccImage = @""; } bool isSeeded = [mDefccURI length] > 0; NSError* err = nil; NSString* htmlPath = [[NSBundle mainBundle] pathForResource: @"widgetform" ofType: @"html"]; //NSString* theHtml = [NSString stringWithContentsOfFile: htmlPath]; NSString* theHtml = [NSString stringWithContentsOfFile: htmlPath encoding: NSUTF8StringEncoding error: &err]; NSString* seededHtml = [NSString stringWithFormat: theHtml, mDefccURI, isSeeded ? @"" : @"&want_a_license=no_license_by_default"]; [mLicenseName setStringValue: mDefccName]; [[mCreativeCommonsWidget mainFrame] loadHTMLString: seededHtml baseURL: [NSURL fileURLWithPath: htmlPath]]; [mCreativeCommonsWidget setPolicyDelegate: self]; if (isSeeded) { NSURL* iconURL = [NSURL URLWithString: mDefccImage]; NSImage* icon = [[[NSImage alloc] initWithContentsOfURL: iconURL] autorelease]; [mLicenseImage setImage: icon]; [mLicenseImage setEnabled: YES]; } else { [mLicenseImage setImage: nil]; [mLicenseImage setEnabled: NO]; } } - (IBAction)goToCreateAccount:(id)sender { NSURL* url = [NSURL URLWithString: @"http://www.contextfreeart.org/phpbb/profile.php?mode=register"]; [[NSWorkspace sharedWorkspace] openURL: url]; } - (IBAction)changeLicense:(id)sender { [self setView: mLicenseView]; } - (IBAction)updateLicense:(id)sender { mDefccURI = @""; mDefccName = @""; mDefccImage = @""; DOMDocument* dom = [[mCreativeCommonsWidget mainFrame] DOMDocument]; if (dom) { DOMElement* licenseURIElem = [dom getElementById: @"cc_js_result_uri"]; DOMElement* licenseNameElem = [dom getElementById: @"cc_js_result_name"]; DOMElement* licenseImageElem = [dom getElementById: @"cc_js_result_img"]; if (licenseNameElem && licenseImageElem && licenseURIElem) { mDefccURI = [licenseURIElem getAttribute: @"value"]; mDefccName = [licenseNameElem getAttribute: @"value"]; mDefccImage = [licenseImageElem getAttribute: @"value"]; } } [[NSUserDefaults standardUserDefaults] setObject: mDefccURI forKey: ccURI]; [[NSUserDefaults standardUserDefaults] setObject: mDefccName forKey: ccName]; [[NSUserDefaults standardUserDefaults] setObject: mDefccImage forKey: ccImage]; [self updateCCInfo]; [self setView: mFormView]; } - (IBAction)noChangeLicense:(id)sender { [self setView: mFormView]; } - (IBAction)licenseDetails:(id)sender { NSURL* url = [NSURL URLWithString: mDefccURI]; [[NSWorkspace sharedWorkspace] openURL: url]; } - (void)webView:(WebView *)sender decidePolicyForNavigationAction:(NSDictionary *)actionInformation request:(NSURLRequest *)request frame:(WebFrame *)frame decisionListener:(id)listener { int navigationType = [[actionInformation objectForKey:WebActionNavigationTypeKey] intValue]; if (navigationType == WebNavigationTypeLinkClicked) { [listener ignore]; [[NSWorkspace sharedWorkspace] openURL: [request URL]]; } else { [listener use]; } } - (IBAction)upload:(id)sender { NSData* body = [self requestBody]; if (!body) { [mMessage setString: @"Failed to generate PNG image to upload."]; [self setView: mDoneView]; return; } NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL: [NSURL URLWithString: @"http://www.contextfreeart.org/gallery/upload.php"] //[NSURL URLWithString: @"http://aluminium.local/~john/cfa2/gallery/upload.php"] cachePolicy: NSURLRequestReloadIgnoringCacheData timeoutInterval: 120.0 ]; [request setHTTPMethod: @"POST"]; [request setValue: asNSString(Upload::generateContentType()) forHTTPHeaderField: @"Content-Type"]; [request setHTTPBody: body]; mResponseBody = [[NSMutableData data] retain]; mConnection = [NSURLConnection alloc]; [mConnection initWithRequest: request delegate: self]; if (!mConnection) { [self cancel: sender]; } [mRetryButton setEnabled:NO]; [self setView: mProgressView]; } -(void)connection:(NSURLConnection *)c didReceiveResponse:(NSURLResponse *)response { [mResponseBody setLength: 0]; if ([response isKindOfClass:[NSHTTPURLResponse class]] ) { mStatus = [(NSHTTPURLResponse *)response statusCode]; } } - (void)connection:(NSURLConnection *)c didReceiveData:(NSData *)data { [mResponseBody appendData: data]; } -(void)connectionDidFinishLoading:(NSURLConnection *)c { [self performSelector:@selector( allDone: ) withObject:0 afterDelay:0.0]; } - (void)connection:(NSURLConnection *)c didFailWithError:(NSError *)error { [self allDone: [error localizedDescription]]; } - (IBAction)cancel:(id)sender { if (mConnection) { [mConnection cancel]; } [mConnection release]; mConnection = nil; [mResponseBody release]; mResponseBody = nil; NSWindow* window = [self window]; [NSApp endSheet: window]; [window orderOut: sender]; } @end contextfree-3.0.5+dfsg1.orig/src-osx/BitmapImageHolder.mm0000644000175000017500000002143112076364074021710 0ustar brambram// BitmapImageHolder.m // this file is part of Context Free // --------------------- // Copyright (C) 2009-2012 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #import "BitmapImageHolder.h" #import @interface BitmapImageHolder (internal) - (BOOL) setupWithBitmapDataPlanes: (unsigned char**)planes pixelsWide: (NSInteger)width pixelsHigh: (NSInteger)height bitsPerSample: (NSInteger)bps samplesPerPixel: (NSInteger)spp hasAlpha: (BOOL)alpha isPlanar: (BOOL)isPlanar colorSpaceName: (NSString*)colorSpaceName bytesPerRow: (NSInteger)rowBytes bitsPerPixel: (NSInteger)pixelBits; @end @implementation BitmapImageHolder (internal) - (BOOL) setupWithBitmapDataPlanes: (unsigned char**)planes pixelsWide: (NSInteger)width pixelsHigh: (NSInteger)height bitsPerSample: (NSInteger)bps samplesPerPixel: (NSInteger)spp hasAlpha: (BOOL)alpha isPlanar: (BOOL)isPlanar colorSpaceName: (NSString*)colorSpaceName bytesPerRow: (NSInteger)rowBytes bitsPerPixel: (NSInteger)pixelBits { _isPlanar = isPlanar; _hasAlpha = alpha; if (width < 1 || height < 1 || spp < 1 || spp > 5) return FALSE; _pixelsWide = width; _pixelsHigh = height; _samplesPerPixel = (unsigned int) spp; if (bps != 8 && bps != 16) return FALSE; _bitsPerSample = bps; if (colorSpaceName == nil) return FALSE; if (![colorSpaceName isEqual:NSCalibratedWhiteColorSpace] && ![colorSpaceName isEqual:NSCalibratedBlackColorSpace] && ![colorSpaceName isEqual:NSCalibratedRGBColorSpace] && ![colorSpaceName isEqual:NSDeviceWhiteColorSpace] && ![colorSpaceName isEqual:NSDeviceBlackColorSpace] && ![colorSpaceName isEqual:NSDeviceRGBColorSpace] && ![colorSpaceName isEqual:NSDeviceCMYKColorSpace] && ![colorSpaceName isEqual:NSNamedColorSpace] && ![colorSpaceName isEqual:NSPatternColorSpace] && ![colorSpaceName isEqual:NSCustomColorSpace]) return FALSE; _colorSpace = [colorSpaceName retain]; if (rowBytes == 0) { rowBytes = ((isPlanar ? 1 : spp) * bps * width) >> 3; rowBytes += ((-rowBytes) & 15); // pad to 16-byte boundary } if (rowBytes < 0) return FALSE; _bytesPerRow = (unsigned int)rowBytes; if (pixelBits == 0) pixelBits = isPlanar ? bps : (bps * spp); if (pixelBits < 0) return FALSE; _bitsPerPixel = pixelBits; unsigned int planesExpected = isPlanar ? _samplesPerPixel : 1; unsigned int planesProvided = 0; if (planes) { for (unsigned int i = 0 ; i < 5; ++i) { if (i < planesExpected) _imagePlanes[i] = planes[i]; else _imagePlanes[i] = NULL; if (_imagePlanes[i]) ++planesProvided; } if (planesProvided == planesExpected) return TRUE; if (planesProvided > 0) return FALSE; } NSUInteger planeSize = _bytesPerRow * height; NSUInteger bitmapsize = (isPlanar ? _samplesPerPixel : 1) * planeSize + 16; _imageData = [[NSMutableData dataWithLength:bitmapsize] retain]; unsigned char* bytes = (unsigned char*)([_imageData mutableBytes]); bytes += ((-((long)bytes)) & 15); // pad to 16-byte boundary for (unsigned int i = 0; i < 5; ++i) { if (i < planesExpected) { _imagePlanes[i] = bytes; bytes += planeSize; } else { _imagePlanes[i] = NULL; } } return TRUE; } @end @implementation BitmapImageHolder - (id) initWithBitmapDataPlanes: (unsigned char**)planes pixelsWide: (NSInteger)width pixelsHigh: (NSInteger)height bitsPerSample: (NSInteger)bps samplesPerPixel: (NSInteger)spp hasAlpha: (BOOL)alpha isPlanar: (BOOL)isPlanar colorSpaceName: (NSString*)colorSpaceName bytesPerRow: (NSInteger)rowBytes bitsPerPixel: (NSInteger)pixelBits { self = [super init]; if (!self) return self; if (![self setupWithBitmapDataPlanes: planes pixelsWide: width pixelsHigh: height bitsPerSample: bps samplesPerPixel: spp hasAlpha: alpha isPlanar: isPlanar colorSpaceName: colorSpaceName bytesPerRow: rowBytes bitsPerPixel: pixelBits]) { [self release]; return nil; } return self; } - (void)dealloc { [_imageData release]; _imageData = nil; [_colorSpace release]; _colorSpace = nil; [super dealloc]; } - (int) bitsPerPixel { return _bitsPerPixel; } - (int) samplesPerPixel { return _samplesPerPixel; } - (BOOL) isPlanar { return _isPlanar; } - (int) numberOfPlanes { return _isPlanar ? _samplesPerPixel : 1; } - (int) bytesPerPlane { return _bytesPerRow * _pixelsHigh; } - (int) bytesPerRow { return _bytesPerRow; } - (int) bitsPerSample { return _bitsPerSample; } - (NSString *) colorSpaceName { return _colorSpace; } - (BOOL) hasAlpha { return _hasAlpha; } - (int) pixelsHigh { return _pixelsHigh; } - (int) pixelsWide { return _pixelsWide; } // // Getting Image Data // - (unsigned char*) bitmapData { return _imagePlanes[0]; } - (void) getBitmapDataPlanes: (unsigned char**)data { for (unsigned int i = 0; i < 5; ++i) data[i] = _imagePlanes[i]; } // // Getting an NSBitmapImageReps // - (NSBitmapImageRep*) newImageRep { return [[NSBitmapImageRep alloc] initWithBitmapDataPlanes: _imagePlanes pixelsWide: _pixelsWide pixelsHigh: _pixelsHigh bitsPerSample: _bitsPerSample samplesPerPixel: _samplesPerPixel hasAlpha: _hasAlpha isPlanar: _isPlanar colorSpaceName: _colorSpace bytesPerRow: _bytesPerRow bitsPerPixel: _bitsPerPixel ]; } - (NSBitmapImageRep*) getImageRep { return [[[NSBitmapImageRep alloc] initWithBitmapDataPlanes: _imagePlanes pixelsWide: _pixelsWide pixelsHigh: _pixelsHigh bitsPerSample: _bitsPerSample samplesPerPixel: _samplesPerPixel hasAlpha: _hasAlpha isPlanar: _isPlanar colorSpaceName: _colorSpace bytesPerRow: _bytesPerRow bitsPerPixel: _bitsPerPixel ] autorelease]; } - (NSBitmapImageRep*) getImageRepCropped: (NSRect)cropRect { unsigned char* planes[5]; int offset = (int)cropRect.origin.y * _bytesPerRow + (int)cropRect.origin.x * (_bitsPerPixel >> 3); for (unsigned int i = 0; i < 5; ++i) planes[i] = _imagePlanes[i] ? (_imagePlanes[i] + offset) : NULL; int width = (int)cropRect.size.width; int height = (int)cropRect.size.height; return [[[NSBitmapImageRep alloc] initWithBitmapDataPlanes: planes pixelsWide: width pixelsHigh: height bitsPerSample: _bitsPerSample samplesPerPixel: _samplesPerPixel hasAlpha: _hasAlpha isPlanar: _isPlanar colorSpaceName: _colorSpace bytesPerRow: _bytesPerRow bitsPerPixel: _bitsPerPixel ] autorelease]; } @end contextfree-3.0.5+dfsg1.orig/src-osx/main.m0000644000175000017500000000212612076364074017142 0ustar brambram// main.m // this file is part of Context Free // --------------------- // Copyright (C) 2005 Mark Lentczner - markl@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // Mark Lentczner can be contacted at markl@glyphic.com or at // Mark Lentczner, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #import int main(int argc, char *argv[]) { return NSApplicationMain(argc, (const char **) argv); } contextfree-3.0.5+dfsg1.orig/src-osx/widgetform.html0000644000175000017500000000134312076364074021075 0ustar brambram

contextfree-3.0.5+dfsg1.orig/src-osx/KFSplitView.m0000644000175000017500000011711312076364074020370 0ustar brambram// // KFSplitView.m // KFSplitView v. 1.3, 11/27/2004 // // Copyright (c) 2003-2004 Ken Ferry. Some rights reserved. // http://homepage.mac.com/kenferry/software.html // // Other contributors: Kirk Baker, John Pannell // // This work is licensed under a Creative Commons license: // http://creativecommons.org/licenses/by-nc/1.0/ // // Send me an email if you have any problems (after you've read what there is to read). // // You can reach me at kenferry at the domain mac.com. // // On this whole major axis, minor axis thing: // // The 'major' axis refers to the direction in which dividers can move. // It's the y-axis when [self isVertical] returns NO, and the x-axis otherwise. // Pretty much everything that uses coordinates or dimensions in this file works // more comfortably in that coordinate system. // // Other // // This class is a basically a complete reimplementation of NSSplitView. The // underlying NSSplitView is mostly used for drawing dividers. #import "KFSplitView.h" #pragma mark File-level and global vars: NSString *KFSplitViewDidCollapseSubviewNotification = @"KFSplitViewDidCollapseSubviewNotification"; NSString *KFSplitViewDidExpandSubviewNotification = @"KFSplitViewDidExpandSubviewNotification"; const NSPoint KFOffScreenPoint = {1000000.0,1000000.0}; static NSMutableSet *kfInUsePositionNames; #if !defined(NSINTEGER_DEFINED) typedef int NSInteger; typedef unsigned int NSUInteger; #endif #pragma mark Utility: // these are macros (instead of inlines) so that we can use the instance variable kfIsVertical // they're undef'd at the bottom of the file #define KFMAJORCOORDOFPOINT(point) (kfIsVertical ? (point).x : (point).y) #define KFMINORCOORDOFPOINT(point) (kfIsVertical ? (point).y : (point).x) #define KFMAJORDIMOFSIZE(size) (kfIsVertical ? (size).width : (size).height) #define KFMINORDIMOFSIZE(size) (kfIsVertical ? (size).height : (size).width) #define KFPOINTWITHMAJMIN(major, minor) (kfIsVertical ? NSMakePoint((major), (minor)) : NSMakePoint((minor), (major))) #define KFSIZEWITHMAJMIN(major, minor) (kfIsVertical ? NSMakeSize((major), (minor)) : NSMakeSize((minor), (major))) #define KFMAX(a,b) ((a)>(b)?(a):(b)) // proportionally scale a list of integers so that the sum of the resulting list is targetTotal // Will fail (return NO) if all integers are zero // Favors not completely zeroing out a nonzero int static BOOL kfScaleUInts(unsigned *integers, int numInts, unsigned targetTotal) { unsigned total; float scalingFactor; int i, numNonZeroInts; // compute total total = 0; numNonZeroInts = 0; for (i = 0; i < numInts; i++) { if (integers[i] != 0) { total += integers[i]; numNonZeroInts++; } } if (numNonZeroInts == 0) // fail { return NO; } // compute scalingFactor scalingFactor = (float)targetTotal / total; // scale all ints and recompute total (which may not equal targetTotal due to roundoff error) total = 0; for (i = 0; i < numInts; i++) { if (integers[i] != 0) { // this is preferable to rounding when used for subviews - helps // prevent a subview getting stuck at thickness 1 during a drag resize integers[i] = MAX(floor(scalingFactor*integers[i]), 1); total += integers[i]; } } // Each non-zero integer may be as much as 1 off of its "proper" floating point value due to roundoff, // so abs(targetTotal - total) might be as much as numNonZero. We randomly choose integers to increment (or decrement) // to make up the gap, and we choose only from the non-zero values. int gap = abs(targetTotal - total); int closeGapIncrement = (targetTotal > total) ? 1 : -1; int numRemainingNonZeroInts = numNonZeroInts; for (i = 0; i < numInts && gap > 0; i++) { if (integers[i] > 0) { BOOL shouldIncrementInt = (gap == numRemainingNonZeroInts) || (rand() < (float) gap / numRemainingNonZeroInts * RAND_MAX); if (shouldIncrementInt) { integers[i] += closeGapIncrement; gap--; } numRemainingNonZeroInts--; } } return YES; } @interface KFSplitView (kfPrivate) + (NSString *)kfDefaultsKeyForName:(NSString *)name; - (void)kfSetup; - (void)kfSetupResizeCursors; - (int)kfGetDividerAtMajCoord:(float)coord; - (void)kfPutDivider:(NSUInteger)offset atMajCoord:(float)coord; - (void)kfRecalculateDividerRects; - (void)kfMoveCollapsedSubviewsOffScreen; - (void)kfSavePositionUsingAutosaveName:(id)sender; - (void)kfLayoutSubviewsUsingThicknesses:(unsigned *)subviewThicknesses; @end @implementation KFSplitView /***************** * Initialization *****************/ #pragma mark Setup/teardown: + (void)initialize { kfInUsePositionNames = [[NSMutableSet alloc] init]; } - initWithFrame:(NSRect)frameRect { if ((self = [super initWithFrame:frameRect])) { [self kfSetup]; } return self; } - initWithCoder:(NSCoder *)coder { if ((self = [super initWithCoder:coder])) { [self kfSetup]; } return self; } - (void)kfSetup { // be sure to setup cursors before calling setVertical: [self kfSetupResizeCursors]; kfCollapsedSubviews = [[NSMutableSet alloc] init]; kfDividerRects = [[NSMutableArray alloc] init]; kfDefaults = [NSUserDefaults standardUserDefaults]; kfNotificationCenter = [NSNotificationCenter defaultCenter]; [self setVertical:[self isVertical]]; } // Attempts to find cursors to use as kfIsVerticalResizeCursor and kfNotIsVerticalResizeCursor. // These cursors are eventually released, so make sure each receives a retain message now. // If no good cursors can be found, an error is printed and the arrow cursor is used. - (void)kfSetupResizeCursors { NSImage *isVerticalImage = [NSImage imageNamed:@"NSTruthHorizontalResizeCursor"]; // standard Jaguar NSSplitView resize cursor NSImage *isNotVerticalImage = [NSImage imageNamed:@"NSTruthVerticalResizeCursor"]; // standard Jaguar NSSplitView resize cursor if (!isVerticalImage) isVerticalImage = [NSImage imageNamed:@"NSTruthHResizeCursor"]; if (isVerticalImage) { kfIsVerticalResizeCursor = [[NSCursor alloc] initWithImage:isVerticalImage hotSpot:NSMakePoint(8,8)]; } if (!isNotVerticalImage) isNotVerticalImage = [NSImage imageNamed:@"NSTruthVResizeCursor"]; if (isNotVerticalImage) { kfNotIsVerticalResizeCursor = [[NSCursor alloc] initWithImage:isNotVerticalImage hotSpot:NSMakePoint(8,8)]; } if (kfIsVerticalResizeCursor == nil) { kfIsVerticalResizeCursor = [[NSCursor arrowCursor] retain]; NSLog(@"Warning - no horizontal resizing cursor located. Please report this as a bug."); } if (kfNotIsVerticalResizeCursor == nil) { kfNotIsVerticalResizeCursor = [[NSCursor arrowCursor] retain]; NSLog(@"Warning - no vertical resizing cursor located. Please report this as a bug."); } } - (void)awakeFromNib { [self kfRecalculateDividerRects]; [self setPositionAutosaveName: [super autosaveName]]; } - (void)dealloc { [self setDelegate:nil]; [self setPositionAutosaveName:@""]; [kfCollapsedSubviews release]; [kfDividerRects release]; [kfIsVerticalResizeCursor release]; [kfNotIsVerticalResizeCursor release]; [super dealloc]; } /****************** * Main processing ******************/ #pragma mark Main processing: - (void)mouseDown:(NSEvent *)theEvent { // All coordinates are major axis coordinates unless otherwise specified. See the top of the file // for an explanation of major and minor axes. float minorDim; // common dimension of all subviews NSInteger divider; // index of a divider being dragged float mouseCoord, mouseToDividerOffset; // the mouse holds on to whatever part of the divider it grabs onto float dividerThickness; float dividerCoord, prevDividerCoord; float hardMinCoord, hardMaxCoord; // absolute boundaries for dividerCoord float delMinCoord, delMaxCoord; // boundaries for dividerCoord according to the delegate (not absolute) NSView *firstSubview, *secondSubview; // subviews above and below the divider (if !isVertical) float firstSubviewMinCoord, secondSubviewMaxCoord; // top of the first, bottom of the second (if !isVertical) BOOL firstSubviewCanCollapse, secondSubviewCanCollapse; NSDate *distantFuture; float (*splitPosConstraintFunc)(id, SEL, ...); // delegate supplied function to constrain dividerCoord // setup minorDim = KFMINORDIMOFSIZE([self frame].size); dividerThickness = [self dividerThickness]; distantFuture = [NSDate distantFuture]; // PRECOMPUTATION - we do as much as we can before starting the event loop. // figure out which divider is being dragged mouseCoord = KFMAJORCOORDOFPOINT([self convertPoint:[theEvent locationInWindow] fromView:nil]); divider = [self kfGetDividerAtMajCoord:mouseCoord]; if (divider == NSNotFound) { return; } // if the event is a double click we let the delegate deal with it if ([theEvent clickCount] > 1) { if ([kfDelegate respondsToSelector:@selector(splitView:didDoubleClickInDivider:)]) { [kfDelegate splitView:self didDoubleClickInDivider:divider]; return; } } // firstSubview is the subview above (left) of the divider // secondSubview is the subview below (right) of the divider firstSubview = [[self subviews] objectAtIndex:divider]; secondSubview = [[self subviews] objectAtIndex:divider+1]; // set firstSubviewMinCoord and secondSubviewMaxCoord. Here's a little diagram: // ------------ <- firstSubviewMinCoord // // // // // ------------ <- dividerCoord (not set yet) // ------------ // // // ------------ <- secondSubviewMaxCoord if (![self isSubviewCollapsed:firstSubview]) { firstSubviewMinCoord = KFMAJORCOORDOFPOINT([firstSubview frame].origin); } else { firstSubviewMinCoord = KFMAJORCOORDOFPOINT([[kfDividerRects objectAtIndex:divider] rectValue].origin); } if (![self isSubviewCollapsed:secondSubview]) { secondSubviewMaxCoord = KFMAJORCOORDOFPOINT([secondSubview frame].origin) + KFMAJORDIMOFSIZE([secondSubview frame].size); } else { secondSubviewMaxCoord = KFMAJORCOORDOFPOINT([[kfDividerRects objectAtIndex:divider] rectValue].origin) + dividerThickness; } // hardMinCoord and hardMaxCoord are the absolute minimum and maximum values that may be // assigned to dividerCoord. delMinCoord and delMaxCoord are minimum and maximum values // for dividerCoord that are supplied by the delegate. These last are _not_ absolute: if the // delegate allows collapsing of subviews then dividerCoord can snap from delMinCoord to // hardMinCoord if the user drags the divider more than halfway across the region between them. // See Apple's NSSplitView documenation under - splitView:canCollapseSubview:. hardMinCoord = firstSubviewMinCoord; hardMaxCoord = secondSubviewMaxCoord - dividerThickness; delMinCoord = hardMinCoord; delMaxCoord = hardMaxCoord; if ([kfDelegate respondsToSelector:@selector(splitView:constrainMinCoordinate:ofSubviewAt:)]) { delMinCoord = [kfDelegate splitView:self constrainMinCoordinate:delMinCoord ofSubviewAt:divider]; } if ([kfDelegate respondsToSelector:@selector(splitView:constrainMaxCoordinate:ofSubviewAt:)]) { delMaxCoord = [kfDelegate splitView:self constrainMaxCoordinate:delMaxCoord ofSubviewAt:divider]; } delMinCoord = (delMinCoord < hardMinCoord) ? hardMinCoord : delMinCoord; delMaxCoord = (delMaxCoord > hardMaxCoord) ? hardMaxCoord : delMaxCoord; if (delMinCoord > delMaxCoord) { // this follows apple's implementation. It says that if the delegate does // not supply any zone where the divider can sit without collapsing a subview then // ignore the delegate. The other option would be to always collapse to one subview // or the other, if one or both of the subviews are collasible. That could be a bit of a UI // problem, because the user could try to drag a subview and have nothing happen. delMinCoord = hardMinCoord; delMaxCoord = hardMaxCoord; } firstSubviewCanCollapse = NO; secondSubviewCanCollapse = NO; if ([kfDelegate respondsToSelector:@selector(splitView:canCollapseSubview:)]) { firstSubviewCanCollapse = [kfDelegate splitView:self canCollapseSubview:firstSubview]; secondSubviewCanCollapse = [kfDelegate splitView:self canCollapseSubview:secondSubview]; } // The delegate may constrain the possible values for dividerCoord. // Since this method will be called repeatedly we cache a pointer to it. splitPosConstraintFunc = NULL; if ([kfDelegate respondsToSelector:@selector(splitView:constrainSplitPosition:ofSubviewAt:)]) { splitPosConstraintFunc = (float (*)(id, SEL, ...))[kfDelegate methodForSelector:@selector(splitView:constrainSplitPosition:ofSubviewAt:)]; } // When the user grabs and drags the divider he holds onto that // particular spot while dragging. // mouseToDividerOffset is the difference between dividerCoord (the top of // the divider) and mouseCoord. mouseToDividerOffset = KFMAJORCOORDOFPOINT([[kfDividerRects objectAtIndex:divider] rectValue].origin) - mouseCoord; // EVENT-LOOP prevDividerCoord = 1000000; // something non-sensical do { mouseCoord = KFMAJORCOORDOFPOINT([self convertPoint:[theEvent locationInWindow] fromView:nil]); dividerCoord = mouseCoord + mouseToDividerOffset; if (splitPosConstraintFunc != NULL) { dividerCoord = (*splitPosConstraintFunc)(kfDelegate, @selector(splitView:constrainSplitPosition:ofSubviewAt:), self, dividerCoord, divider); } // There are five regions where user may have dragged the divider: // collapse first subview // stick the divider to delMinCoord // move freely // stick the divider to delMaxCoord // collapse the second subview if ( hardMinCoord == hardMaxCoord ) { // special case: divider is pinned. It is possible to collapse both subviews. [self setSubview:firstSubview isCollapsed:firstSubviewCanCollapse]; [self setSubview:secondSubview isCollapsed:secondSubviewCanCollapse]; dividerCoord = hardMinCoord; } else if ( firstSubviewCanCollapse && dividerCoord < hardMinCoord + (delMinCoord - hardMinCoord)/2) { // collapse first subview [self setSubview:secondSubview isCollapsed:NO]; [self setSubview:firstSubview isCollapsed:YES]; dividerCoord = hardMinCoord; } else if ( dividerCoord < delMinCoord ) { // stick to delMinCoord [self setSubview:firstSubview isCollapsed:NO]; [self setSubview:secondSubview isCollapsed:NO]; dividerCoord = delMinCoord; } else if ( dividerCoord < delMaxCoord ) { // move freely [self setSubview:firstSubview isCollapsed:NO]; [self setSubview:secondSubview isCollapsed:NO]; } else if ( !secondSubviewCanCollapse || dividerCoord < hardMaxCoord - (hardMaxCoord - delMaxCoord)/2 ) { // stick to delMaxCoord [self setSubview:firstSubview isCollapsed:NO]; [self setSubview:secondSubview isCollapsed:NO]; dividerCoord = delMaxCoord; } else { // collapse second subview [self setSubview:firstSubview isCollapsed:NO]; [self setSubview:secondSubview isCollapsed:YES]; dividerCoord = hardMaxCoord; } if (prevDividerCoord != dividerCoord) { // Position and resize elements. A collapsing subview's frame size doesn't change, // the subview just gets moved way offscreen (as in NSSplitView). // The diagram may help: // // ------------ <- firstSubviewMinCoord // // // // ------------ <- dividerCoord // ------------ <- dividerCoord + dividerThickness // // // ------------ <- secondSubviewMaxCoord [kfNotificationCenter postNotificationName:NSSplitViewWillResizeSubviewsNotification object:self]; // divider [self kfPutDivider:divider atMajCoord:dividerCoord]; // firstSubview if (![self isSubviewCollapsed:firstSubview]) { NSRect newFrame; newFrame.origin = KFPOINTWITHMAJMIN(firstSubviewMinCoord,0); newFrame.size = KFSIZEWITHMAJMIN(dividerCoord - firstSubviewMinCoord, minorDim); if (!NSEqualRects([firstSubview frame],newFrame)) { [firstSubview setFrame:newFrame]; [firstSubview setNeedsDisplay:YES]; } } else { [firstSubview setFrameOrigin:KFOffScreenPoint]; } // secondSubview if (![self isSubviewCollapsed:secondSubview]) { NSRect newFrame; newFrame.origin = KFPOINTWITHMAJMIN(dividerCoord + dividerThickness, 0); newFrame.size = KFSIZEWITHMAJMIN(secondSubviewMaxCoord - (dividerCoord + dividerThickness), minorDim); if (!NSEqualRects([secondSubview frame],newFrame)) { [secondSubview setFrame:newFrame]; [secondSubview setNeedsDisplay:YES]; } } else { [secondSubview setFrameOrigin:KFOffScreenPoint]; } [kfNotificationCenter postNotificationName:NSSplitViewDidResizeSubviewsNotification object:self]; prevDividerCoord = dividerCoord; } // get the next relevant event theEvent = [NSApp nextEventMatchingMask:NSLeftMouseDraggedMask|NSLeftMouseUpMask untilDate:distantFuture inMode:NSEventTrackingRunLoopMode dequeue:YES]; } while ([theEvent type] == NSLeftMouseDragged); // inform delegate that user has finished dragging divider if ([kfDelegate respondsToSelector:@selector(splitView:didFinishDragInDivider:)]) { [kfDelegate splitView:self didFinishDragInDivider:divider]; } } // Call this method to retile the subviews, not adjustSubviews. // It 1) dispatches will and did resize subviews notifications // 2) calls the appropriate method to do the retiling. That's a method of // the delegate if it has one and the default adjustSubviews otherwise. // 3) cleans up some other layout, like divider positions - (void)resizeSubviewsWithOldSize:(NSSize)oldBoundsSize { [kfNotificationCenter postNotificationName:NSSplitViewWillResizeSubviewsNotification object:self]; if ([kfDelegate respondsToSelector:@selector(splitView:resizeSubviewsWithOldSize:)]) { [kfDelegate splitView:self resizeSubviewsWithOldSize:oldBoundsSize]; } else { [self adjustSubviews]; } [self kfRecalculateDividerRects]; [self kfMoveCollapsedSubviewsOffScreen]; [kfNotificationCenter postNotificationName:NSSplitViewDidResizeSubviewsNotification object:self]; } // See Apple's NSSplitView docs. However, note that in general you want to call // resizeSubviewsWithOldSize:, not this method. The exception is that you might // want to call adjustSubviews from splitView:resizeSubviewsWithOldSize: in the // the delegate - (void)adjustSubviews { int i, numSubviews; NSArray *subviews; // The 'thickness' of a subview will mean the amount of space along // the major axis that the subview occupies in the splitview. // We work in integral values, though actual thicknesses are floats. // In the current OS, the floats actually have integral values. // // Ex 1: The thickness of a collapsed subview is 0. // Ex 2: For an uncollapsed subview in a horizontal (standard direction) splitview, // thickness means height. unsigned *subviewThicknesses; // setup subviews = [self subviews]; numSubviews = [subviews count]; if (numSubviews == 0) { return; } subviewThicknesses = malloc(sizeof(unsigned)*numSubviews); // Fill out subviewThicknesses array. // Also keep track of the total thickness of all subviews, and // of the first expanded subview unsigned totalSubviewThicknesses = 0; NSInteger firstExpandedSubviewIndex = NSNotFound; for (i = 0; i < numSubviews; i++) { NSView *subview = [subviews objectAtIndex:i]; if (![self isSubviewCollapsed:subview]) { subviewThicknesses[i] = floor(KFMAJORDIMOFSIZE([subview frame].size)); totalSubviewThicknesses += subviewThicknesses[i]; if (firstExpandedSubviewIndex == NSNotFound) { firstExpandedSubviewIndex = i; } } else { subviewThicknesses[i] = 0; } } // Compute new thicknesses for subviews. // In the end, the subview thicknesses should sum to the thickness of the splitview minus the space occupied by dividers. unsigned targetTotalSubviewsThickness = KFMAX(floor(KFMAJORDIMOFSIZE([self frame].size) - [self dividerThickness]*(numSubviews - 1)), 0); // If at least one of the subviews has positive thickness if (totalSubviewThicknesses != 0) { // then we can scale all the thicknesses kfScaleUInts(subviewThicknesses, numSubviews, targetTotalSubviewsThickness); } else // otherwise we'll have to expand one of the subviews to fill the entire space { if (firstExpandedSubviewIndex != NSNotFound) { subviewThicknesses[firstExpandedSubviewIndex] = targetTotalSubviewsThickness; } else { subviewThicknesses[0] = targetTotalSubviewsThickness; } } // layout subviews [self kfLayoutSubviewsUsingThicknesses:subviewThicknesses]; // cleanup free(subviewThicknesses); } // Required: Sum of all subviewThicknesses <= splitViewThickness - dividersThickness. // If the splitview has positive available space for subviews, then one of the supplied subview thicknesses // must also be positive. Extra space will be dumped into the last subview with positive thickness. // See adjustSubviews for the definition of 'thickness'. // // Does not currently put collapsed subviews off screen or do divider placement. // Could be done efficiently here, but would duplicate functionality of other methods. - (void)kfLayoutSubviewsUsingThicknesses:(unsigned *)subviewThicknesses { NSInteger i, lastPositiveThicknessSubviewIndex, numSubviews; float minorDimOfSplitViewSize; float curMajAxisPos, dividerThickness; NSArray *subviews; // setup subviews = [self subviews]; numSubviews = [subviews count]; minorDimOfSplitViewSize = KFMINORDIMOFSIZE([self frame].size); dividerThickness = [self dividerThickness]; // Compute lastPositiveThicknessSubviewIndex. lastPositiveThicknessSubviewIndex = NSNotFound; for (i = numSubviews - 1; i >= 0; i--) { if (subviewThicknesses[i] != 0) { lastPositiveThicknessSubviewIndex = i; break; } } // We walk down the major axis, setting subview frames as we go. curMajAxisPos = 0; for (i = 0; i < numSubviews; i++) { NSView *subview = [subviews objectAtIndex:i]; float newSubviewThickness = -1; // sentinel value, meaning "do not change" if (subviewThicknesses[i] == 0) // If subview should have no thickness { // then shrink its frame if it is uncollapsed. if (![self isSubviewCollapsed:subview]) { newSubviewThickness = 0; } } else // If supplied thickness is positive { // make sure the subview isn't collapsed. if ([self isSubviewCollapsed:subview]) { [self setSubview:subview isCollapsed:NO]; } // If this is the last subview that we're going to give a positive thickness if (i == lastPositiveThicknessSubviewIndex) { // we overrule the given the given value and just fill all available area. float remainingDividersThickness = (numSubviews - 1 - i)*dividerThickness; float splitViewThickness = KFMAJORDIMOFSIZE([self frame].size); newSubviewThickness = KFMAX(splitViewThickness - curMajAxisPos - remainingDividersThickness, 0); } else // If this isn't the last subview that we're going to set to a positive thickness { // use the supplied thickness. newSubviewThickness = subviewThicknesses[i]; } } // If we found a new subview thickness if (newSubviewThickness != -1) { // set the subview's frame accordingly NSPoint newSubviewOrigin = KFPOINTWITHMAJMIN(curMajAxisPos, 0); NSSize newSubviewSize = KFSIZEWITHMAJMIN(newSubviewThickness, minorDimOfSplitViewSize); NSRect newFrame = NSMakeRect(newSubviewOrigin.x, newSubviewOrigin.y, newSubviewSize.width, newSubviewSize.height); if (!NSEqualRects([subview frame],newFrame)) { [subview setFrame:newFrame]; [subview setNeedsDisplay:YES]; } // and advance down the major axis. curMajAxisPos += newSubviewThickness; } // Account for divider thickness. if (i < numSubviews - 1) { curMajAxisPos += dividerThickness; } } } - (void)kfMoveCollapsedSubviewsOffScreen { NSEnumerator *collapsedSubviewEnumerator = [kfCollapsedSubviews objectEnumerator]; NSView *subview; while ((subview = [collapsedSubviewEnumerator nextObject])) { [subview setFrameOrigin:KFOffScreenPoint]; } } - (void)drawRect:(NSRect)rect { int i, numDividers; numDividers = [kfDividerRects count]; for (i = 0; i < numDividers; i++) { [self drawDividerInRect:[[kfDividerRects objectAtIndex:i] rectValue]]; } } // returns the index ('offset' in Apple's docs) of the divider under the // given coordinate, or NSNotFound if there isn't a divider there. - (int)kfGetDividerAtMajCoord:(float)coord { NSInteger i, numDividers, result; float curDividerMinimumMajorCoord, dividerThickness; numDividers = [kfDividerRects count]; result = NSNotFound; dividerThickness = [self dividerThickness]; for (i = 0; i < numDividers; i++) { curDividerMinimumMajorCoord = KFMAJORCOORDOFPOINT([[kfDividerRects objectAtIndex:i] rectValue].origin); if (curDividerMinimumMajorCoord <= coord && coord < curDividerMinimumMajorCoord + dividerThickness) { result = i; break; } } return result; } - (void)kfPutDivider:(NSUInteger)offset atMajCoord:(float)coord { NSPoint newOrigin; NSSize newSize; NSRect newFrame; while ([kfDividerRects count] <= offset) { [kfDividerRects addObject:[NSValue valueWithRect:NSZeroRect]]; } newOrigin = KFPOINTWITHMAJMIN(coord,0); newSize = KFSIZEWITHMAJMIN([self dividerThickness], KFMINORDIMOFSIZE([self frame].size)); newFrame = NSMakeRect(newOrigin.x, newOrigin.y, newSize.width, newSize.height); if (!NSEqualRects([[kfDividerRects objectAtIndex:offset] rectValue], newFrame)) { [kfDividerRects replaceObjectAtIndex:offset withObject:[NSValue valueWithRect:newFrame]]; [self setNeedsDisplayInRect:newFrame]; [[[self subviews] objectAtIndex:offset] setNeedsDisplay:YES]; [[[self subviews] objectAtIndex:offset+1] setNeedsDisplay:YES]; } } // positions all dividers based on the current location of the subviews - (void)kfRecalculateDividerRects { float curMajAxisPos, dividerThickness; NSView* subview; NSArray* subviews; NSUInteger numSubviews, i; dividerThickness = [self dividerThickness]; subviews = [self subviews]; numSubviews = [subviews count]; curMajAxisPos = 0; for (i = 0; (i + 1) < numSubviews; i++) { subview = [subviews objectAtIndex:i]; if (![self isSubviewCollapsed:subview]) { curMajAxisPos += KFMAJORDIMOFSIZE([subview frame].size); } [self kfPutDivider:i atMajCoord:curMajAxisPos]; curMajAxisPos += dividerThickness; } NSUInteger numDividerRects = [kfDividerRects count]; if ((numDividerRects + 1) > numSubviews) { [kfDividerRects removeObjectsInRange:NSMakeRange(numSubviews-1,numDividerRects - numSubviews + 1)]; } [[self window] invalidateCursorRectsForView:self]; } - (void)resetCursorRects { int i, numDividers; numDividers = [kfDividerRects count]; for (i = 0; i < numDividers; i++) { [self addCursorRect:[[kfDividerRects objectAtIndex:i] rectValue] cursor:kfCurrentResizeCursor]; } } /****************** * Accessors ******************/ - (void)setVertical:(BOOL)flag { [super setVertical:flag]; kfIsVertical = flag; if (kfIsVertical) { kfCurrentResizeCursor = kfIsVerticalResizeCursor; } else { kfCurrentResizeCursor = kfNotIsVerticalResizeCursor; } } - (id)delegate { return kfDelegate; } // automatically registers the delegate for relevant notifications, and unregisters // the old delegate for those same notifications. - (void)setDelegate:(id)delegate { NSArray* delegateAutoRegNotifications; NSArray* delegateMethodNames; int i, numAutoRegNotifications; SEL methodSelector; delegateAutoRegNotifications = [NSArray arrayWithObjects: NSSplitViewWillResizeSubviewsNotification, NSSplitViewDidResizeSubviewsNotification, KFSplitViewDidCollapseSubviewNotification, KFSplitViewDidExpandSubviewNotification, nil]; delegateMethodNames = [NSArray arrayWithObjects: @"splitViewWillResizeSubviews:", @"splitViewDidResizeSubviews:", @"splitViewDidCollapseSubview:", @"splitViewDidExpandSubview:", nil]; numAutoRegNotifications = [delegateAutoRegNotifications count]; if (kfDelegate) { for (i = 0; i < numAutoRegNotifications; i++) { [kfNotificationCenter removeObserver:kfDelegate name:[delegateAutoRegNotifications objectAtIndex:i] object:self]; } } kfDelegate = delegate; if (kfDelegate) { for (i = 0; i < numAutoRegNotifications; i++) { methodSelector = sel_registerName([[delegateMethodNames objectAtIndex:i] cString]); if ([kfDelegate respondsToSelector:methodSelector]) { [kfNotificationCenter addObserver:kfDelegate selector:methodSelector name:[delegateAutoRegNotifications objectAtIndex:i] object:self]; } } } } - (BOOL)isSubviewCollapsed:(NSView *)subview { return [kfCollapsedSubviews containsObject:subview]; } - (void)setSubview:(NSView *)subview isCollapsed:(BOOL)flag { NSDictionary *subviewDictionary; if (flag != [self isSubviewCollapsed:subview]) { subviewDictionary = [NSDictionary dictionaryWithObject:subview forKey:@"subview"]; if (flag) { [kfCollapsedSubviews addObject:subview]; [kfNotificationCenter postNotificationName:KFSplitViewDidCollapseSubviewNotification object:self userInfo:subviewDictionary]; } else { [kfCollapsedSubviews removeObject:subview]; [kfNotificationCenter postNotificationName:KFSplitViewDidExpandSubviewNotification object:self userInfo:subviewDictionary]; } } } /********************** * Position saving **********************/ #pragma mark Position saving: // FOR DOCUMENTATION OF POSITION SAVING METHODS SEE APPLE'S NSWINDOW DOCS + (void)removePositionUsingName:(NSString *)name { [[NSUserDefaults standardUserDefaults] removeObjectForKey:[[self class] kfDefaultsKeyForName:name]]; } - (void)savePositionUsingName:(NSString *)name { NSString *key = [[self class] kfDefaultsKeyForName:name]; NSString *prop = [self plistObjectWithSavedPosition]; [kfDefaults setObject:prop forKey:key]; } - (BOOL)setPositionUsingName:(NSString *)name { BOOL result; id object; object = [kfDefaults objectForKey:[[self class] kfDefaultsKeyForName:name]]; if (object) { [self setPositionFromPlistObject:object]; result = YES; } else { result = NO; } return result; } - (BOOL)setPositionAutosaveName:(NSString *)name { if ([name isEqualToString:@""]) { name = nil; } if ([kfInUsePositionNames containsObject:name]) { return NO; } if (kfPositionAutosaveName) { [kfInUsePositionNames removeObject:kfPositionAutosaveName]; [kfPositionAutosaveName autorelease]; } kfPositionAutosaveName = [name copy]; if (kfPositionAutosaveName) { [self setPositionUsingName:kfPositionAutosaveName]; [kfInUsePositionNames addObject:kfPositionAutosaveName]; [kfNotificationCenter addObserver:self selector:@selector(kfSavePositionUsingAutosaveName:) name:NSSplitViewDidResizeSubviewsNotification object:self]; } else { [kfNotificationCenter removeObserver:self name:NSSplitViewDidResizeSubviewsNotification object:self]; } return YES; } - (NSString *)positionAutosaveName { return kfPositionAutosaveName; } static NSString *savedPositionVersionKey = @"version"; static NSString *savedPositionSubviewsKey = @"subviews"; static NSString *savedPositionSubviewFrameKey = @"frame"; static NSString *savedPositionSubviewIsCollapsedKey = @"collapsed"; static NSString *savedPositionIsVerticalKey = @"isVertical"; - (void)setPositionFromPlistObject:(id)plistObject { if ([plistObject isKindOfClass:[NSDictionary class]]) { NSDictionary *positionDict = (NSDictionary *)plistObject; // check position data format version if ([[positionDict objectForKey:savedPositionVersionKey] intValue] == 2) { NSArray *subviews, *subviewPositionsArray; int numSubviews, numSavedSubviews, numSettableSubviews, i; // set subview positions subviews = [self subviews]; numSubviews = [subviews count]; subviewPositionsArray = [positionDict objectForKey:savedPositionSubviewsKey]; // what if the number of saved subview records and the actual number of subviews don't match? // we'll set positions until we run out of either subviews or data records numSavedSubviews = [subviewPositionsArray count]; numSettableSubviews = (numSubviews < numSavedSubviews) ? numSubviews : numSavedSubviews; for (i = 0; i < numSettableSubviews; i++) { NSView *subview; NSDictionary *subviewPositionData; subview = [subviews objectAtIndex:i]; subviewPositionData = [subviewPositionsArray objectAtIndex:i]; // subview data consists of frame and collapse state [subview setFrame:NSRectFromString([subviewPositionData objectForKey:savedPositionSubviewFrameKey])]; [self setSubview:subview isCollapsed:[[subviewPositionData objectForKey:savedPositionSubviewIsCollapsedKey] boolValue]]; } // set isVertical [self setVertical:[[positionDict objectForKey:savedPositionIsVerticalKey] boolValue]]; } } [self resizeSubviewsWithOldSize:[self bounds].size]; } - (id)plistObjectWithSavedPosition { NSMutableDictionary *positionDict = [NSMutableDictionary dictionary]; // save position data format version [positionDict setObject:[NSNumber numberWithInt:2] forKey:savedPositionVersionKey]; // save subview positions NSArray *subviews; NSMutableArray *subviewPositionsArray; int numSubviews, i; subviews = [self subviews]; numSubviews = [subviews count]; subviewPositionsArray = [NSMutableArray array]; for (i = 0; i < numSubviews; i++) { NSView *subview; NSDictionary *subviewPositionData; subview = [subviews objectAtIndex:i]; // subview data consists of frame and collapse state subviewPositionData = [NSDictionary dictionaryWithObjectsAndKeys: NSStringFromRect([subview frame]), savedPositionSubviewFrameKey, [NSNumber numberWithBool:[self isSubviewCollapsed:subview]], savedPositionSubviewIsCollapsedKey, nil]; [subviewPositionsArray addObject:subviewPositionData]; } [positionDict setObject:subviewPositionsArray forKey:savedPositionSubviewsKey]; // save isVertical BOOL isVertical = [self isVertical]; [positionDict setObject:[NSNumber numberWithBool:isVertical] forKey:savedPositionIsVerticalKey]; return positionDict; } + (NSString *)kfDefaultsKeyForName:(NSString *)name { return [@"KFSplitView Position " stringByAppendingString:name]; } - (void)kfSavePositionUsingAutosaveName:(id)sender { [self savePositionUsingName:kfPositionAutosaveName]; } @end #undef KFMAJORCOORDOFPOINT #undef KFMINORCOORDOFPOINT #undef KFMAJORDIMOFSIZE #undef KFMINORDIMOFSIZE #undef KFPOINTWITHMAJORMINOR #undef KFSIZEWITHMAJORMINOR #undef KFMAX contextfree-3.0.5+dfsg1.orig/src-osx/GView.h0000644000175000017500000001006112076364074017227 0ustar brambram// GView.h // this file is part of Context Free // --------------------- // Copyright (C) 2005-2007 Mark Lentczner - markl@glyphic.com // Copyright (C) 2007-2012 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // Mark Lentczner can be contacted at markl@glyphic.com or at // Mark Lentczner, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #import #import "KFSplitView.h" @class CFDGDocument; @class TopBar; @class BitmapImageHolder; class CFDG; class Canvas; class Renderer; class qtCanvas; @interface GView : NSView { CFDG* mEngine; Renderer* mRenderer; Canvas* mCanvas; NSSize mRenderSize; // size we asked to render to NSRect mRenderedRect; // area that was actually rendered BitmapImageHolder* mRenderBitmap; // this bitmap must never be drawn NSImage* mDrawingImage; NSTimer* mUpdateTimer; int mOutputProgressDelay; bool mRendering; bool mRestartRenderer; bool mRendererFinishing; bool mRendererStopping; bool mLastRenderWasHires; bool mCloseOnRenderStopped; NSSize mLastRenderSize; double mLastRenderMin; bool mCanvasColor256; IBOutlet CFDGDocument* mDocument; IBOutlet TopBar* mTopBar; IBOutlet NSButton* mRenderControl; IBOutlet NSTextField* mStatus; IBOutlet NSProgressIndicator* mProgress; IBOutlet NSProgressIndicator* mOutputProgress; int mCurrentVariation; bool mIncrementVariationOnRender; IBOutlet NSTextField* mVariationLabel; IBOutlet NSTextField* mVariationField; IBOutlet NSStepper* mVariationStepper; IBOutlet NSView* mSaveImageAccessory; IBOutlet NSView* mSaveTileAccessory; IBOutlet NSTextField* mSaveTileWidth; IBOutlet NSTextField* mSaveTileHeight; IBOutlet NSView* mSaveAnimationAccessory; NSMenuItem* mFullScreenMenu; qtCanvas* mAnimationCanvas; bool mTiled; double mScale; } - (id)initWithFrame:(NSRect)frame; - (IBAction)toggleRender:(id)sender; - (IBAction)saveImage:(id)sender; - (IBAction)saveTileImage:(id)sender; - (IBAction)saveAsSVG:(id)sender; - (IBAction)saveAsMovie:(id)sender; - (BOOL)validateMenuItem:(NSMenuItem *)anItem; - (IBAction)enterFullscreen:(id)sender; - (void)updateFullScreenMenu; - (IBAction) showHiresRenderSheet:(id)sender; - (void)noteStats:(NSValue*)v; - (int) variation; - (bool) canvasColor256; - (bool) isTiled; - (int) isFrieze; - (NSData*) pngImageDataCropped:(BOOL)cropped multiplier:(NSSize*) mult; @end @interface GView (renderControl) - (IBAction) startRender:(id)sender; - (IBAction) finishRender:(id)sender; - (IBAction) stopRender:(id)sender; - (IBAction) repeatRender:(id)sender; - (void) startHiresRender: (NSSize) size minimum: (double) minSize; @end @interface GView (variationControl) - (void) initializeVariation; - (void) updateVariation:(BOOL)incrementIfNeeded; - (void) useVariation; - (void) reuseVariation; - (IBAction) adjustVariation:(id)sender; // sent by stepper - (IBAction) editVariation:(id)sender; // sent by text field @end contextfree-3.0.5+dfsg1.orig/src-osx/HelpMenu.plist0000644000175000017500000000125512076364074020634 0ustar brambram Context Free Site http://www.contextfreeart.org/ Forums http://www.contextfreeart.org/phpbb/ Gallery http://www.contextfreeart.org/gallery/ Original CFDG Site http://chriscoyne.com/cfdg/ Send Feedback mailto:contextfree@contextfreeart.org contextfree-3.0.5+dfsg1.orig/src-osx/ColorCalc.mm0000644000175000017500000001403112076364074020232 0ustar brambram// ColorCalc.mm // this file is part of Context Free // --------------------- // Copyright (C) 2005-2006 Mark Lentczner - markl@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // Mark Lentczner can be contacted at markl@glyphic.com or at // Mark Lentczner, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #import "ColorCalc.h" #include "HSBColor.h" namespace { NSString* buildText(float hue, float saturation, float brightness) { return [NSString stringWithFormat: @"hue %.1f sat %.4f b %.4f", hue, saturation, brightness]; } }; @implementation ColorCalc + (void)initialize { NSArray* a; a = [NSArray arrayWithObject: @"startColor"]; [self setKeys: a triggerChangeNotificationsForDependentKey: @"startHue"]; [self setKeys: a triggerChangeNotificationsForDependentKey: @"startSaturation"]; [self setKeys: a triggerChangeNotificationsForDependentKey: @"startBrightness"]; a = [NSArray arrayWithObjects: @"startHue", @"startSaturation", @"startBrightness", nil]; [self setKeys: a triggerChangeNotificationsForDependentKey: @"startColor"]; a = [NSArray arrayWithObjects: @"startHue", @"startSaturation", @"startBrightness", @"startColor", nil]; [self setKeys: a triggerChangeNotificationsForDependentKey: @"startText"]; a = [NSArray arrayWithObjects: @"startHue", @"finishHue", @"deltaSteps", @"startColor", @"finishColor", nil]; [self setKeys: a triggerChangeNotificationsForDependentKey: @"deltaHue"]; a = [NSArray arrayWithObjects: @"startSaturation", @"finishSaturation", @"deltaSteps", @"startColor", @"finishColor", nil]; [self setKeys: a triggerChangeNotificationsForDependentKey: @"deltaSaturation"]; a = [NSArray arrayWithObjects: @"startBrightness", @"finishBrightness", @"deltaSteps", @"startColor", @"finishColor", nil]; [self setKeys: a triggerChangeNotificationsForDependentKey: @"deltaBrightness"]; a = [NSArray arrayWithObjects: @"startHue", @"startSaturation", @"startBrightness", @"deltaHue", @"deltaSaturation", @"deltaBrightness", @"finishHue", @"finishSaturation", @"finishBrightness", @"startColor", @"finishColor", @"deltaSteps", nil]; [self setKeys: a triggerChangeNotificationsForDependentKey: @"deltaText"]; a = [NSArray arrayWithObjects: @"deltaHue", @"finishColor", nil]; [self setKeys: a triggerChangeNotificationsForDependentKey: @"finishHue"]; a = [NSArray arrayWithObjects: @"deltaSaturation", @"finishColor", nil]; [self setKeys: a triggerChangeNotificationsForDependentKey: @"finishSaturation"]; a = [NSArray arrayWithObjects: @"deltaBrightness", @"finishColor", nil]; [self setKeys: a triggerChangeNotificationsForDependentKey: @"finishBrightness"]; a = [NSArray arrayWithObjects: @"deltaHue", @"deltaSaturation", @"deltaBrightness", @"finishHue", @"finishSaturation", @"finishBrightness", nil]; [self setKeys: a triggerChangeNotificationsForDependentKey: @"finishColor"]; a = [NSArray arrayWithObjects: @"deltaHue", @"deltaSaturation", @"deltaBrightness", @"finishHue", @"finishSaturation", @"finishBrightness", @"finishColor", nil]; [self setKeys: a triggerChangeNotificationsForDependentKey: @"finishText"]; } - init { if ((self = [super init])) { deltaSteps = 1; finishBrightness = 1.0; } return self; } - (NSColor*) startColor { return [NSColor colorWithCalibratedHue: startHue / 360.0 saturation: startSaturation brightness: startBrightness alpha: 1.0]; } - (NSColor*) finishColor; { return [NSColor colorWithCalibratedHue: finishHue / 360.0 saturation: finishSaturation brightness: finishBrightness alpha: 1.0]; } - (void) setStartColor: (NSColor*) c { startHue = [c hueComponent] * 360.0; startSaturation = [c saturationComponent]; startBrightness = [c brightnessComponent]; } - (void) setFinishColor: (NSColor*) c; { finishHue = [c hueComponent] * 360.0; finishSaturation = [c saturationComponent]; finishBrightness = [c brightnessComponent]; } - (NSString*) startText { return buildText(startHue, startSaturation, startBrightness); } - (NSString*) finishText; { return buildText(finishHue, finishSaturation, finishBrightness); } - (float) deltaHue { return HSBColor::deltaHue(finishHue, startHue, deltaSteps); } - (void) setDeltaHue: (float) h { finishHue = startHue; for (int i = 0; i < deltaSteps; ++i) finishHue = HSBColor::adjustHue(finishHue, h); } - (float) deltaSaturation { return HSBColor::delta(finishSaturation, startSaturation, deltaSteps); } - (void) setDeltaSaturation: (float) s { finishSaturation = startSaturation; for (int i = 0; i < deltaSteps; ++i) finishSaturation = HSBColor::adjust(finishSaturation, s); } - (float) deltaBrightness { return HSBColor::delta(finishBrightness, startBrightness, deltaSteps); } - (void) setDeltaBrightness: (float) b { finishBrightness = startBrightness; for (int i = 0; i < deltaSteps; ++i) finishBrightness = HSBColor::adjust(finishBrightness, b); } - (NSString*) deltaText { return buildText( [self deltaHue], [self deltaSaturation], [self deltaBrightness]); } @end contextfree-3.0.5+dfsg1.orig/src-osx/qtCanvas.mm0000644000175000017500000001435512076364074020162 0ustar brambram// qtCanvas.mm // this file is part of Context Free // --------------------- // Copyright (C) 2006-2008 Mark Lentczner - markl@glyphic.com // Copyright (C) 2011-2012 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // Mark Lentczner can be contacted at markl@glyphic.com or at // Mark Lentczner, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #include "qtCanvas.h" #import #import #if !__LP64__ #import #endif class qtCanvas::Impl { Impl(NSString* name, BitmapImageHolder* bits, int fps, int qual, bool mpeg4); ~Impl(); void addFrame(); void enterThread(); void exitThread(); int mFrameRate; NSSize mSize; #if !__LP64__ DataHandler mDataHandler; #else NSObject* mDataHandler; #endif QTMovie* mMovie; NSDictionary* mDict; BitmapImageHolder* mImageData; NSError* mError; friend class qtCanvas; }; qtCanvas::Impl::Impl(NSString* name, BitmapImageHolder* bits, int fps, int qual, bool mpeg4) : mFrameRate(fps), mDataHandler(nil), mDict(nil), mImageData([bits retain]), mError(nil) { mSize.width = (CGFloat)[bits pixelsWide]; mSize.height = (CGFloat)[bits pixelsHigh]; // Check first if the new QuickTime 7.2.1 initToWritableFile: method is available if ([[[[QTMovie alloc] init] autorelease] respondsToSelector:@selector(initToWritableFile:error:)] == YES) { mMovie = [[QTMovie alloc] initToWritableFile: name error: &mError]; [mError retain]; } else { #if !__LP64__ OSErr err = -1; Handle dataRef = nil; OSType dataRefType; // create a file data reference for our movie err = QTNewDataReferenceFromFullPathCFString((CFStringRef)name, (QTPathStyle)kQTNativeDefaultPathStyle, 0, &dataRef, &dataRefType); // create a QuickTime movie from our file data reference Movie qtMovie = nil; if (err == noErr) { CreateMovieStorage(dataRef, dataRefType, 'TVOD', smSystemScript, createMovieFileDeleteCurFile | createMovieFileDontCreateResFile | newMovieActive, &mDataHandler, &qtMovie); err = GetMoviesError(); } if (err != noErr) { DisposeHandle(dataRef); mError = [[NSError alloc] initWithDomain: NSOSStatusErrorDomain code: (NSInteger)err userInfo: nil]; } else { mMovie = [[QTMovie movieWithQuickTimeMovie:qtMovie disposeWhenDone:YES error: &mError] retain]; [mError retain]; } #else mError = [[NSError alloc] initWithDomain: @"" code: (NSInteger)42 userInfo: nil]; #endif } if (mMovie && !mError) { [mMovie setAttribute:[NSNumber numberWithBool:YES] forKey:QTMovieEditableAttribute]; [mMovie detachFromCurrentThread]; long q = codecLosslessQuality; switch (qual) { case 0: q = codecMinQuality; break; case 1: q = codecLowQuality; break; case 2: q = codecNormalQuality; break; case 3: q = codecHighQuality; break; default: q = codecLosslessQuality; break; } mDict = [[NSDictionary dictionaryWithObjectsAndKeys:mpeg4 ? @"mp4v" : @"rle ", QTAddImageCodecType, [NSNumber numberWithLong: q], QTAddImageCodecQuality, nil] retain]; } } qtCanvas::Impl::~Impl() { [mMovie release]; mMovie = nil; [mError release]; mError = nil; [mDict release]; mDict = nil; [mImageData release];; mImageData = nil; } void qtCanvas::Impl::addFrame() { NSImage* img = [[NSImage alloc] initWithSize: mSize]; NSBitmapImageRep* rep = [mImageData newImageRep]; [img addRepresentation: rep]; [img setCachedSeparately: YES]; ; [mMovie addImage: img forDuration: QTMakeTime(100, mFrameRate) withAttributes: mDict]; [img release]; [rep release]; } void qtCanvas::Impl::enterThread() { [QTMovie enterQTKitOnThread]; [mMovie attachToCurrentThread]; } void qtCanvas::Impl::exitThread() { [mMovie updateMovieFile]; [mMovie invalidate]; #if !__LP64__ if (mDataHandler) UpdateMovieInStorage([mMovie quickTimeMovie], mDataHandler); DisposeMovie([mMovie quickTimeMovie]); if (mDataHandler) CloseMovieStorage(mDataHandler); #endif [mMovie detachFromCurrentThread]; [QTMovie exitQTKitOnThread]; } qtCanvas::qtCanvas(NSString* name, BitmapImageHolder* bits, int fps, int qual, bool mpeg4) : aggCanvas(QT_Blend), impl(* new Impl(name, bits, fps, qual, mpeg4)) { if (bits) attach([bits bitmapData], [bits pixelsWide], [bits pixelsHigh], [bits bytesPerRow]); } qtCanvas::~qtCanvas() { delete &impl; } void qtCanvas::end() { aggCanvas::end(); impl.addFrame(); } NSError* qtCanvas::getError() const { return impl.mError; } void qtCanvas::enterThread() { impl.enterThread(); } void qtCanvas::exitThread() { impl.exitThread(); } contextfree-3.0.5+dfsg1.orig/src-osx/TopBar.mm0000644000175000017500000000561512076364074017570 0ustar brambram// TopBar.mm // this file is part of Context Free // --------------------- // Copyright (C) 2005 Mark Lentczner - markl@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // Mark Lentczner can be contacted at markl@glyphic.com or at // Mark Lentczner, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #import "TopBar.h" #include namespace { void moveView(NSView* superView, NSView* subView, const NSRect& oldSubFrame, const NSRect& newSubFrame) { if (NSEqualRects(oldSubFrame, newSubFrame)) return; [superView setNeedsDisplayInRect: oldSubFrame]; [subView setFrame: newSubFrame]; [subView setNeedsDisplay: YES]; } }; @implementation TopBar - (void)awakeFromNib { [self relayout]; } - (void)relayout { [self resizeSubviewsWithOldSize: [self frame].size]; } - (void)resizeSubviewsWithOldSize:(NSSize)oldBoundsSize { NSSize size = [self frame].size; NSRect midOld = [mCenterControls frame]; NSRect midNew = midOld; midNew.origin.x = floor((size.width - midNew.size.width) / 2.0); moveView(self, mCenterControls, midOld, midNew); NSRect leftOld = [mLeftStatus frame]; NSRect leftNew = leftOld; float xSpace = leftOld.origin.x; leftNew.size.width = midNew.origin.x - xSpace - leftNew.origin.x; moveView(self, mLeftStatus, leftOld, leftNew); float rightEdge = size.width; if (![mProgressOne isHidden]) { NSRect progOld = [mProgressOne frame]; NSRect progNew = progOld; progNew.origin.x = rightEdge - xSpace - progNew.size.width; moveView(self, mProgressOne, progOld, progNew); rightEdge = progNew.origin.x; } if (![mProgressTwo isHidden]) { NSRect progOld = [mProgressTwo frame]; NSRect progNew = progOld; progNew.origin.x = rightEdge - xSpace - progNew.size.width; moveView(self, mProgressTwo, progOld, progNew); rightEdge = progNew.origin.x; } NSRect rightOld = [mRightStatus frame]; NSRect rightNew = rightOld; rightNew.origin.x = midNew.origin.x + midNew.size.width + xSpace; rightNew.size.width = rightEdge - xSpace - rightNew.origin.x; moveView(self, mRightStatus, rightOld, rightNew); } @end contextfree-3.0.5+dfsg1.orig/src-osx/English.lproj/0000755000175000017500000000000012245646004020547 5ustar brambramcontextfree-3.0.5+dfsg1.orig/src-osx/English.lproj/GalleryUploader.nib/0000755000175000017500000000000012245646004024411 5ustar brambramcontextfree-3.0.5+dfsg1.orig/src-osx/English.lproj/GalleryUploader.nib/designable.nib0000644000175000017500000046434112076364074027222 0ustar brambram 1050 11D50 1938 1138.32 568.00 YES YES com.apple.InterfaceBuilder.CocoaPlugin com.apple.WebKitIBPlugin YES 1938 822 YES NSScroller NSNumberFormatter NSButton NSScrollView NSImageView NSButtonCell NSBox NSProgressIndicator NSTextFieldCell NSImageCell WebView NSMatrix NSCustomObject NSTextView NSView NSWindowTemplate NSTextField NSUserDefaultsController YES com.apple.InterfaceBuilder.CocoaPlugin com.apple.WebKitIBPlugin PluginDependencyRecalculationVersion YES GalleryUploader FirstResponder NSApplication 3 2 {{355, 587}, {445, 140}} -260571136 Upload to Gallery NSPanel View {200, 100} 256 YES 266 {{99, 103}, {281, 17}} YES 67239424 4194304 Upload to Context Free Gallery on-line LucidaGrande-Bold 13 2072 6 System controlColor 3 MC42NjY2NjY2NjY3AA 6 System controlTextColor 3 MAA 268 YES YES Apple PDF pasteboard type Apple PICT pasteboard type Apple PNG pasteboard type NSFilenamesPboardType NeXT Encapsulated PostScript v1.2 pasteboard type NeXT TIFF v4.0 pasteboard type {{20, 56}, {64, 64}} YES 130560 33554432 NSImage GenericNetworkIcon 0 0 0 NO YES 274 YES 274 {355, 103} {{90, 0}, {355, 103}} {0, 0} 67239424 0 Box LucidaGrande 11 3100 6 System textBackgroundColor 3 MQA 3 MCAwLjgwMDAwMDAxAA 0 3 0 NO {445, 140} {{0, 0}, {1680, 1050}} {200, 122} {10000000000000, 10000000000000} YES YES VariationFormatter 3 2 {{724, 209}, {355, 636}} -260571136 Upload to Gallery NSPanel View {200, 100} 256 YES 289 {{264, 12}, {85, 32}} YES 67239424 134217728 Upload LucidaGrande 13 1044 -2038284033 1 DQ 200 25 289 {{179, 12}, {85, 32}} YES 67239424 134217728 Cancel -2038284033 1 Gw 200 25 266 {{9, 546}, {337, 70}} YES 67239424 4194304 WW91IGNhbiBzaGFyZSB0aGlzIGltYWdlIGFuZCBDRkRHIGZpbGUgd2l0aCB0aGUgQ29udGV4dCBGcmVl IGNvbW11bml0eSBvbiB0aGUgSW50ZXJuZXQuCgpCeSB1cGxvYWRpbmcsIHlvdSB3aWxsIGJlIHNoYXJp bmcgdGhpcyBwYXJ0aWN1bGFyIGltYWdlLCB0aGUgQ0ZERyBzb3VyY2UgdGV4dCwgYW5kIHRoZSB2YXJp YXRpb24gY29kZSB3aXRoIHRoZSBwdWJsaWMuA 256 {{254, 490}, {92, 28}} YES 67239424 138543104 Don't have an account? 256 {{9, 497}, {76, 17}} YES 67239424 71303168 User name: 256 {{9, 465}, {68, 17}} YES 67239424 71303168 Password: 256 {{90, 495}, {153, 22}} YES -1804468671 4195328 YES 6 System textColor 256 {{90, 463}, {153, 22}} YES -1804468671 4195328 YES 256 {{262, 458}, {86, 28}} YES 67239424 134348800 Create One -2038284033 1 200 25 266 {{12, 446}, {331, 5}} {0, 0} 67239424 0 Box 3 MCAwLjgwMDAwMDAxAA 3 2 0 NO 256 {{9, 414}, {36, 17}} YES 67239424 71303168 Title: 256 {{59, 412}, {284, 22}} YES -1804468671 4195328 YES 256 {{9, 389}, {45, 17}} YES 67239424 71303168 Notes: 256 YES 2304 YES 2322 YES YES Apple HTML pasteboard type Apple PDF pasteboard type Apple PICT pasteboard type Apple PNG pasteboard type Apple URL pasteboard type CorePasteboardFlavorType 0x6D6F6F76 NSColor pasteboard type NSFilenamesPboardType NSStringPboardType NeXT Encapsulated PostScript v1.2 pasteboard type NeXT RTFD pasteboard type NeXT Rich Text Format v1.0 pasteboard type NeXT TIFF v4.0 pasteboard type NeXT font pasteboard type NeXT ruler pasteboard type WebURLsWithTitlesPboardType public.url {282, 92} YES 6 282 1 67121123 0 YES YES NSBackgroundColor NSColor YES 6 System selectedTextBackgroundColor 6 System selectedTextColor YES YES NSColor NSUnderline YES 1 MCAwIDEAA 1 6 {282, 10000000} {{1, 1}, {282, 92}} {4, 5} 12582912 YES YES TU0AKgAAAHCAFUqgBVKsAAAAwdVQUqwaEQeIRGJRGFlYqwWLQ+JxuOQpVRmEx2RROKwOQyOUQSPyaUym SxqWyKXyeYxyZzWbSuJTScRCbz2Nz+gRKhUOfTqeUai0OSxiWTiBQSHSGFquGwekxyAgAAAOAQAAAwAA AAEAEAAAAQEAAwAAAAEAEAAAAQIAAwAAAAIACAAIAQMAAwAAAAEABQAAAQYAAwAAAAEAAQAAAREABAAA AAEAAAAIARIAAwAAAAEAAQAAARUAAwAAAAEAAgAAARYAAwAAAAEAEAAAARcABAAAAAEAAABnARwAAwAA AAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA 3 MCAwAA 4 -2147483392 {{-30, 1}, {15, 92}} _doScroller: 1 -2147483392 {{-100, -100}, {87, 18}} 1 _doScroller: 1 0.94565218687057495 {{59, 310}, {284, 94}} 133650 AAAAAAAAAAAAAAAAAAAAAA 266 {{12, 529}, {331, 5}} {0, 0} 67239424 0 Box 3 MCAwLjgwMDAwMDAxAA 3 2 0 NO 256 {{9, 265}, {30, 17}} YES 67239424 272629760 File: 256 {{210, 265}, {36, 17}} YES 67239424 272629760 .cfdg 256 {{275, 214}, {58, 38}} YES 2 1 YES -2080244224 131072 JPEG 1211912703 2 NSImage NSRadioButton NSRadioButton 200 25 67239424 131072 PNG-8 1 1211912703 2 200 25 {58, 18} {4, 2} 1143472128 NSActionCell 67239424 131072 Radio 1211912703 0 400 75 256 {{264, 260}, {82, 28}} YES 67239424 138543104 R2FsbGVyeSBpbWFnZQpjb21wcmVzc2lvbjo 266 {{12, 294}, {331, 5}} {0, 0} 67239424 0 Box 3 MCAwLjgwMDAwMDAxAA 3 2 0 NO 256 {{59, 263}, {146, 22}} YES -1804468671 71304192 YES 256 {{9, 236}, {65, 17}} YES 67239424 272629760 Variation: 256 {{76, 236}, {82, 17}} YES 67239424 272629760 WWWWWW 290 {{12, 47}, {331, 5}} {0, 0} 67239424 0 Box 3 MCAwLjgwMDAwMDAxAA 3 2 0 NO 268 {{10, 209}, {120, 18}} YES 67239424 0 Crop the image 1211912703 2 NSSwitch 200 25 290 {{12, 166}, {331, 5}} {0, 0} 67239424 0 Box 3 MCAwLjgwMDAwMDAxAA 3 2 0 NO 256 {{9, 141}, {60, 17}} YES 67239424 4194304 License: 268 {{64, 124}, {282, 34}} YES 67239424 272629760 268 {{65, 58}, {114, 60}} YES 67239424 134217728 LucidaGrande 10 16 -2033958657 130 400 75 268 {{179, 88}, {96, 32}} YES 67239424 134217728 Change -2038284033 129 200 25 268 {{10, 186}, {120, 18}} YES 67239424 0 Upload as tiled 1211912703 2 200 25 268 {{33, 210}, {150, 17}} YES 68288064 71304192 Width 268 {{136, 182}, {45, 17}} YES 68288064 272630784 Height 268 {{190, 208}, {75, 22}} YES -1804468671 272630784 YES YES allowsFloats formatterBehavior locale negativeInfinitySymbol nilSymbol numberStyle positiveInfinitySymbol YES -∞ +∞ #,##0.### #,##0.### NaN YES YES 0 0 YES NO 1 AAAAAAAAAAAAAAAAAAAAAA 3 YES YES YES . , YES NO YES YES 268 {{190, 180}, {75, 22}} YES -1804468671 272630784 YES YES allowsFloats formatterBehavior locale negativeInfinitySymbol nilSymbol numberStyle positiveInfinitySymbol YES -∞ +∞ #,##0.### #,##0.### NaN 3 YES YES YES . , YES NO YES YES 268 {{160, 236}, {97.58349609375, 17}} YES 68288064 272630784 Size Multiplier: {355, 636} {{0, 0}, {1680, 1050}} {200, 122} {10000000000000, 10000000000000} YES 3 2 {{656, 665}, {355, 130}} -260571136 Upload to Gallery NSPanel View {200, 100} 256 YES 289 {{256, 12}, {85, 32}} YES 67239424 134217728 Cancel -2038284033 1 Gw 200 25 266 {{9, 96}, {70, 14}} YES 67239424 4194304 Uploading… 290 {{12, 49}, {323, 5}} {0, 0} 67239424 0 Box 3 MCAwLjgwMDAwMDAxAA 3 2 0 NO 1280 {{10, 68}, {327, 20}} 16394 100 {355, 130} {{0, 0}, {1680, 1050}} {200, 122} {10000000000000, 10000000000000} YES 3 2 {{542, 384}, {355, 214}} -260571136 Upload to Gallery NSPanel View {200, 100} 256 YES 289 {{264, 12}, {85, 32}} YES 67239424 134217728 OK -2038284033 1 DQ 200 25 290 {{12, 49}, {331, 5}} {0, 0} 67239424 0 Box 3 MCAwLjgwMDAwMDAxAA 3 2 0 NO 256 YES 2304 YES 2322 {329, 14} YES 6 329 1 67119981 0 YES YES NSBackgroundColor NSColor YES YES YES NSColor NSUnderline YES 1 6 {329, 10000000} {114, 0} {{1, 1}, {329, 137}} 4 -2147483392 {{-30, 1}, {15, 137}} _doScroller: 1 256 {{-100, -100}, {87, 18}} 1 _doScroller: 1 0.94565218687057495 {{12, 60}, {331, 139}} 133650 256 {{155, 12}, {101, 32}} YES 604110336 134217728 Try Again -2038284033 1 200 25 {355, 214} {{0, 0}, {1680, 1050}} {200, 122} {10000000000000, 10000000000000} YES 3 2 {{196, 344}, {355, 503}} -201326592 Upload to Gallery NSPanel 256 YES 268 {{240, 12}, {101, 32}} YES 67239424 134217728 Set License -2038284033 129 200 25 268 {{144, 12}, {96, 32}} YES 67239424 134217728 Cancel -2038284033 129 200 25 256 YES YES Apple HTML pasteboard type Apple PDF pasteboard type Apple PICT pasteboard type Apple URL pasteboard type Apple Web Archive pasteboard type NSColor pasteboard type NSFilenamesPboardType NSStringPboardType NeXT RTFD pasteboard type NeXT Rich Text Format v1.0 pasteboard type NeXT TIFF v4.0 pasteboard type WebURLsWithTitlesPboardType public.png public.url public.url-name {{20, 60}, {315, 423}} YES YES WebKitDefaultFixedFontSize WebKitDefaultFontSize WebKitMinimumFontSize YES NO YES {355, 503} {{0, 0}, {1680, 1050}} {10000000000000, 10000000000000} YES 256 {125, 1} 256 {125, 1} 256 {125, 1} 256 {125, 1} 256 {125, 1} 256 {125, 1} 256 {125, 1} YES window 63 mContentView 291 mProgressView 292 mProgressBar 293 cancel: 294 mUserNameField 295 mPasswordField 296 mTitleField 297 mNotesView 298 mFileField 299 mVariationField 300 mCompressionMatrix 301 goToCreateAccount: 302 cancel: 303 upload: 304 mDoneView 305 cancel: 307 mMessage 315 retry: 321 mRetryButton 322 mLicenseImage 402 mLicenseName 403 changeLicense: 404 licenseDetails: 405 mCreativeCommonsWidget 415 updateLicense: 416 noChangeLicense: 417 mLicenseView 418 mFormView 419 mTiled 463 mSaveTileWidth 516 mSaveTileHeight 517 mWidthLabel 518 mHeightLabel 519 mCropCheck 520 mMultLabel 523 delegate 64 value: values.UserPassword value: values.UserPassword value values.UserPassword 2 316 value: values.UserName value: values.UserName value values.UserName 2 312 formatter 309 value: values.SaveCropped value: values.SaveCropped value values.SaveCropped 2 318 YES 0 -2 File's Owner -1 First Responder -3 Application 7 YES Upload Sheet 8 YES 35 YES 40 YES 188 YES 59 Shared Defaults 67 VariationFormatter1 83 YES Upload Form 84 YES 85 YES 87 YES 88 YES 89 YES 90 YES 91 YES 93 YES 95 YES 96 97 YES 98 YES 99 YES 100 101 102 YES 103 YES 104 YES 105 YES 107 YES 108 YES 109 YES 110 YES 111 YES 112 YES 113 YES 114 YES 116 YES 317 YES 392 YES 394 YES 396 YES 398 YES 400 YES 461 YES 190 YES Upload Progress 191 YES 196 YES 207 YES 221 YES 257 258 YES Upload Done 259 YES 268 YES 289 YES 313 YES 314 320 YES 408 YES Upload License 409 YES 410 YES 412 YES 414 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 86 92 106 117 393 222 290 506 YES 507 508 YES 509 510 YES 511 YES 512 513 YES 514 YES 515 521 YES 522 YES YES -1.IBPluginDependency -2.IBPluginDependency -3.IBPluginDependency 100.IBPluginDependency 101.IBPluginDependency 102.IBPluginDependency 103.IBPluginDependency 104.IBPluginDependency 105.IBPluginDependency 106.IBPluginDependency 107.IBPluginDependency 108.IBPluginDependency 109.IBPluginDependency 110.IBPluginDependency 111.IBPluginDependency 112.IBPluginDependency 113.IBPluginDependency 114.IBPluginDependency 116.IBPluginDependency 117.IBPluginDependency 188.IBPluginDependency 190.IBPluginDependency 191.IBPluginDependency 196.IBPluginDependency 207.IBPluginDependency 221.IBPluginDependency 222.IBPluginDependency 257.IBPluginDependency 258.IBPluginDependency 259.IBPluginDependency 268.IBPluginDependency 289.IBPluginDependency 290.IBPluginDependency 313.IBPluginDependency 314.IBPluginDependency 317.IBPluginDependency 320.IBPluginDependency 35.IBPluginDependency 392.IBPluginDependency 393.IBPluginDependency 394.IBPluginDependency 396.IBPluginDependency 398.IBPluginDependency 40.IBPluginDependency 400.IBPluginDependency 408.IBPluginDependency 409.IBPluginDependency 410.IBPluginDependency 412.IBPluginDependency 414.IBPluginDependency 461.IBPluginDependency 468.IBPluginDependency 469.IBPluginDependency 470.IBPluginDependency 471.IBPluginDependency 472.IBPluginDependency 473.IBPluginDependency 474.IBPluginDependency 475.IBPluginDependency 476.IBPluginDependency 477.IBPluginDependency 478.IBPluginDependency 479.IBPluginDependency 480.IBPluginDependency 481.IBPluginDependency 482.IBPluginDependency 483.IBPluginDependency 484.IBPluginDependency 485.IBPluginDependency 486.IBPluginDependency 487.IBPluginDependency 488.IBPluginDependency 490.IBPluginDependency 491.IBPluginDependency 492.IBPluginDependency 493.IBPluginDependency 494.IBPluginDependency 495.IBPluginDependency 496.IBPluginDependency 497.IBPluginDependency 498.IBPluginDependency 499.IBPluginDependency 500.IBPluginDependency 501.IBPluginDependency 502.IBPluginDependency 502.IBShouldRemoveOnLegacySave 503.IBPluginDependency 503.IBShouldRemoveOnLegacySave 504.IBPluginDependency 504.IBShouldRemoveOnLegacySave 505.IBPluginDependency 505.IBShouldRemoveOnLegacySave 506.IBPluginDependency 507.IBPluginDependency 508.IBPluginDependency 509.IBPluginDependency 510.IBPluginDependency 511.IBPluginDependency 512.IBNumberFormatterBehaviorMetadataKey 512.IBNumberFormatterLocalizesFormatMetadataKey 512.IBPluginDependency 513.IBPluginDependency 514.IBPluginDependency 515.IBNumberFormatterBehaviorMetadataKey 515.IBNumberFormatterLocalizesFormatMetadataKey 515.IBPluginDependency 521.IBPluginDependency 522.IBPluginDependency 59.IBPluginDependency 67.IBPluginDependency 7.IBPluginDependency 8.IBPluginDependency 83.IBPluginDependency 83.IBWindowTemplateEditedContentRect 84.IBPluginDependency 85.IBPluginDependency 86.IBPluginDependency 87.IBPluginDependency 88.IBPluginDependency 89.IBPluginDependency 90.IBPluginDependency 91.IBPluginDependency 92.IBPluginDependency 93.IBPluginDependency 95.IBPluginDependency 96.IBPluginDependency 97.CustomClassName 97.IBPluginDependency 98.IBPluginDependency 99.IBAttributePlaceholdersKey 99.IBPluginDependency YES com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.WebKitIBPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{65, 371}, {355, 624}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin NSSecureTextField com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip default value is probably best com.apple.InterfaceBuilder.CocoaPlugin YES YES 523 YES FirstResponder : id : : id IBUserSource GalleryUploader NSWindowController YES YES cancel: changeLicense: goToCreateAccount: licenseDetails: noChangeLicense: retry: show: updateLicense: upload: YES id id id id id id id id id YES YES cancel: changeLicense: goToCreateAccount: licenseDetails: noChangeLicense: retry: show: updateLicense: upload: YES cancel: id changeLicense: id goToCreateAccount: id licenseDetails: id noChangeLicense: id retry: id show: id updateLicense: id upload: id YES YES mCompressionMatrix mContentView mCreativeCommonsWidget mCropCheck mDoneView mFileField mFormView mHeightLabel mLicenseImage mLicenseName mLicenseView mMessage mMultLabel mNotesView mPasswordField mProgressBar mProgressView mRetryButton mSaveTileHeight mSaveTileWidth mTiled mTitleField mUserNameField mVariationField mWidthLabel YES NSMatrix NSView WebView NSButton NSView NSTextField NSView NSTextField NSButton NSTextField NSView NSTextView NSTextField NSTextView NSTextField NSProgressIndicator NSView NSButton NSTextField NSTextField NSButton NSTextField NSTextField NSTextField NSTextField YES YES mCompressionMatrix mContentView mCreativeCommonsWidget mCropCheck mDoneView mFileField mFormView mHeightLabel mLicenseImage mLicenseName mLicenseView mMessage mMultLabel mNotesView mPasswordField mProgressBar mProgressView mRetryButton mSaveTileHeight mSaveTileWidth mTiled mTitleField mUserNameField mVariationField mWidthLabel YES mCompressionMatrix NSMatrix mContentView NSView mCreativeCommonsWidget WebView mCropCheck NSButton mDoneView NSView mFileField NSTextField mFormView NSView mHeightLabel NSTextField mLicenseImage NSButton mLicenseName NSTextField mLicenseView NSView mMessage NSTextView mMultLabel NSTextField mNotesView NSTextView mPasswordField NSTextField mProgressBar NSProgressIndicator mProgressView NSView mRetryButton NSButton mSaveTileHeight NSTextField mSaveTileWidth NSTextField mTiled NSButton mTitleField NSTextField mUserNameField NSTextField mVariationField NSTextField mWidthLabel NSTextField IBProjectSource ./Classes/GalleryUploader.h VariationFormatter NSFormatter IBProjectSource ./Classes/VariationFormatter.h WebView reloadFromOrigin: id reloadFromOrigin: reloadFromOrigin: id IBProjectSource ./Classes/WebView.h 0 IBCocoaFramework com.apple.InterfaceBuilder.CocoaPlugin.macosx com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 YES 3 YES YES GenericNetworkIcon NSRadioButton YES {128, 128} {16, 15} contextfree-3.0.5+dfsg1.orig/src-osx/English.lproj/GalleryUploader.nib/keyedobjects.nib0000644000175000017500000007673212076364074027603 0ustar brambrambplist00 X$versionX$objectsY$archiverT$top#$*.2_g"%(-459>QW[`acdelmrsv{~ "#./09:@CQWgk}~#L  +,-0:;<?FGPQTUV[deny~  )123?FGHQRS\dghr{|     "'+.2<DLMNXYdefgmpyz")*+4=BCKLMV^_`iqrs| ,-./0123458<=BCJKLMRSXY^_djqryz  "#()./45:UVWX[\bijqrwx           " ) * + 2 3 4           # $ A                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  U$null _NSVisibleWindows]NSObjectsKeysVNSRoot\NSOidsValuesV$classZNSOidsKeys]NSConnections_NSObjectsValues_NSAccessibilityConnectors_NSAccessibilityOidsKeys_NSAccessibilityOidsValuesKJI !"[NSClassName_GalleryUploader%&'(Z$classnameX$classes^NSCustomObject')XNSObject +,-ZNS.objects%&/0\NSMutableSet/1)UNSSet +34 *56789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^1BcmāƁȁʁ́΁Ёҁԁ   `abcdeWNSLabel]NSDestinationXNSSource0/ hijk lmnopqrstuvwxyz{|}~}_NSCellBackgroundColorXNSvFlags_NSNextResponder_NSBackgroundColor[NSProtoCell[NSCellClassZNSCellSizeYNSNumRowsYNSNumCols_NSIntercellSpacing^NSSelectedCellXNSWindow]NSMatrixFlagsWNSFrameYNSEnabled[NSSuperviewVNSFont]NSNextKeyViewWNSCells, '.$#!" D( - y wijs|[NSFrameSizeZNSSubviews̀7 _{{275, 214}, {58, 38}}vyuwi js}}VNSCell WVX  k +3  e_NSPeriodicInterval[NSCellFlags]NSButtonFlags\NSCellFlags2_NSAlternateContents_NSKeyEquivalent]NSNormalImageZNSContents]NSControlView_NSAlternateImageYNSSupport_NSPeriodicDelay^NSButtonFlags2H\NSScrollView=23)vuwi jAB | nkn_{{155, 12}, {101, 32}} H$%JL-$&--YTry Again SPZ{355, 214}YmDoneView `abcXY0vyuwi js]^_}|} _{{59, 263}, {146, 22}}vyuwi jsghi}|} ,+- fokpqYhuk_NSDrawsBackgroundqA@&?- < |(+YtextColor%&[NSTextField123)ZmFileField `abc}0  +3 $]egY€ǀ̀Ӏ؀Հڀހ΁' ,07>dBDHLP fW[_;vyuwi js}} ĀÀŀ k _{{264, 12}, {85, 32}} $%'-&t-ƀ€-VUploadvyuwi js}} €Ȁɀ k _{{179, 12}, {85, 32}} $%-&ˀ-ʀǀ-VCancelQvyuwi js}} ΀̀π  _{{9, 546}, {337, 70}}?@yu wiBjCsDEFI} }LP؁$@ %9 fkh~@Ѐ̀?р'_You can share this image and CFDG file with the Context Free community on the Internet. By uploading, you will be sharing this particular image, the CFDG source text, and the variation code with the public. (+Ҁ_controlTextColorvyuwi js}|} ՀԀր _{{254, 490}, {92, 28}}vyuwi js}|} ހ݀߀ fkh~B׀Ӏ?р'_Don't have an account?vyuwi js}|} ڀـۀ _{{9, 497}, {76, 17}}vyuwi js#$}|} Ӏ fk*+h~@܀؀?р-'ZUser name:_{{9, 465}, {68, 17}}vyuw ij s478}:|}<>_NSOriginalClassName fk*@h~Հ?р-'YPassword:_{{90, 495}, {153, 22}} fokpIhuk@&ڀ?- <_NSSecureTextField_{{90, 463}, {153, 22}}vyuwi jsVW}|} k fokpIhuk&ހ?- <%&ef^NSClassSwappere)_{{262, 458}, {86, 28}}?@yu wiBjCsDEFkI} }LpP@ 9 $suw-&ZCreate One ~P_{{12, 446}, {331, 5}}vyuwi js}|} fkghk;?-<  +M0 0.80000001_{{9, 414}, {36, 17}}vyuwi js}|} fk*h~?р-'VTitle:_{{59, 412}, {284, 22}}vyuwi js}|} fokpIhuk&?- <_{{9, 389}, {45, 17}}yDuA wiEjsFHK}|}\NSScrollAmts!#  O ! fk*h~?р-'VNotes: +3΀ !XyYZu wi[js{_acd܀, +3߀ ԁlmnyo wipjsuvx  +,     _NSColor pasteboard type_NeXT font pasteboard type_NeXT ruler pasteboard type_NSFilenamesPboardType_#CorePasteboardFlavorType 0x6D6F6F76_NeXT TIFF v4.0 pasteboard type_Apple HTML pasteboard type_*NeXT Rich Text Format v1.0 pasteboard type_WebURLsWithTitlesPboardType_Apple URL pasteboard type_Apple PNG pasteboard type_NSStringPboardType_Apple PDF pasteboard type_1NeXT Encapsulated PostScript v1.2 pasteboard type_NeXT RTFD pasteboard typeZpublic.url_Apple PICT pasteboard typeY{282, 92}?@yu wiBjCsDEFI} }LP'3@ 49 -!#@q p#u& p) -P +30  k37{L:/, +>AÀ +FIڀ̀]_{282, 10000000}_{{1, 1}, {282, 92}} yu! wijs"#Q&(W #?_{{-30, 1}, {15, 92}} yDu!1wi js"#-\^(&c"#?B` #?_{{-100, -100}, {87, 18}}_{{59, 310}, {284, 94}}_{{12, 529}, {331, 5}} fkghjk;?&-<  o+M0 0.80000001vyuwi jsYst}|} () _{{9, 265}, {30, 17}} fk{|h~@*'?р-'UFile:_{{210, 265}, {36, 17}}vyuwi js}|} 0/1 fk{]h~.?р-'U.cfdg_{{264, 260}, {82, 28}}vyuwi js}|} 768 fkgh~2,?р'_Gallery image compression:_{{12, 294}, {331, 5}} fkghk;?5-<  +M0 0.80000001_{{9, 236}, {65, 17}}vyuwi js}|} ;:< fk{h~90?р-'ZVariation:_{{76, 236}, {82, 17}}vyuwi js}} d fk{h~=7?р-'VWWWWWW?@yu wiBjCsDEFI}5 }LPǁ?@ @9_{{12, 47}, {331, 5}} fkghk;?A-<  +M0 0.80000001?@yu wiBjCsDEFI}5 }LPDC@ E9_{{12, 166}, {331, 5}}vyuwi js}|} HGI fkghk;?F-<  +M0 0.80000001_{{9, 141}, {60, 17}}vyuwi js  }} LKM fkh~JD?р-'XLicense:_{{64, 124}, {282, 34}}vyuwi js}} POQ k fk{#h~NH?р-'P_{{65, 58}, {114, 60}}vyuwi js./}} >ST k 5%; <@&&&LR @A#@$_{{179, 88}, {96, 32}} $%FJ&&UP-VChange_{{10, 186}, {120, 18}}vyuwi jsPQ}} _^` Zŀ&&iY -_Upload as tiled_{{33, 210}, {150, 17}}vyuwi jsecd}} bc fkjqkh~@]f?р-'UWidth_{{136, 182}, {45, 17}}vyuwi jsvw}} B~ fkj}~h~@aW?р-'VHeight_{{190, 208}, {75, 22}} fokp}huk[NSFormatter[?- d< \NS.localizedVNS.nil_NS.negativeformat[NS.rounding_NS.negativeattrs_NS.positiveformatWNS.zero_NS.positiveattrsVNS.nanVNS.maxVNS.minZNS.decimal[NS.thousand_NS.hasthousands_NS.allowsfloats]NS.attributes rqyqtww{| e} +_fghijkl]mnop_positiveInfinitySymbol[numberStyle\allowsFloatsYnilSymbol_formatterBehavior_negativeInfinitySymbolb+" Pb-"Y#,##0.### sn%&_NSAttributedString)_NSAttributedString \NSAttributesvsuSNaN +݀ F-[NS.mantissaYNS.lengthZNS.compact[NS.exponent[NS.negative^NS.mantissa.boOx %&_NSDecimalNumberPlaceholder)_NSDecimalNumberPlaceholder  _NS.raise.dividebyzero_NS.raise.underflow_NS.raise.overflow_NS.roundingmode z %&_NSDecimalNumberHandler)_NSDecimalNumberHandlerQ.Q,%&_NSNumberFormatter)_NSNumberFormatter[NSFormatter_{{190, 180}, {75, 22}} fokp}huk_?- <     ww{| } +%_ !"#$&+]m&o_positiveInfinitySymbol[numberStyle\allowsFloatsYnilSymbol_formatterBehavior_negativeInfinitySymbolb+"b-"Y#,##0.### s& ;vsSNaN  z _"{{160, 236}, {97.58349609375, 17}} fkj}Dh~;?р-'_Size Multiplier:Z{355, 636}YmFormView `abcO0W\mHeightLabel `abcU0L]mLicenseImage `abc[0H\mLicenseName `abca0D +3f ghCvuwi jlm DkD_{{240, 12}, {101, 32}} $%ugJ&&-[Set Licensevuwi j|} DkD_{{144, 12}, {96, 32}} $%hJ&&ʁ-Z{355, 503}\mLicenseView `abc]0}XmMessage `abc0;ZmMultLabel `abc0ZmNotesView `abc0ހ^mPasswordField `abc0uwi jZNSMaxValue\NSDrawMatrixYNSpiFlags#@Y@ ij|7 %&ZNSPSMatrix)ZNSPSMatrix_{{10, 68}, {327, 20}}%&_NSProgressIndicator23)_NSProgressIndicator\mProgressBar `abc0Á +3̀ vuwi j k_{{256, 12}, {85, 32}} $%-&ˀ-ʁ-vuwi j _{{9, 96}, {70, 14}} fkh~?р'jUploading &?@u wiBjCDEFI5 LP@9_{{12, 49}, {323, 5}} fkghk;?-<  +M0 0.80000001Z{355, 130}]mProgressView `abc0ŀ\mRetryButton `abc 0ǁ__mSaveTileHeight `abc0Ɂ[^mSaveTileWidth `abc0ˀ VmTiled `abc0̀[mTitleField `abc%0πڀ^mUserNameField `abc+0с7_mVariationField `abc10Ӏf[mWidthLabel `abc780Հ;<=l>?@A BCDEFGHIKJMOPQRST \NSWindowRect]NSWindowTitle_NSUserInterfaceItemIdentifier\NSWindowViewYNSMinSize_NSWindowIsRestorable\NSScreenRect_NSWindowContentMinSize_NSWindowBackingYNSWTFlags]NSWindowClass[NSViewClass_NSWindowStyleMaskց׀3 x؁_{{355, 587}, {445, 140}}_Upload to GalleryWNSPanel ZTViewZ{200, 100} +3^ _`<݁2vuwi jdeJJ ށ߀33_{{99, 103}, {281, 17}} fkk_ho~݀?с'_&Upload to Context Free Gallery on-line tuv#@*_LucidaGrande-Boldvuywi j{}JJZNSEditable  33 +,PGTH_Apple PNG pasteboard type_1NeXT Encapsulated PostScript v1.2 pasteboard type_{{20, 56}, {64, 64}} LLLFWNSAlignWNSScaleWNSStyleZNSAnimates ׀_GenericNetworkIcon%&[NSImageCell)VNSCell%&[NSImageView123)Z{445, 140}_{{0, 0}, {1680, 1050}}Z{200, 122}_ {10000000000000, 10000000000000}%&_NSWindowTemplate)Vwindow `abc80Xdelegate `abc07 !_VariationFormatterYformatter `abWcancel:%&_NSNibControlConnector)^NSNibConnector `abWupload: `ab_goToCreateAccount: `ab́ `abp `abVretry: `abL_licenseDetails: `abP^changeLicense: `abg ^updateLicense: `abh _noChangeLicense: aeXNSMarkerVNSFile  _NSToolTipHelpKey_default value is probably best%&  _NSIBHelpConnector )_NSIBHelpConnector  `ab  YNSKeyPath_NSNibBindingConnectorVersionYNSBindingd  _NSSharedInstance %&  _NSUserDefaultsController  )_NSUserDefaultsController\NSController_value: values.SaveCroppedUvalue_values.SaveCropped%&  _NSNibBindingConnector !)_NSNibBindingConnector^NSNibConnector  `ab # & _value: values.UserName_values.UserName  `ab , / _value: values.UserPassword_values.UserPassword + 6v 78J_e`}<  A}gY_8e]i$tW /Qdw   ]MPB gmh} Հ3݁߁2 ؀ۀӀց,1΀ǀɀ!ހ $€ŀ->ڀ')̀πՀ߀dgBDIHMLQPT Xf\W`[cd_087<;'.npruy}5DC9;=?AEG ! ]NSApplication;<=l>?@A BCDEFG I } P RS  !׀& % $#؁"_{{724, 209}, {355, 636}} TViewZ{200, 100}_{{0, 0}, {1680, 1050}}Z{200, 122}_ {10000000000000, 10000000000000};<=l>?@A BCDEFG I  P RS  (׀-, +*؁)_{{656, 665}, {355, 130}} րTViewZ{200, 100}_{{0, 0}, {1680, 1050}}Z{200, 122}_ {10000000000000, 10000000000000};<=l>?@A BCDEFG I  P RS  /׀4n3 21؁0_{{542, 384}, {355, 214}} TViewZ{200, 100}_{{0, 0}, {1680, 1050}}Z{200, 122}_ {10000000000000, 10000000000000};<=l>@A CDEFG I  P S 6׀8D 7؀_{{196, 344}, {355, 503}}_{{0, 0}, {1680, 1050}}_ {10000000000000, 10000000000000} ij| 7:X{125, 1} ij| 7X{125, 1} ij| 7@X{125, 1}y wij  |  D7BBCX{125, 1} ij| 7FX{125, 1} ij| "7HX{125, 1} + &v8J_J`J A}}}}g}Y}}}}}}eee}}}]}}}}}}}}}}}}}}}}}}d}w}}}       ghՀ3݀33 ؀ Ӏ , ǀ ހ € ڀ ' ̀ Հ d D H L P f W [c _ 0 7 ;'.npnnyyyn5DDD +  78J_e`}<  A}gY_8e]i$tW /Qdw   ]MPB gmh} 56789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^Հ3݁߁2 ؀ۀӀց,1΀ǀɀ!ހ $€ŀ->ڀ')̀πՀ߀dgBDIHMLQPT Xf\W`[cd_087<;'.npruy}5DC9;=?AEG1BcmāƁȁʁ́΁Ёҁԁ   + C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  LMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÁāŁƁǁȁɁʁˁ́́΁ρЁсҁӁԁՁցׁ؁فځہ܁݁ށ߁   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ +3 + %& ^NSIBObjectData )_NSKeyedArchiver ]IB.objectdata"+5:?#)Viw~!$'*-6BDFXalu.02468:<?BEHKNQTWZ]`cfilorux{~ 0 H Q c w    $ & ) + - / 1 3 5 7 9 ; = ? D F G I K M O p |   = R ^ l y        ! # % ' ) + - / 4 E L S \ ^ ` i l y   - 2 ; E G H Q c j s | %-6=J{} '/4ACFWY[dgpy  CM[iv#;B_kmoqsuy &79;=?pz!#%')+-/13579D\}7Lhs#%')0246Nk02468]^`bdfhjl$-6AL]_acez|~$&(*,.02479fgikmprtv!&(*,.0246?AHJLN{)4=?ACEGILNPRT^s !*8AOk!4Na~  468:<Zoqsuw0BKT_ju| 357 Y b u | !!!0!9!B!M!O!Q!S!U!W!`!b!k!!!!!!!!!!!!!!"""4"="J"S"p"q"s"u"w"y"{"""""""""""""""###### #E#F#H#J#L#N#P#R#T#m####################$ $$$$$$($4$?$J$[$]$`$b$d$m$o$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%%%%% %%%6%7%9%;%=%?%A%C%E%]%%%%%%%%%%%%%%%%%%%&(&*&,&.&0&2&4&6&=&?&d&e&g&i&k&m&p&r&t&v&&&&&&&&&&&&&&'''''''''''( (/(0(2(4(6(8(:(<(>(W(|(}((((((((((((((((((()))))) )!)F)G)I)K)M)O)Q)S)U)v){)})))))))))))))))))))* *"*$*&*(***,*6*O*t*y*{*}****************+ ++++++++"+1+6+O+++++++++++++++++++++++, ,1,2,4,6,8,:,<,>,@,],_,a,c,e,g,t,v,,,,,,,,,,,,,,,,,,---A-B-D-F-H-J-L-N-P-u-w-y-{-}--------------....'.).+.-./.1.3.:.C.E.L.N.Q.T...........................// /./1/4/7/:/=/@/C/F/I/L/O/R/U/X/[/^/a/{////0000]0{00001141?1\1f111111111111111111112222222222"2%2R2U2W2Y2[2`2b2d2g2i2v2x2}2222222222222222233333 3 3 33-3^3`3c3f3h3q3s3u3w3y333333333344448494;4>4A4C4E4G4I4`44444444444444444445 5555555575\5]5`5c5f5h5j5l5n55555555555555566 66.6S6T6W6Z6]6_6a6c6e66666666666666666677777777#7X7Y7[7^7`7b7d7f7i7k77777777777788888 8 888(8M8N8Q8T8W8Y8[8]8_8|8~888888888888888889999999!9*9C9h9i9l9o9r9t9v9x9z999999999999999999:*:3:5:7:9:<:>:A:C:T:V:X:a:c:{::::::::::;;;;; ; ;;;;H;J;L;N;Q;S;U;W;i;;;;;;;;;;;;;;;;;;;< >>> > >>>>>>>'>)>6>9><>?>B>E>H>U>X>Z>]>`>c>f>>>>>>>>>>>>>>>????/?DWDDDDDDDDDDDDDDDDEEEEEE E"E-E:EKEMEPERETE]EnEpEsEvExEEEEEEEEEEEEEEEEEEFFF&F0F3FKLKXKlKoKrKtKwKyK|K}KKKKKKKKKKKKKKKKKKLLLL"L%L'L)L+LDLeLhLkLmLoLrLtLLLLLLLLMMMMM M MMMMM M-M0M2M4M6M9M;MWMMMMMMMMMMMMNNN N N N)N5NRER`RmRRRRRRRRSSSSSSS!S:SLSiSlSoSrSuSxSzSSSSTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUU UUUUUUUUU U"U$U&U(U*U,U.U1U4U7U:U=U@UCUFUIUKUNUPUSUVUYU\U_UbUeUhUkUnUqUtUwUzU}UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUV/V2V5V7V:VXWXbXXXXXXXXXXXXXXYY3YDYFYHYKYTYeYgYiYlYuYYYYYYYYYYYYYYYYYYYYYZZZZZ Z)Z2Z4[#[%['[*[,[/[1[4[6[8[:[<[?[A[C[E[G[I[K[N[P[R[T[V[X[Z[\[^[`[b[d[f[h[j[l[n[p[r[t[v[x[z[|[~[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[\\\\\ \ \ \\\\\\\\ \"\$\&\(\*\,\5\7]|]~]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]^^^^^ ^^^^^^^ ^"^%^'^*^-^0^3^6^9^<^?^B^E^H^K^N^Q^T^W^Z^]^`^c^f^i^l^o^q^s^u^w^y^{^}^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^____ _ _______"_+_-`r`u`x`{`~```````````````````````````````````````````aaaa aaaaaaa a#a&a)a,a/a2a5a8a;a>aAaDaGaJaMaPaSaVaYa\a_abaeahakanaqatawaza}aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbb b bbbbbbb"b%b(b+b.b1b4b7b:b=b@bCbFbIbLbObRbUbXb[b^babdbgbjbmbpbsbvbyb|bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcccc c ccccccc!c$c'c*c-c0c3c6c9cHCXkgya\p=8N#5.!173F73E-);,(8+'6(%3(%2'%/%#,| EDO.YYf*(3-+7%!1%!2#2#2#4"3% 661HVQf|ni|XThgcu[WiRN`EAR73D*'8%!0�'$/&$.~;:D-  '%08)'1r'$0-)6?:M,(:($5%!1%"/$!-GFRo<;F7  0$",y'$1'$351BSPa51E)$:("<83JLG^mi}ok~82I,'='"5&"4#.!**'4'%.x/ !(d)&3(%4&"4*&9[XjKG\1+C@:RTOepl}HC[,&>% 5%!4$ 2%!0)&40-9" )b#!*)'2'$2'#3%!3'"9NK`}zFAZWRigcxc^u@;R*$;'"8$3*&72/='$2&#.&)'1F)&3($4($5'"7+&=/+Ea\sfawig~}xUPg;6L(#;,(<:7I.*;!-$!.#!+@$-*6})&4($4%!3*%:*$<94NgbzxvnhNI`<7NC?S40C#1$ 1$!/�y !4,)6+(7'#6)$8(#:/)BJD]plkj|zqkc^ub^qB=R$4#2%!2%"13$I-*8*&6*&8*%:+%=93KQKcfayuu{vhdx50G&!8$3#1&"2'$3 J"!(P/,:+'7)%7)$9+%=@:RXRie`xus{VQg;6L'!8&!5% 4&"3)%5$T  '0-:V/+:,(9+';+&U+%=$5'"6&"5)%6*&5V$%#.o.*:+'9-(=*%<3-EKF]_Zqa\tb^wpoe`z^Yo^YoGBY0*C)#;'"8($6*&8!+k -*8l/+;-);,'<,'>4.FLG^^Xo_Zrd`}iflia\u^Xp\WnMG_2,F)#;)$;)$9*&9.*:i .+9W/+;+':-(>.)@4.GMH_^Xpd]xhchehgrqb_z_[u^Xp]WoMG`4.H*$=+&=,'<-)<0,>T 'L/+<-)-(?/+? *H" + 0,=.*=.)>.(@2,EHCZb[vhae``]y][x_`~~hi_]y^[v^Zu]Xr\VoIC]3-I,&@.(@.)@2-A$!/(%1/+;.*=/*?/)A/)CFAXd\zhaa\z\Yu\[x\\zdfhi^^}\Zw]Zw]Yt\WrZUnE?[.'D.(C/)A1,B2.B-)9vx73C/+=/*?/*A0*CC=Vd\|g`^YtYWs[Yv[Zx\]|hjfi``[[{ZYvZWtYVrZUpYSmB;X0)F/)D/*A3.D3/C*'6pszXWh_-);/*>1+C0*C>7T[Tsd]|YUoZWt[Yw[ZzZZz\^~lplp_a]^}[ZyXWuXVtYVsYToSMh:4R0)F0*F/)A4/F-):[VVb9:6H-)=1,C1+E:3PTLk^XuZUqYVsZXwZYx[[|[]|\_~sw}lrbg_a[\}[Zz\\{ba~pnspkf~QKe@:V93M/*B50G($45}SQa*%91,C3-E5.KMEe\UrZUqXUsYVuZXxZZzYZzY[{\`x}{~{y{x}swmiTNiID^F@Y:4L50F;<>`-)<1,B3-G5.ID<\XQnXSoXTqXVuXWwXXyYZ{Y[|Z\}[`}y}~{xw~~iia`}_\yYUrGA`=6S=7T83L60H+':Z /FBS3.C3-F5/I:3TPIhXRnWSqVTsYWxVVwXYzX[{X[{Z]~\bt|z~~zxxuxtw^aVVxUUvUTtVSrTQoKGf60Q6.N4-J4.H3.E/*>* bbv~=8L83K4.H81NF>^YSoVRoWTtUTuWVwVVxXZ{XZ|Y\}Z^~]c{pyxy}xwt~q|nxlwcgY\|VWxWWyUTuUTtURqVRoA<\5-M70M60K5/H4/Fy .95HUQfF@X81N<4UPHfUQnVSrWUuTTvTTvVXyVXyX\|Y]Y^[br|mws}u{~}|xut~q|kvq{bgZ]}UWxUWxTUvUTvUTuTQpNIh93U92R5.K71L4.G4/F'qxPOe;7MfbvTPi:3SF>_UPmTQpVStUTuTTvUVyTWxVY{X[}W\}Y^[clvfrmyzxyz}~{q{p{oyfr{ztzbgX\~TXxTVwTVwSTuTStUSsQOoB=^82T92Q92O60J5/G~x|+83H=8QfbxokE>^OHgSOnSQqTStSSvSUwUXzUXzW[}Y]W\~X_[dfrcpdrs}s|vw{x||w}r|mxjulvalalvck_d[_Y\VY{SUvSTvSSuSRtSQqJGh;6X93T:3Q82O82L)#IFZ94K<7Ra]uXRqSNmQOpSPrRRuRSuSUxSVySWyW[}W\~V[}X_\ecp]kiupyoxt}t}wu}y~|~zvs}pzvgrq{]i[f[f[f^hjqY`V\}X\Y]VY}SUvSTuRRuQPqPNn@<^;5W<4T;4Q:4O82J)imr=9O<6P@9VOIgQNqTQrRQtRRuRTvRTwVZ}TX{V[~V[~W^Ya[ecp`nyhsjtlupxoxs|v~~~vzy||}~}xxvr|q{nxjuwgr_jZeYdYcXb[dhqV]~X]RVxUY|W[VYRTwQRtOOqSQqFDg;7[>8Y<5T>8T<6P,(:fcu:4L>8R@9VB;\mhNMqPQuPQtQTwSVyTY{UY|TY|U\}U]Yc\hfseraleohqisqzpyr|~zwwxzzz}|}~}~}~~zwt~s}pznyhscogq^hZeZcYcYcWaXb\e\cTZ}TY}TY|SWyUY|WY~UV{PQtOOpLJl>:]@:[?8X?8U=7R>8P# .ooy&VRf<6PA;W@9XA:[LHjTVyQTwRUxRVzTY}SY{U[U]Yb^hbn\j^jakdnfpjsjtoxzs}qzs|wv~vyyzyyzy}|}{||z}ztq{ozmxkvgrgrlw]gZdYcZdWaW`W`W`[dymtV]TY|TY|SX{QUxRUxTV{STyQQtQPqA>a=9\A;\?7W@9V@:T%!0 zyaFAWA;V@:VA9ZA:]JFiYY|Z^PTxQVzQWzRX{S[}Ya]hmw`mal_j`jblenenjswqznwoxqzt}s|vxvvwzyzxyxwyys~q|kvkvhrgqhslwlx_iYcZdYbXbV`V`U^\dgpU]SY|RX{RX{SWzQUxPSvRTxSTyQQtGFi?<`@;]?8XA9XC=Y[;;C`]rRMcD>Z@9WB:[A;^MJlQQuWY{nsPVyQX{QY{U^[eoxlxam_j_iajblakgqs~kujslunwoxpyq{s|u~t~t}wu~vt~t~s~mxjugrgrdoepdo_ijvdoZd[eZdWaV`U_R[}Zc[d^fQX{QX{QWzQWzQUyQUxMPsOPtRSxONsBAhB?cE?`A:YC=Y83J #"+^CXF@\~@9[@;^DBgONrLMqOQvNQuUY}V]luq|lxdoal`jbkcldosfqblgqepgqgqgritlwozwr}q|q|q|tr~unyjvkvgrisdpitcm_h^h[dititZcZdXaWaXbV`YdV`jrqyS[PX|PX{PVzPVzPUyQVyPSvORuTWzOPzGFoDAeE@aF>]HA_'ZBXB;Yyte`|;8]DBgLLpLMrLOsNQwNSxPVzRY}`hiu`l^j`lblblhstitkunyr}x}pzpzq{mwpynxozp{nzzlxkwjvithtuxeoblbl^h]gbmnzZd[dZdXbWaR\~YdU`[dV_OW{NVyNUyNTxOUyPTyOSvQTxQSvMNvGGpFDiEAcF?_E>[F@Zz!*&C=VC=YG@^HBbOMpFEkLLqLNsNRvMQvMSwLRwOVzQY}QZ~blumxq|pzoxpylvnxnxmwnxozp{r~mylxmxlxkvgqdnclblakak]glwht[dXbYcXbT^ZdVaPZ}[dOX|PW}OVzOUyNTxMSwOSxPTxORuNPvGHqFEkFBeHBbG?]GA]",#D>VBC=WE>[F>^E?ahfNNsHJpLOtKPuLQvLRwNSxMTyNVzPZ}T_douoyoyoynxoynymwnxnwnxnxnxmxpznyozlwnzo{oziuhsisdndncmcmak_icmlx\fXbXbV`U_ZdWbOY|w]gQZ~MVzNVzMTxMTxOUyMRwNRwPSwNOwDFnFEkCAeHCdIBaHB^HB\?D>WXE?ZD=[F?_E@dDBg}}LNsKOuKPuLRvLRwLSyMTzLUyNX|S]]h|uq|p{pznxnyoyoxoynxpyoypzqzpzq{pzq{pzpypzpyp{p{q}s~nzp{isfpfpdnfodnblcm^hmyhsZdZdXbWa\g[fQ[~hqktR\OY}OX|MUyNUzMSwOUyMRwMQuORxCEnCCiDChFAcKDdIB`JD_TF@Z|G@]F?^E?bEAfCAfNOt}JNtJPuKQvLSyLSyLUyNW|NX{OZ}Ye|yiufrfqfqgrfpmxvlwlvmwoxoynxoxnxnwpzr{qzqzqzs}r{q{qzq{q{q{q{q{q{s|q}{unxjthrhrgqfpdndncm`jblp|]h[e[eXb^i]gR\~YcOY~OX|LVyNVzMVyMTxMSxKQuMQvPSzFGpABhDCiIFiIDeKCcKEas GA\G?]G@`HBdCAg@@hBCj^aotHLsKRxJQwLTyLUzNW|MX{Q[Wckws~itepeogpfoiroz{mwlvmwlvqzpzoys|q{r|qzt}t}t~r{t}t~t}r|t}t}t}s}s|wvt~ozlvkuktisgpgqcmcmal_ip|fq[e\fYc^i^jR\R]Q\OY}NX|MVzMUzMTyNUzLRvNRvQT|HKuBDiBBgDBeIEfLEdLFb KDaJBbIBdD@dCAhBAgABjKNtcgpuHOtKTyJTxKTyKUyLW{P[~Vb_lylxishqhrisjtisoz{oylvnwoxqzpys|pyt}t}uvvvvvu~wu~t}t~vvwvnxkukukuktfpgqgqdncmbkbnnz^h\fXc`k]iWaR\S]PZ~LW{LUzLVzLTzIPuMTxKQuOT{GKtEFnEDjHGlJFgMGgPIgIC^0IB`JCcICfFBfDBiAAiADlLOuLQv`fOW|KTzLV{LW{MX}P[Ua\imy|q|kvithrjtjsmwktq{{r}mvpyq|r}s|s}u~t}xt}vwwwwwxyvwxx}~r|mwmwkulvisjtgqgpgqcmeop|do]hYcbm_iXbS^s|`jP[~MX|MW{LVzMVzLTyJQwKQuSWIMvCFkEFmHFjIFiNIiOHfNHd,JD`PJCbLEfGCfFDhBBiCDkBEmKOtKQvKRw^e[dKUzLW|OZ~Q]VcYfcpsjvitjtislulvmwlvr}s~qzu~t}u~vvvvvwxxxyywyyzxx{xqznxlvmwmvjtisjtgqdndnlwkwak]gdn`kXbV`fphrS]OZ~LV{MW{MV{MV{MTzLSwRWKOyEInGHoJInLIlUPpTMlPIfKLEbpLEeKEgJFiGEjCCkCElAEkINtJPvLSxLTyW_jsKV|Q\R_WdYg\jvp|wgsjuhrjtlvmxpzmwuvr{u~u~u~vwxyyxy{zzzz{z{yz|yr|qzpznwmwlvjthrisgqfpfqp|cm_hepalZdYc_iyS^Q[OY}LW{KUyMVzLTyKRwTZKPzGJpGJpJJpJImRNoUOmRKhjMFdNGgKFiIFjGFlDElFHpDHpINtJQvIQvJSyLUzU_O[VcYf]kbobpft~hsmwmvmwoxpzpyqzvwu~xxyzx|zz}|z}}|}}~|~~{s}t}q{oypynxnxlvitisfpgqr~gq`jiteo^h\fXcWbQ\NY|MW|MW|LV{MV|JRvSZMS{IMtHLqKKqMKoOLnXSrTMjOGfOHjLFiKHmGGnEFoDHnFJrJPvHOuJRxKSyJTzLW{KW{s|co[idrcqgtnzmxlvmwoyoyqzs|wzvxx{}|||{~~~~|~}vs|s|pzmxoylvkujtkuiseomyo{ajitcn]g]gT_T_S]Q\OZ}MY|MW|MVzLUyT\LR{INsHKrMOtLLqOMpWSsUNlOHfOHiLHlKInIIqHJqHKsEKpFLrKRxJRyISxITxKV{NY}P\_jr~kxvlymynxmwpzt}t~t}y|xy|zy|}}{xvu~s|s}pzpzlvkvlvitislvvgpkvdo_i_iVaXcU`P\~P[~OZ~LW{KUzKTyS\MT|INsIMrMOtNNsQOr[WvVPnRJjQKnJHlJIoIIqHKrGKrGMsIOuJRwJSxJTyKU{KVzNY}R]UaYf}r~q}wq}r|t}s|vvvy~x|}~~{wxvxr|s}r{q{pymwlvjtiswlwozgqcm`jYd\gYdU_S^OZ}Q[LW{NX}V_MT{KQvKOuOQvNOtRQu[YzWQpTLlTNpNKpMLrKLsHLsINtGLtHOuIRxJTzHSxLW|NY}P[~R]U`[fq|tp|yywvvyxz||{{wvuvt}s}qzr|oynxkuuuo{isfqcm^h`kYcT_U`S^OZ~NY|PZT^MU{MSxMRxNQvPRvXX{^\}XSsUNnTOqNLpLLrKLsIMsJOuHOuIPvJRyISxHRxLWzMW|P[~Q\Wb^igqq~~{u~zy~}|zyzxwwt}s}pzpzoyoys~wkueofp^hfp[eWaWaT_R\NY|S^T_MU{LSxOUzMQvQSwbc^\}XTtUOoSOsOMrNOtMPvKNvLQwIPwHPvHRxJTzLX|KV{R]R]WaZd^igs}|{}~~~||zxwvvt~s}r|r}v|ozitgqcn~mw]hZdXbWbVaR\~UaS_NW{LTxOU|RV{Y[jjYY|ZVwWQqUQsRPtOOvOQwMQxLRxLSyIQwHRxISyMX}NY}P\U`Yc[e^igqo{|||}~~~}|{xyuvu~s|tyr|lvfqeozq{`j\f]fVaXbQ\~XcVaLUyNVzPV{TY|orkkUUxZWxXRsSPsPPuPQvORxMRxMRyKSxJSxHSxNX}KV{Q\R]XbYc[f_idokvxww~}|}{{wyvvw{upzkugqxwbm]g_i]gXcV`ZfT`MWzPY}PW|lq|^`VUy[XyZTtVSvTSySSzPSyNSyNUzMUzKTyITyLW|PZ~S^U`WbZd]g`kblhtp|ty}~zzxwy{xq{lvhsvyepbm`j[f[eYd_jWbLXzR\qwlpXZ~XX{[Y{ZUvWTwSSxSTySV|OTzOV{NW{LUzKV{MY}Q\T_WaXc]g_ibmbliuq}uw|~}zywyypznxmwujucoal`j\g\gcoS_Xcyt{\aX\XY|\Z|\WwXUxUU{TU{SV|RX}PW|OX|LV{MX{Q\S^W`Xc[f^hakcmepmw~p|v{{~~}{{z}}r{s}t~{wmxgrbn_kalanlvw\cX]Y][\\[}\Wx|YW{WW|UV|UY~QW|RX}PY}NX|NY~P[~XbWa]g\f_iblfpdnr|}uxw{~}}|{s|y{ukwdp]igsjv]fX_X^\`\^\[~s]Xz_[X{VV|WYTX|TZRY~QZ~PZOZ~Q\YbXc\g_i`jcnfplvu|txz|~~{|z~r}sku[fXbX`Y_[_^_]]Z]Y{A[Y|XX}Y\X\SY~T[QZ~P[~R\T_Yd[f_ialcnfqjukuw|uz||{fq`l[fWaXa\c\`]_]];^Z{"[Y|ZZXZ~Y]T[T]T]Q[U`Xc\f\f_ibmhrhrjtmw{}xz~}~gscn`k[fYcZb[b\aac99O,*9^\ZZZ\Z_W_V^S\S^Yd[e]g]hcmcnhritkur|}{}wwvgrepbl\gZdZc\c_dbd  _\~\\\]Z^W^W_T]V`Xc[f\fblcnephrjtoyoy~|~r}}shrfpbm\f\f[d]c^c_a  _\~a]\[^\aY_XaVaVaZe]gakakgqepisoyq{s}}s~kvlwr|w{u~mudkae_a`  ^\J]\]^]`X_YaV`YcZe`j`kdngqkupzmwu~s}yludmdjbf`cI KId5^]\^]a[bYbXcYd]hcldnfpgrkuoyr|s}vs}mwfpdnak^g_fbfJLh2 `^\]]a[b\dYcZd^idnfpgqjtmwpzs}t~wut}r|pzjteo_j_h`gbf" =AWg *)8Mcc`b]c]d[d]hbmeokujtnxr|u~yz{yvu~q{lvgqcn`jek*,;J*)8!a`]_^c^e]f\gblfpisoxpzr|vxy~|xxvs|oyktcnajci+-<77Lff_d]e^g]hcnhriroyqzr|v{{|yzxt~oxeoalho9=Q}87L>bbad`f]f_jcnjsnxpzt~uw||{{wu~q{is`kdk:=Q:98L__`cag_h`jeoisoyq{vw{~~}zuoyisakah9BMzÛԘ뢩ų̳NQZmA840+'#   $(+158<@#`ouʝ؜䠧쥭˻Ի-.2V B=84/+'$    $'+/48<@C TBEPϢ۟奭峺۶ϹVYazNEA<83/+'#    #(+/27<?CGOhcizУۢ䨰츾챸䯶۱дÎot !$_ LHC?;63/+'#    #&*.159>AFJL\$&,z[`nΧإ⮴鱸ﲹﱹ鯶⭴خαafs').p VNJFA=951-*&#   "%),048;?DGKOU e"$)}JNYʨԦݫ䯶ꭴﯶﱸꮵ䩱ݩԮʱϿKNY"#(t ^RPKGC>;740,)%"  !$'+.26:=@EHLPR[hz"$(ï̩իܮ⫲筵쯷ﱹﰸ참筴⫲ܩի̲ñκ!#'qbVSOLID@=962.+'$!  "&),037:=AEILPRV]grADOïʳѭتݨ᫳嫳谷뮶ﳺﲹ븾诶孴᪲ݪخѲʯì˺ADN{kaYVRPMHDA=:630,)&"   #&),047;>AEHLORUX\dlw!&AK!%qga[YUROKGDA>:740,)&#    #&)-0369=ACFJMPSVX[_ems |+-4KO[X]kdiyou¢ĨƲȱɯɮȮƭťÞ}oudixZ^lJNY+-4 wohb]ZYVSPMIFDA=9630-)&$!   #&),/369<?CEGKNQSUXZ\^chmqv{,/68;D>ALDGSNR^OS`QVcQUcMQ^MQ^DHS:=G-07xsojea^\ZXUSPNJHEB?<9630-)&#!  "%(+.147;=@CEGJMORTVXZ[\^`cehkkmnnonnlkigda_^][ZXVTQOLJHEB@=;751.+)%#    $&),/258:=?BEGIKMPRTVWYZ[\]]^^^^^^^^^]]\[ZYWVSQOMKIGDB?=:852/,*'$!  !#&),/1469;=?ADFHJLMOPRTUVWWWXXXXXWWWVTSRPNMLJHFDB?=;97420-*'$!   #&(*-01468:<>?ADEGHIJKLMNNOOOOONNMLKJJHGEDB@>=:86420-+)&#!  !#&(*,.024579:<=?@ABCDEEEFFFFFEEDBA@?><;986421/-+)&$"   "$&'*+,.012456799::;;<<<;;:::987654210.-+)'&#"    !"$%&')*+,--.///0000///..-,,+)('%%#"    !!"#$$%%%%%%%%$###!!          RS O[<  %P %.+8<9GJHUHER)&4#z %b63CB>R~{@3.COIe\Ys>7Q!/"2-CQKg\Zzac]YuE>Z$ 0A>PD=Z[YxXZ{|}a^z>8U>RTaMSMgMHiVWy^b||~]aQQsFAb/*BID[hb~kkJNsT]blt~vxxz}itMX{rzinQTyMLoA;\$D*PIeGEiy}tzXckupy{bn[fU`clryKRvQTwKHn0+?$ /hZUuXZ{CIp`i|nxfq_idn]hXbt}NVzOTxIJqD?^  61GFCjei`g=Ipdoq|nxmwoyr|vu~s}hqfpeoXcv~U_KRwHKrLHk'BCIS] d f aWMFA9-!  (/489:973-&      \RSdl2  s 0:8E{yﱰ}|$!-\ZVlB>P0HJEa?:S VRjRRvx}\[~)%9")S\Z|pvwzgq^gX^FCf .*?VYjs{z{nx]ggq\eLNwR75NJR{x{}lvp{_jT[*(l==VT^lvoy**b12Ercm|nx7&hpai?CX*.:Fah|SWcr  X\jQSXu  -eUXd{ćrxGJS Q'#/3-# lRS着꫿   RS @RScontextfree-3.0.5+dfsg1.orig/src-osx/English.lproj/CFDGDocument.nib/0000755000175000017500000000000012245646004023520 5ustar brambramcontextfree-3.0.5+dfsg1.orig/src-osx/English.lproj/CFDGDocument.nib/designable.nib0000644000175000017500000065555612076364074026343 0ustar brambram 1050 11D50 1938 1138.32 568.00 com.apple.InterfaceBuilder.CocoaPlugin 1938 YES NSScroller NSStepper NSMenu NSSliderCell NSButton NSCustomObject NSImageView NSImageCell NSSplitView NSSlider NSCustomView NSTextField NSNumberFormatter NSWindowTemplate NSTextFieldCell NSStepperCell NSButtonCell NSBox NSPopUpButtonCell NSView NSScrollView NSUserDefaultsController NSProgressIndicator NSPopUpButton NSMenuItem NSTextView YES com.apple.InterfaceBuilder.CocoaPlugin PluginDependencyRecalculationVersion YES CFDGDocument FirstResponder NSApplication 271 2 {{44, 91}, {1200, 800}} 1881670656 CFDG Document NSWindow View {500, 300} 256 YES 266 YES 274 {1200, 1} {{0, 759}, {1200, 1}} {0, 0} 67239424 0 Box LucidaGrande 11 3100 6 System textBackgroundColor 3 MQA 3 MCAwLjgwMDAwMDAxMTkAA 0 0 0 NO 274 YES 274 YES 274 YES 2304 YES 2322 YES YES Apple HTML pasteboard type Apple PDF pasteboard type Apple PICT pasteboard type Apple PNG pasteboard type Apple URL pasteboard type CorePasteboardFlavorType 0x6D6F6F76 NSColor pasteboard type NSFilenamesPboardType NSStringPboardType NeXT Encapsulated PostScript v1.2 pasteboard type NeXT RTFD pasteboard type NeXT Rich Text Format v1.0 pasteboard type NeXT TIFF v4.0 pasteboard type NeXT font pasteboard type NeXT ruler pasteboard type WebURLsWithTitlesPboardType public.url {398, 14} YES 6 398 1 67120995 0 YES YES NSBackgroundColor NSColor YES 6 System selectedTextBackgroundColor 3 MC42NjY2NjY2NjY3AA 6 System selectedTextColor 3 MAA YES YES NSColor NSUnderline YES 1 MCAwIDEAA 1 6 {813, 10000000} {0, 0} {{1, 1}, {398, 608}} {4, 5} 12582912 YES YES TU0AKgAAAHCAFUqgBVKsAAAAwdVQUqwaEQeIRGJRGFlYqwWLQ+JxuOQpVRmEx2RROKwOQyOUQSPyaUym SxqWyKXyeYxyZzWbSuJTScRCbz2Nz+gRKhUOfTqeUai0OSxiWTiBQSHSGFquGwekxyAgAAAOAQAAAwAA AAEAEAAAAQEAAwAAAAEAEAAAAQIAAwAAAAIACAAIAQMAAwAAAAEABQAAAQYAAwAAAAEAAQAAAREABAAA AAEAAAAIARIAAwAAAAEAAQAAARUAAwAAAAEAAgAAARYAAwAAAAEAEAAAARcABAAAAAEAAABnARwAAwAA AAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA 3 MCAwAA 4 256 {{399, 1}, {15, 608}} _doScroller: 1 -2147483392 {{-100, -100}, {87, 18}} 1 _doScroller: 1 0.94565218687057495 {415, 610} 133138 256 YES 2304 YES 2322 YES YES Apple HTML pasteboard type Apple PDF pasteboard type Apple PICT pasteboard type Apple PNG pasteboard type Apple URL pasteboard type CorePasteboardFlavorType 0x6D6F6F76 NSColor pasteboard type NSFilenamesPboardType NSStringPboardType NeXT Encapsulated PostScript v1.2 pasteboard type NeXT RTFD pasteboard type NeXT Rich Text Format v1.0 pasteboard type NeXT TIFF v4.0 pasteboard type NeXT font pasteboard type NeXT ruler pasteboard type WebURLsWithTitlesPboardType public.url {398, 116} YES 134 398 1 67121127 0 YES YES NSBackgroundColor NSColor YES YES YES NSColor NSCursor NSUnderline YES {8, -8} 13 1 6 {463, 10000000} {223, 116} {{1, 1}, {398, 139}} 4 256 {{399, 1}, {15, 139}} _doScroller: 1 0.85256409645080566 -2147483392 {{-100, -100}, {87, 18}} 1 _doScroller: 0.98743718862533569 0.94565218687057495 {{0, 619}, {415, 141}} 133138 {415, 760} CFDG status splitter 274 {{424, 0}, {776, 760}} GView NSView {{0, -2}, {1200, 760}} YES CFDG editor splitter 266 YES 270 {{5, 12}, {421, 14}} YES 67239424 4325376 Status Messages 6 System controlColor 6 System controlTextColor 267 {{815, 12}, {280, 14}} YES 67239424 71434240 image statistics -2147482359 {{1176, 10}, {16, 16}} 20746 100 261 YES 274 YES 256 {{0, 1}, {90.70703125, 19}} YES 67239424 134217728 Render LucidaGrande 12 16 -2038021889 36 Stop 200 25 256 {{90, 4}, {95.20947265625, 14}} YES 67239424 71434240 next variation: 256 {{190, 2}, {92, 19}} YES -1804468671 138544128 WWWWWW YES 1 6 System textColor 256 {{280, 0}, {15, 22}} YES -2079457760 131072 18277 18278 1 YES YES {{2, 2}, {306, 44}} {{455, 5}, {310, 48}} {0, 0} 67239424 0 Render Controls LucidaGrande 11 16 3 MCAwLjgwMDAwMDAxMTkAA 3 0 0 NO YES -2147482359 {{1098, 8}, {72, 20}} 16396 100 {{0, 758}, {1200, 42}} TopBar NSView {1200, 800} {{0, 0}, {1680, 1050}} {500, 322} {10000000000000, 10000000000000} CFDG window YES Menu YES Render 1048576 2147483647 NSImage NSMenuCheckmark NSImage NSMenuMixedState Render with dimensions… 1048576 2147483647 Stop Rendering 1048576 2147483647 YES YES 1048576 2147483647 Save Image… 1048576 2147483647 Save as SVG… 1048576 2147483647 Save as Animation… 1048576 2147483647 YES YES 1048576 2147483647 Upload to Gallery… 1048576 2147483647 VariationFormatter 3 2 {{175, 404}, {427, 371}} -260571136 Render Image NSPanel View {213, 107} 256 YES 256 {{117, 176}, {91, 22}} YES -1804468671 71304192 1000 LucidaGrande 13 1044 YES 256 {{213, 178}, {19, 17}} YES 67239424 138412032 × 256 {{237, 176}, {91, 22}} YES -1804468671 71304192 1000 YES 256 {{114, 206}, {97, 14}} YES 67239424 71434240 Width 256 {{234, 206}, {97, 14}} YES 67239424 71434240 Height 256 {{333, 178}, {62, 14}} YES 67239424 4325376 in pixels 256 {{99, 334}, {281, 17}} YES 67239424 4194304 Render image with dimensions LucidaGrande-Bold 13 2072 256 {{328, 12}, {85, 32}} YES 67239424 134217728 Render -2038284033 1 DQ 200 25 256 YES YES Apple PDF pasteboard type Apple PICT pasteboard type Apple PNG pasteboard type NSFilenamesPboardType NeXT Encapsulated PostScript v1.2 pasteboard type NeXT TIFF v4.0 pasteboard type {{20, 287}, {64, 64}} YES 130560 33554432 NSImage doc 0 0 0 NO YES 256 {{243, 12}, {85, 32}} YES 67239424 134217728 Cancel -2038284033 1 Gw 200 25 256 {{99, 228}, {311, 98}} YES 67239424 4194304 VGhlIGltYWdlIHdpbGwgYmUgcmVuZGVyZWQgdG8gZml0IHRoZSBkaW1lbnNpb25zIGVudGVyZWQgaGVy ZSwgdXNpbmcgdGhlIGN1cnJlbnQgdmFyaWF0aW9uLiAgV2hlbiBjb21wbGV0ZSwgdGhlIGltYWdlIHdp bGwgYmUgZGlzcGxheWVkIHNjYWxlZCB3aXRoaW4gdGhlIHdpbmRvdy4KClRvIHNwZWVkIHVwIHRoZSBw cm9jZXNzIG9mIGxhcmdlciByZW5kZXJzLCBubyB1cGRhdGVzIHdpbGwgb2NjdXIgaW4gdGhlIHdpbmRv dyB3aGlsZSByZW5kZXJpbmcuA 256 {{117, 140}, {91, 22}} YES -1804468671 71304192 1 YES 256 {{213, 142}, {167, 14}} YES 67239424 272629760 size of smallest element 256 {{115, 79}, {190, 25}} YES 67239424 0 Helvetica 12 16 2 -1 2 0.0 4 0 NO NO 256 {{99, 111}, {123, 17}} YES 67239424 71303168 Image border size: 256 {{101, 57}, {45, 14}} YES 67239424 138412032 negative LucidaGrande 9 3614 256 {{167, 60}, {30, 11}} YES 67239424 138412032 none 256 {{224, 60}, {30, 11}} YES 67239424 138412032 fixed 256 {{273, 60}, {43, 11}} YES 67239424 138412032 variable {427, 371} {{0, 0}, {1680, 1050}} {213, 129} {10000000000000, 10000000000000} YES YES 3 2 {{526, 169}, {305, 107}} 1886912512 Save Image Accessory NSPanel View {213, 107} 256 YES 268 {{18, 71}, {120, 18}} YES 67239424 0 Crop the image 1211912703 2 NSSwitch 200 25 {305, 107} {{0, 0}, {1680, 1050}} {213, 129} {10000000000000, 10000000000000} YES YES YES allowsFloats attributedStringForNil attributedStringForNotANumber attributedStringForZero decimalSeparator formatterBehavior groupingSeparator locale minimum negativeFormat positiveFormat usesGroupingSeparator YES NaN YES YES 0 . , 0 1 NO YES 1 IAAAAAAAAAAAAAAAAAAAAA -###0 ###0 ###0 -###0 0 0 YES NO 1 AAAAAAAAAAAAAAAAAAAAAA . , NO NO YES YES YES allowsFloats attributedStringForNil attributedStringForNotANumber attributedStringForZero decimalSeparator formatterBehavior groupingSeparator locale minimum negativeFormat positiveFormat usesGroupingSeparator YES NaN 0.0 . , -4 1 NO YES 1 AQAAAAAAAAAAAAAAAAAAAA -0.0 0.0 0.0 -0.0 . , NO NO YES 3 2 {{636, 421}, {530, 130}} 1886912512 Save Animation Accessory NSPanel View {213, 107} 256 YES 256 YES 274 YES 256 {{13, 57}, {122.834, 17}} YES 67239424 272629760 Length in seconds: 256 {{275, 6}, {52, 11}} YES 67239424 272891904 lowest 256 {{314, 6}, {52, 11}} YES 67239424 272891904 low 256 {{227, 29}, {52.629399999999997, 17}} YES 67239424 272629760 Quality: 256 {{227, 57}, {52.565899999999999, 17}} YES 67239424 272629760 Format: 256 {{12, 29}, {127.322, 17}} YES 67239424 272629760 Frames per second: 256 {{144, 55}, {78, 22}} YES -1804468671 71304192 10.0 YES 256 {{141, 23}, {84, 26}} YES -2076049856 2048 109199615 1 LucidaGrande 13 16 400 75 15 2147483647 1 _popUpItemAction: 1500 YES OtherViews YES 8 1048576 2147483647 _popUpItemAction: 800 10 1048576 2147483647 _popUpItemAction: 1000 12 2147483647 _popUpItemAction: 1200 12.5 2147483647 _popUpItemAction: 1250 23.98 2147483647 _popUpItemAction: 2398 24 2147483647 _popUpItemAction: 2400 25 2147483647 _popUpItemAction: 2500 29.97 2147483647 _popUpItemAction: 2997 30 2147483647 _popUpItemAction: 3000 50 2147483647 _popUpItemAction: 5000 59.94 2147483647 _popUpItemAction: 5994 60 2147483647 _popUpItemAction: 6000 4 3 YES YES 1 268 {{12, 1}, {127, 18}} YES 67239424 0 Zoom Animation 1211912703 2 200 25 268 {{281, 51}, {103, 26}} YES -2076049856 2048 109199615 129 400 75 Animation 1048576 2147483647 1 _popUpItemAction: YES OtherViews YES MPEG-4 1048576 2147483647 _popUpItemAction: 1 1 YES YES 2 268 {{282, 21}, {155, 26}} YES -2080244224 0 4 0.0 4 0.0 5 0 YES NO 256 {{340, 6}, {52, 11}} YES 67239424 272891904 normal 256 {{380, 6}, {52, 11}} YES 67239424 272891904 high 256 {{409, 6}, {52, 11}} YES 67239424 272891904 lossless {451, 90} {{20, 20}, {451, 90}} {0, 0} 67239424 0 Box 3 MCAwLjgwMDAwMDAxMTkAA 0 3 0 NO {530, 130} {{0, 0}, {1680, 1050}} {213, 129} {10000000000000, 10000000000000} YES YES YES allowsFloats attributedStringForZero decimalSeparator formatterBehavior groupingSeparator minimum negativeFormat positiveFormat usesGroupingSeparator YES 0.00 . , 0 1 NO YES 1 AQAAAAAAAAAAAAAAAAAAAA -0.## 0.## 0.## -0.## NaN . , NO YES YES 3 2 {{767, 252}, {305, 56}} 1886912512 Save Tile Accessory NSPanel View {213, 107} 256 YES 268 {{17, 39}, {116, 17}} YES 68288064 272630784 Output Multiplier: 268 {{17, 14}, {38, 17}} YES 68288064 272630784 Width 268 {{60, 11}, {75, 22}} YES -1804468671 272630784 YES YES allowsFloats formatterBehavior locale negativeInfinitySymbol nilSymbol numberStyle positiveInfinitySymbol YES -∞ +∞ #,##0.### #,##0.### NaN 3 YES YES YES . , YES NO YES YES 268 {{140, 14}, {45, 17}} YES 68288064 272630784 Height 268 {{190, 11}, {75, 22}} YES -1804468671 272630784 YES YES allowsFloats formatterBehavior locale negativeInfinitySymbol nilSymbol numberStyle positiveInfinitySymbol YES -∞ +∞ #,##0.### #,##0.### NaN 3 YES YES YES . , YES NO YES YES {305, 56} {{0, 0}, {1680, 1050}} {213, 129} {10000000000000, 10000000000000} YES YES window 8 mEditor 34 mGView 35 mStatus 62 mHiresSheet 100 cancelHiresRender: 102 uploadToGallery: 300 startHiresRender: 301 mStatusText 455 delegate 7 initialFirstResponder 78 delegate 39 fontName: values.EditorFontName fontName: values.EditorFontName fontName values.EditorFontName 2 395 fontSize: values.EditorFontSize fontSize: values.EditorFontSize fontSize values.EditorFontSize 2 397 mDocument 42 menu 53 mProgress 63 mRenderControl 64 mStatus 65 toggleRender: 66 mVariationLabel 70 mVariationField 71 mVariationStepper 72 editVariation: 73 adjustVariation: 74 mOutputProgress 112 startRender: 113 saveImage: 116 finishRender: 117 showHiresRenderSheet: 118 mTopBar 136 mSaveImageAccessory 144 saveAsSVG: 182 saveAsMovie: 189 mSaveAnimationAccessory 226 mSaveTileAccessory 499 mSaveTileWidth 510 mSaveTileHeight 511 nextKeyView 79 delegate 75 formatter 77 nextKeyView 80 value: values.HiresWidth value: values.HiresWidth value values.HiresWidth 2 121 formatter 146 value: values.HiresHeight value: values.HiresHeight value values.HiresHeight 2 125 formatter 147 mLeftStatus 127 mCenterControls 128 mRightStatus 129 mProgressOne 130 mProgressTwo 131 value: values.SaveCropped value: values.SaveCropped value values.SaveCropped 2 141 formatter 186 value: values.HiresMinimumSize value: values.HiresMinimumSize value values.HiresMinimumSize 2 187 value: values.MovieLength value: values.MovieLength value values.MovieLength 2 227 formatter 230 selectedTag: values.MovieFrameRate selectedTag: values.MovieFrameRate selectedTag values.MovieFrameRate 2 457 value: values.MovieZoom value: values.MovieZoom value values.MovieZoom 2 235 value: values.BorderSize value: values.BorderSize value values.BorderSize 2 242 delegate 456 selectedTag: values.MovieFormat selectedTag: values.MovieFormat selectedTag values.MovieFormat 2 484 value: values.MovieQuality value: values.MovieQuality value values.MovieQuality 2 486 YES 0 -2 File's Owner -1 First Responder -3 Application 5 YES Window 6 YES 135 YES 46 YES ViewMenu 45 47 48 49 105 177 188 298 299 76 VariationFormatter 86 YES HiRes Sheet 85 YES 87 YES 88 YES 89 YES 90 YES 91 YES 92 YES 93 YES 95 YES 96 YES 97 YES 108 YES 183 YES 184 YES 236 YES 237 YES 238 YES 239 YES 240 YES 241 YES 119 Shared Defaults 137 YES Save Image Accessory 138 YES 139 YES 145 DimensionFormatter 167 MinSizeFormatter 190 YES Save Animation Accessory 191 YES 218 YES 229 LengthFormatter 304 YES Save Tile Accessory 305 YES 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 220 YES 425 221 YES 426 222 YES 427 YES 223 YES 224 225 234 YES 429 452 YES 451 YES 14 YES 447 YES 450 449 448 13 431 432 19 YES 458 459 460 461 462 463 464 465 466 467 468 469 YES 470 471 YES 472 473 YES 474 YES 475 YES 476 477 479 YES 480 481 YES 482 487 YES 488 489 YES 490 491 YES 492 493 YES 494 495 YES 496 126 YES 57 YES 399 61 YES 400 111 60 81 YES 69 YES 404 58 YES 401 68 YES 403 67 YES 402 497 YES 498 500 YES 501 502 YES 503 YES 504 505 YES 506 507 YES 508 YES 509 YES YES -1.IBPluginDependency -2.IBPluginDependency -3.IBPluginDependency 105.IBPluginDependency 108.IBPluginDependency 111.IBPluginDependency 119.IBPluginDependency 126.IBPluginDependency 126.IBViewIntegration.shadowBlurRadius 126.IBViewIntegration.shadowColor 126.IBViewIntegration.shadowOffsetHeight 126.IBViewIntegration.shadowOffsetWidth 13.CustomClassName 13.IBPluginDependency 135.IBPluginDependency 137.IBPluginDependency 138.IBPluginDependency 139.IBPluginDependency 14.IBPluginDependency 145.IBPluginDependency 167.IBPluginDependency 177.IBPluginDependency 183.IBPluginDependency 184.IBPluginDependency 188.IBPluginDependency 19.IBPluginDependency 190.IBPluginDependency 190.IBWindowTemplateEditedContentRect 191.IBPluginDependency 218.IBPluginDependency 220.IBPluginDependency 221.IBPluginDependency 222.IBPluginDependency 223.IBPluginDependency 224.IBPluginDependency 225.IBPluginDependency 229.IBPluginDependency 234.IBPluginDependency 236.IBPluginDependency 237.IBPluginDependency 238.IBPluginDependency 239.IBPluginDependency 240.IBPluginDependency 241.IBPluginDependency 298.IBPluginDependency 299.IBPluginDependency 304.IBPluginDependency 305.IBPluginDependency 399.IBPluginDependency 400.IBPluginDependency 401.IBPluginDependency 402.IBPluginDependency 403.IBPluginDependency 404.IBPluginDependency 405.IBPluginDependency 406.IBPluginDependency 407.IBPluginDependency 408.IBPluginDependency 409.IBPluginDependency 410.IBPluginDependency 411.IBPluginDependency 412.IBPluginDependency 413.IBPluginDependency 414.IBPluginDependency 415.IBPluginDependency 416.IBPluginDependency 417.IBPluginDependency 418.IBPluginDependency 419.IBPluginDependency 420.IBPluginDependency 421.IBPluginDependency 422.IBPluginDependency 423.IBPluginDependency 424.IBPluginDependency 425.IBPluginDependency 426.IBPluginDependency 427.IBPluginDependency 429.IBPluginDependency 431.IBPluginDependency 431.IBShouldRemoveOnLegacySave 432.IBPluginDependency 432.IBShouldRemoveOnLegacySave 447.IBPluginDependency 448.IBPluginDependency 449.IBPluginDependency 45.IBPluginDependency 450.IBPluginDependency 451.CustomClassName 451.IBPluginDependency 452.CustomClassName 452.IBPluginDependency 458.IBPluginDependency 459.IBPluginDependency 46.IBPluginDependency 460.IBPluginDependency 461.IBPluginDependency 462.IBPluginDependency 463.IBPluginDependency 464.IBPluginDependency 465.IBPluginDependency 466.IBPluginDependency 467.IBPluginDependency 468.IBPluginDependency 469.IBPluginDependency 47.IBPluginDependency 470.IBPluginDependency 471.IBPluginDependency 472.IBPluginDependency 473.IBPluginDependency 474.IBPluginDependency 475.IBPluginDependency 476.IBPluginDependency 477.IBPluginDependency 479.IBPluginDependency 48.IBPluginDependency 480.IBPluginDependency 481.IBPluginDependency 482.IBPluginDependency 487.IBPluginDependency 488.IBPluginDependency 489.IBPluginDependency 49.IBPluginDependency 490.IBPluginDependency 491.IBPluginDependency 492.IBPluginDependency 493.IBPluginDependency 494.IBPluginDependency 495.IBPluginDependency 496.IBPluginDependency 497.IBPluginDependency 498.IBPluginDependency 5.IBPluginDependency 5.IBWindowTemplateEditedContentRect 500.IBPluginDependency 501.IBPluginDependency 502.IBPluginDependency 503.IBPluginDependency 504.IBNumberFormatterBehaviorMetadataKey 504.IBNumberFormatterLocalizesFormatMetadataKey 504.IBPluginDependency 505.IBPluginDependency 506.IBPluginDependency 507.IBPluginDependency 508.IBPluginDependency 509.IBNumberFormatterBehaviorMetadataKey 509.IBNumberFormatterLocalizesFormatMetadataKey 509.IBPluginDependency 57.IBAttributePlaceholdersKey 57.IBPluginDependency 58.IBPluginDependency 6.IBPluginDependency 60.IBPluginDependency 61.IBPluginDependency 67.IBPluginDependency 68.IBAttributePlaceholdersKey 68.IBPluginDependency 69.IBPluginDependency 76.IBPluginDependency 81.IBPluginDependency 85.IBPluginDependency 86.IBPluginDependency 87.IBPluginDependency 88.IBPluginDependency 89.IBPluginDependency 90.IBPluginDependency 91.IBPluginDependency 92.IBPluginDependency 93.IBPluginDependency 95.IBPluginDependency 96.IBPluginDependency 97.IBPluginDependency YES com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin GrammarTextView com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{65, 865}, {530, 130}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin KFSplitView com.apple.InterfaceBuilder.CocoaPlugin KFSplitView com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{98, 76}, {1200, 800}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Status Messages com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip VGhlIHZhcmlhdGlvbiBjb2RlIGRldGVybWluZXMgdGhlIHJhbmRvbSBjaG9pY2VzIHVzZWQgdG8gZ2Vu ZXJhdGUgdGhlIGltYWdlLiAgVXNpbmcgdGhlIHNhbWUgdmFyaWF0aW9uIGNvZGUgd2lsbCBhbGxvdyB5 b3UgdG8gcmVwcm9kdWNlIHRoZSBzYW1lIGltYWdlIGFzIGJlZm9yZS4KClRoZSB2YXJpYXRpb24gY29k ZSBhdXRvbWF0aWNhbGx5IGluY3JlbWVudHMgZWFjaCB0aW1lIHlvdSByZW5kZXIgYW4gaW1hZ2UuICAK ClRoZSB2YXJpYXRpb24gY29kZSBpcyBhIG9uZSB0byBzaXggbGV0dGVyIHNlcXVlbmNlLg com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin YES YES 514 YES CFDGDocument NSDocument YES YES cancelHiresRender: closeAll: enterFullscreen: finishRender: insertUnicode: repeatRender: saveAsMovie: saveAsSVG: saveImage: showHiresRenderSheet: startHiresRender: startRender: stopRender: uploadToGallery: YES id id id id id id id id id id id id id id YES YES cancelHiresRender: closeAll: enterFullscreen: finishRender: insertUnicode: repeatRender: saveAsMovie: saveAsSVG: saveImage: showHiresRenderSheet: startHiresRender: startRender: stopRender: uploadToGallery: YES cancelHiresRender: id closeAll: id enterFullscreen: id finishRender: id insertUnicode: id repeatRender: id saveAsMovie: id saveAsSVG: id saveImage: id showHiresRenderSheet: id startHiresRender: id startRender: id stopRender: id uploadToGallery: id YES YES mEditor mGView mHiresSheet mStatus mStatusText YES NSTextView GView NSPanel NSTextField NSTextView YES YES mEditor mGView mHiresSheet mStatus mStatusText YES mEditor NSTextView mGView GView mHiresSheet NSPanel mStatus NSTextField mStatusText NSTextView IBProjectSource ./Classes/CFDGDocument.h FirstResponder YES YES : saveImage: startRender: stopRender: YES id id id id YES YES : saveImage: startRender: stopRender: YES : id saveImage: id startRender: id stopRender: id IBUserSource GView NSView YES YES adjustVariation: editVariation: enterFullscreen: finishRender: repeatRender: saveAsMovie: saveAsSVG: saveImage: saveTileImage: showHiresRenderSheet: startRender: stopRender: toggleRender: YES id id id id id id id id id id id id id YES YES adjustVariation: editVariation: enterFullscreen: finishRender: repeatRender: saveAsMovie: saveAsSVG: saveImage: saveTileImage: showHiresRenderSheet: startRender: stopRender: toggleRender: YES adjustVariation: id editVariation: id enterFullscreen: id finishRender: id repeatRender: id saveAsMovie: id saveAsSVG: id saveImage: id saveTileImage: id showHiresRenderSheet: id startRender: id stopRender: id toggleRender: id YES YES mDocument mOutputProgress mProgress mRenderControl mSaveAnimationAccessory mSaveImageAccessory mSaveTileAccessory mSaveTileHeight mSaveTileWidth mStatus mTopBar mVariationField mVariationLabel mVariationStepper YES CFDGDocument NSProgressIndicator NSProgressIndicator NSButton NSView NSView NSView NSTextField NSTextField NSTextField TopBar NSTextField NSTextField NSStepper YES YES mDocument mOutputProgress mProgress mRenderControl mSaveAnimationAccessory mSaveImageAccessory mSaveTileAccessory mSaveTileHeight mSaveTileWidth mStatus mTopBar mVariationField mVariationLabel mVariationStepper YES mDocument CFDGDocument mOutputProgress NSProgressIndicator mProgress NSProgressIndicator mRenderControl NSButton mSaveAnimationAccessory NSView mSaveImageAccessory NSView mSaveTileAccessory NSView mSaveTileHeight NSTextField mSaveTileWidth NSTextField mStatus NSTextField mTopBar TopBar mVariationField NSTextField mVariationLabel NSTextField mVariationStepper NSStepper IBProjectSource ./Classes/GView.h GrammarTextView NSTextView IBProjectSource ./Classes/GrammarTextView.h KFSplitView NSSplitView IBProjectSource ./Classes/KFSplitView.h NSDocument YES YES printDocument: revertDocumentToSaved: runPageLayout: saveDocument: saveDocumentAs: saveDocumentTo: YES id id id id id id YES YES printDocument: revertDocumentToSaved: runPageLayout: saveDocument: saveDocumentAs: saveDocumentTo: YES printDocument: id revertDocumentToSaved: id runPageLayout: id saveDocument: id saveDocumentAs: id saveDocumentTo: id IBProjectSource ./Classes/NSDocument.h TopBar NSView YES YES mCenterControls mLeftStatus mProgressOne mProgressTwo mRightStatus YES NSView NSView NSView NSView NSView YES YES mCenterControls mLeftStatus mProgressOne mProgressTwo mRightStatus YES mCenterControls NSView mLeftStatus NSView mProgressOne NSView mProgressTwo NSView mRightStatus NSView IBProjectSource ./Classes/TopBar.h VariationFormatter NSFormatter IBProjectSource ./Classes/VariationFormatter.h 0 IBCocoaFramework com.apple.InterfaceBuilder.CocoaPlugin.macosx com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 YES 3 YES YES NSMenuCheckmark NSMenuMixedState doc YES {11, 11} {10, 3} {128, 128} contextfree-3.0.5+dfsg1.orig/src-osx/English.lproj/CFDGDocument.nib/keyedobjects.nib0000644000175000017500000012342712076364074026704 0ustar brambrambplist00X$versionX$objectsY$archiverT$top#$*.2u} 069B7CLMNQVWZ]ef(jnopstx} &'0167<=DEMTU]^cjkrsz{ ()019:ABWZ_`fjqrz{ #78DIOSVZdlvw}~  -#'(-/2589DEHTUVY_cdepqrstuv~"(,-.459<>?@ABCDEFGLMRSX]^cdijopu  %&/09@ABJKLeil~)*+567:@CLMWX\]`amv|}~     ' ( ) 2 9 : ; D M o              " ' ( - . 3 4 9 : ? D E Q X _ ` g h s z {        # $ ) * / 0 5 6 ; M i m n q r s w }          % & 0 4 9 : ; < A H I J K R S T [ \ ] d e f m n o v w x  D G H V W X [ \ ` a b c d q r s v y z ~  3      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~U$null _NSVisibleWindows]NSObjectsKeysVNSRoot\NSOidsValuesV$classZNSOidsKeys]NSConnections_NSObjectsValues_NSAccessibilityConnectors_NSAccessibilityOidsKeys_NSAccessibilityOidsValues߁ !"[NSClassName\CFDGDocument%&'(Z$classnameX$classes^NSCustomObject')XNSObject +,-ZNS.objects%&/0\NSMutableSet/1)UNSSet +34)@56789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstDMπ׀[]_`bdfh.023579;OQRVWrsuwy{}āǁʁ́ЁӁցف vwxyz{WNSLabel]NSDestinationXNSSourceCB ~ YNSMaxSize_NSTextContainer\NSSharedData]NSNextKeyViewYNSTVFlags[NSSuperviewXNSvFlags_NSNextResponderZNSDelegate[NSFrameSize_NSOriginalClassName[NSDragTypesXNSWindowXNSMinize?",!A    @_GrammarTextViewZNSTextView {{YNSBGColorYNSDocViewYNScvFlagsWNSFrameXNSCursorZNSSubviews-      +,Ā_NSColor pasteboard type_NeXT font pasteboard type_NeXT ruler pasteboard type_NSFilenamesPboardType_#CorePasteboardFlavorType 0x6D6F6F76_NeXT TIFF v4.0 pasteboard type_Apple HTML pasteboard type_*NeXT Rich Text Format v1.0 pasteboard type_WebURLsWithTitlesPboardType_Apple URL pasteboard type_Apple PNG pasteboard type_NSStringPboardType_Apple PDF pasteboard type_1NeXT Encapsulated PostScript v1.2 pasteboard type_NeXT RTFD pasteboard typeZpublic.url_Apple PICT pasteboard typeY{398, 14} XNSActionXNSTargetZNSCurValue #? {_NSLayoutManagerYNSTCFlagsZNSTextViewWNSWidth#+ #@x ]NSTextStorageYNSLMFlags_NSTextContainers$*( XNSString'% YNS.string&P%&_NSMutableString)XNSString%&]NSTextStorage )]NSTextStorage_NSMutableAttributedString_NSAttributedString +3 )"%&^NSMutableArray)WNSArray%&_NSLayoutManager)_NSLayoutManager%&_NSTextContainer)_NSTextContainer  !"#$%'()*-._NSLinkAttributes_NSDefaultParagraphStyle_NSInsertionColor_NSPreferredTextFinderStyleWNSFlags\NSTextFinder_NSBackgroundColor_NSTextCheckingTypes_NSSelectedAttributes_NSMarkedAttributes:8>/c-/ 12345\NSColorSpaceWNSWhite.B1%&78WNSColor7) :+;<?WNS.keys9=>01@A26_NSBackgroundColorD E1FG3IJK]NSCatalogName[NSColorNameWNSColor3.45VSystem_selectedTextBackgroundColor 1234P.M0.6666666667D E1FG3TJ'3.78_selectedTextColor 1234Y.B0%&[\\NSDictionary[) :+;_b9>a1;cd<=[NSUnderline 1g3(iUNSRGB.F0 0 1%&kl_NSTextViewSharedDatam)_NSTextViewSharedData_{813, 10000000}V{0, 0}%&qr^NSClassSwapperq)WmEditor%&uv_NSNibOutletConnectoruw)^NSNibConnector vwxyz{CLE~ [NSExtensionJHGKFIF  ^NSAutosaveName\NSIsVertical) (A _{{424, 0}, {776, 760}}UGViewVNSView%&\NSCustomView)[NSResponderVmGView vwxyC΀N~ 4\NSWindowRect]NSWindowTitle_NSUserInterfaceItemIdentifier\NSWindowViewYNSMinSize_NSWindowIsRestorable\NSScreenRect_NSWindowContentMinSize_NSWindowBackingYNSWTFlags]NSWindowClass[NSViewClass_NSWindowStyleMaskOP̀T ʀ̀SxQR_{{175, 404}, {427, 371}}\Render ImageWNSPanel Ā&TViewZ{213, 107} ˀɀUUȀV +3΀)Wdlotx| YNSEnabledVNSCell XYTcT_{{117, 176}, {91, 22}} ![NSCellFlags\NSCellFlags2ZNSContents]NSControlView[NSTextColorYNSSupport_NSDrawsBackgroundqA@ZWb`[ ^T1000 VNSNameVNSSizeXNSfFlags]\#@*\LucidaGrande%& VNSFont)D E1FG3 J3._-_textBackgroundColorD E1FG3J'3.a8YtextColor%&_NSTextFieldCell)\NSActionCellVNSCell%&[NSTextField)YNSControl !" efTcT_{{213, 178}, {19, 17}} !()*-/@gdbj[haD E1FG34JK3.i5\controlColorD E1FG3:J'3.k8_controlTextColor ?@ mnTcT_{{237, 176}, {91, 22}} !Zlb`[ ^ OP pqTcT_{{114, 206}, {97, 14}} !(VW-[/BrobjshUWidth ab]\#@&  ef uvTcT_{{234, 206}, {97, 14}} !(Vl-[/wtbjshVHeight uv yzTcT_{{333, 178}, {62, 14}} !(|}-[/B{xbjshYin pixels  }~TcT_{{99, 334}, {281, 17}} !(-/@|bjh_Render image with dimensions ]#@*_LucidaGrande-Bold  TT_{{328, 12}, {85, 32}} (_NSPeriodicInterval]NSButtonFlags_NSAlternateContents_NSKeyEquivalent_NSAlternateImage_NSPeriodicDelay^NSButtonFlags2@[[VRenderPQ %&\NSButtonCell)\NSActionCellVNSCell%&XNSButton) ZNSEditable TT +,̀Ӏ_Apple PNG pasteboard type_Apple PDF pasteboard type_NSFilenamesPboardType_Apple PICT pasteboard type_1NeXT Encapsulated PostScript v1.2 pasteboard type_NeXT TIFF v4.0 pasteboard type_{{20, 287}, {64, 64}} ---WNSAlignWNSScaleWNSStyleZNSAnimates  ^NSResourceNameWNSImageSdoc%&_NSCustomResource)%&[NSImageCell)VNSCell%&[NSImageView)  TT_{{243, 12}, {85, 32}} (뀆[[VCancelQ    TcT_{{99, 228}, {311, 98}} !(-[/bjsh_The image will be rendered to fit the dimensions entered here, using the current variation. When complete, the image will be displayed scaled within the window. To speed up the process of larger renders, no updates will occur in the window while rendering.  TcT_{{117, 140}, {91, 22}} !!b`[ ^Q1 +, TcT_{{213, 142}, {167, 14}} !(23-[/@bjsh_size of smallest element <=? TT_{{115, 79}, {190, 25}}CDEFGHI J(KLNOPQR-UVZNSMaxValueZNSMinValue]NSAltIncValue_NSNumberOfTickMarks_NSTickMarkPosition_NSAllowsTickMarkValuesOnlyZNSVerticalWNSValue#@###@ Y&P \]^]#@(YHelvetica%&ab\NSSliderCellcde)\NSSliderCell\NSActionCellVNSCell%&ghXNSSlideri)XNSSlider lm TcT_{{99, 111}, {123, 17}} !(st-/@bj[h_Image border size: }~ TcT_{{101, 57}, {45, 14}} !()-/bjhXnegative ]\#@"  TcT_{{167, 60}, {30, 11}} !()-/bjhTnone  €TcT_{{224, 60}, {30, 11}} !()-/ÀbjhUfixed  ŀƀTcT_{{273, 60}, {43, 11}} !()-/ǀĀbjhXvariableZ{427, 371}%&£)_{{0, 0}, {1680, 1050}}Z{213, 129}_ {10000000000000, 10000000000000}%&_NSWindowTemplate)[mHiresSheet vwxyCրЀ  ӀҀԀcр ~ JЁSK T *_{{5, 12}, {421, 14}} -4-YNSBoxType]NSTransparent]NSContentView\NSBorderType_NSTitlePosition_NSFullyTransparent[NSTitleCellYNSOffsets6L6р 5M@ !(|-[/_NSPlaceholderStringЀbjsh_Status MessagesWmStatus vwxy C؀~   ݀܀ــۀ ڀ   "-؀؁!   +,%ĀZ{398, 116}9 {<>CYNSPercentE"#?H4 #? E Hހ+#@x JKN* Q' U&P +3X)   !"#$['()_-b8>/- :+;fi9=>01@A26 :+;nr9>pa1;ctd<=XNSCursorxy z{|\NSCursorTypeYNSHotSpot W{8, -8}%&XNSCursor)XNSCursor_{463, 10000000}Z{223, 116}%&ZNSTextView)ZNSTextViewVNSText[mStatusText vwxyCZ~ _NSFrameAutosaveNameXWY V̀p(_{{44, 91}, {1200, 800}}]CFDG DocumentXNSWindow &TViewZ{500, 300} рɀU +3)ԀF --- @ +3À) Fɀ Y{1200, 1}_{{0, 759}, {1200, 1}} !(K[bs^SBox 1234׀.O0 0.8000000119%&UNSBox)[KFSplitView[NSSplitView +3߀){E 'AFF& [NSSplitView +3)܁ XNSsFlags[NSVScroller[NSHScroller !  +3) ! +3 ){ _{{1, 1}, {398, 608}}y |WNSImage  V{4, 5} FVNSReps\NSImageFlags  +3) + !" $%&_NSTIFFRepresentationOMM*pJRPRDbQYXCq)UdQ8C#A#iLKȥyrg5JSIBo=*}:Q9,bY8A!Z g=RS%&)*_NSBitmapImageRep+,)_NSBitmapImageRepZNSImageRep%&.) 12341.D0 0%&34WNSImage3)%&67ZNSClipView6)_{{399, 1}, {15, 608}} :;B:#%ف܁ #\_doScroller:%&FGZNSScrollerF)9 KMOS #?B` #?_{{-100, -100}, {87, 18}}Z{415, 610}%&WX\NSScrollViewW) +3[):ـ܁# +3a) _{{1, 1}, {398, 139}}_{{399, 1}, {15, 139}}9 hjOoف$#?B` #?_{{-100, -100}, {87, 18}}_{{0, 619}, {415, 141}}Z{415, 760}_CFDG status splitter_{{0, -2}, {1200, 760}}_CFDG editor splitter +3x)z{}Ё+0Ӂ- } -,. cр _{{815, 12}, {280, 14}}C {\NSDrawMatrixYNSpiFlags0R#@Y 4сQ @  !(Vz-[/+bjsh/_image statisticsC 3#@Yс4с1 Q 2%&ZNSPSMatrix)ZNSPSMatrix_{{1176, 10}, {16, 16}}%&_NSProgressIndicator)_NSProgressIndicator +3)6 8KɀӀӀ 7 +3€)Ɓ8:@D  :9;66 _{{0, 1}, {90.70703125, 19}}  @?A6c6  (@=><8<$ ^]\#@(TStop &P_{{90, 4}, {95.20947265625, 14}}  DCE6c6  !(V-[/B:bjsh_next variation:_{{190, 2}, {92, 19}} z +GH6J6   !  [_NSTextBezelStyleBF@b`s ^VWWWWWW_{{280, 0}, {15, 22}}C J[!\NSAutorepeat[NSIncrement\NSValueWraps #? D#@ـIs#@@%&#$]NSStepperCell%&')]NSStepperCell\NSActionCellVNSCell%&)*YNSStepper+)YNSStepper_{{2, 2}, {306, 44}}_{{455, 5}, {310, 48}} !(K/12NbPO^_Render Controls 8^]\#@& 1234;.O0 0.8000000119 2_{{1098, 8}, {72, 20}}_{{0, 758}, {1200, 42}}VTopBar[{1200, 800}_{{0, 0}, {1680, 1050}}Z{500, 322}_ {10000000000000, 10000000000000}[CFDG windowVwindow vwxyIC\Xdelegate vwxyOC^8_initialFirstResponder vwxyI{C\ vwxyZ{CaEYmDocument vwxy`}{Cc-E_mOutputProgress vwxyf{{Ce0EYmProgress vwxyl{Cg8E^mRenderControl vwxyrs{CiE 4wxw{-{-~lljj k@ siɁ  +3)wl ssnɁii m +3)nsu|pā~yف ww poqlcl _{{13, 57}, {122.834, 17}} ww lcl  !(2-/rnbj[h_Length in seconds: ww utvlcl _{{275, 6}, {52, 11}} ww yxzlcl  !(-/DwsbjhVlowest_{{314, 6}, {52, 11}} ww ف؁ځlcl  !(-/{ubjhSlow ww ~}lcl _%{{227, 29}, {52.629399999999997, 17}} w?w āցׁl l  !(2-/|bj[hXQuality: ww lcl _%{{227, 57}, {52.565899999999999, 17}} ww ˁ́lÁl  !(2-/bj[hWFormat: )*ww lcl _{{12, 29}, {127.322, 17}} 34ww |lÁl  !(2:-/bj[h_Frames per second:_{{144, 55}, {78, 22}} !Cpb`[ ^T10.0_{{141, 23}, {84, 26}}MNO PQRST4VRWXYZ[_`bd(_NSPreferredEdgeVNSMenu_NSSelectedIndex]NSAltersState_NSUsesItemFromMenu_NSMenuItemRespectAlignmentZNSMenuItem_NSArrowPosition@A@K [ h^]\#@* k&PmnNo pqrstu(Vw4y{|}UNSTagWNSStateYNSOnImageZNSKeyEquiv]NSMnemonicLoc\NSMixedImageWNSTitle܁ s[NSMenuItemsR15  逗_NSMenuCheckmark  逗_NSMenuMixedState__popUpItemAction:%&ZNSMenuItem) &ZOtherViews +3)dmNo pqrsVw4y{|_NSKeyEquivModMask Q8__popUpItemAction:mNo pqrsVw4y{|R10__popUpItemAction:mNo pqrsVw4y{|ȁR12__popUpItemAction:mNo pqrsVw4y{|ԁT12.5__popUpItemAction:mNo pqrsVw4y{| ^U23.98__popUpItemAction:mNo pqrsVw4y{| `R24__popUpItemAction:mNo pqrsVw4y{| āR25__popUpItemAction:mNo pqrsVw4y{| U29.97__popUpItemAction:mNo pqrs Vw4y{| R30__popUpItemAction:mNo pqrsVw4y{|R50__popUpItemAction:mNo pqrs !Vw4y{|(jU59.94__popUpItemAction:mNo pqrs,-Vw4y{|4pR60__popUpItemAction:%&89VNSMenu8)%&;<_NSPopUpButtonCell;=>?)^NSMenuItemCell\NSActionCellVNSCell%&AB]NSPopUpButtonA) FGww sŁƁll _{{12, 1}, {127, 18}} (NKQRVH ? c   E!  K[NSFormatterb`[ ^ N O P Q R S T U V W X Y Z [ \ ]  _ ` a ` f g g i j m n\NS.localizedVNS.nil_NS.negativeformat[NS.rounding_NS.negativeattrs_NS.positiveformatWNS.zero_NS.positiveattrsVNS.nanVNS.maxVNS.minZNS.decimal[NS.thousand_NS.hasthousands_NS.allowsfloats]NS.attributes   :+ p q x r s t u v w yd { | } ~ =    _positiveInfinitySymbol[numberStyle\allowsFloatsYnilSymbol_formatterBehavior_negativeInfinitySymbolb+" Pb-"%& _NSMutableDictionary [)Y#,##0.### | %& _NSAttributedString )_NSAttributedString \NSAttributesSNaN :+; 9 KK[NS.mantissaYNS.lengthZNS.compact[NS.exponent[NS.negative^NS.mantissa.boO %& _NSDecimalNumberPlaceholder )_NSDecimalNumberPlaceholder  4_NS.raise.dividebyzero_NS.raise.underflow_NS.raise.overflow_NS.roundingmode  %& _NSDecimalNumberHandler )_NSDecimalNumberHandlerQ.Q,%& _NSNumberFormatter )_NSNumberFormatter[NSFormatter_{{140, 14}, {45, 17}}   ! "c  !  -/bj[hVHeight_{{190, 11}, {75, 22}}  E!  b`[ #^ N O P Q R S T U V W X Y Z [ \ ]  g g i j n ('+') $ :+ p  r s t u v w d { | } %=   &b+"b-"Y#,##0.### | *SNaN  4  Y{305, 56}_mSaveTileAccessory vwxy  {C/E_mSaveTileHeight vwxy  {C1E^mSaveTileWidth vwxyz{Cց+E vwxy ${C4рEWmTopBar vwxy *{C6@E_mVariationField vwxy 0{C8:E_mVariationLabel vwxy 6{C:DE_mVariationStepper vwxy < ={CN=TMenu +3 G) H I J K L M N O P?@BDEGIKLNo pqrs =wy{|<No pqrs =wy{| ^<AoRender with dimensions &No pqrs =wy{| f<C^Stop RenderingrNo p i jqs| =wy{]NSIsSeparator\NSIsDisabled< No pqrs =wy{| y<FkSave Image &No pqrs =wy{| <HlSave as SVG &No pqrs =wy{| <JoSave as Animation &rNo p i jqs| =wy{< No pqrs =wy{| <MoUpload to Gallery &Tmenu vwxy CP@8[nextKeyView vwxyI{ŀC\E@ vwxy ŀCUS@ ! T_VariationFormatterYformatter vwxy ŀCPD@ vwxy πCUXW N O P Q R S T U V W X Y Z [ \ ]  g i j nhjikfo Y :+ p ݁ ܁Z[\]^_`abcde j { i fhijkm opq_attributedStringForNotANumber_attributedStringForNil^positiveFormat^negativeFormat_attributedStringForZeroVlocale_groupingSeparator\allowsFloatsWminimum_formatterBehavior_decimalSeparator_usesGroupingSeparator gSNaN T###0U-###0 lQ0   ]NS.identifiern%& XNSLocale )XNSLocale  KO   vwxy рCUXl vwxy ԀCtӀ_mCenterControls vwxy ԀCvЀ[mLeftStatus vwxy &{ԀCx0\mProgressOne vwxy ,}ԀCz-\mProgressTwo vwxy 2zԀC|+\mRightStatus vwxy 9ڀCU~ N O P Q R S T U V W X Y Z [ \ ]  = > A B D g F i j K n  :+ p O \ ܁Z[\]^_`abcde D = A > B j { F i m pq lSNaN S0.0T-0.0 A x  {O  vwxy CUp N O P Q R S T U V W X Y Z [ \ ]  g i j n   :+ p  فa^cb i { j q p^negativeFormat_decimalSeparator_usesGroupingSeparator_groupingSeparator^positiveFormatU-0.## T0.00T0.## KO  | SNaN vwxyI C\ vwx { HE?\startRender:%& _NSNibControlConnector )^NSNibConnector vwx { JEB]finishRender: vwx { LEEZsaveImage: vwx {E8]toggleRender: vwx {ŁE@^editVariation: vwx {ƁED_adjustVariation: vwx ց_startHiresRender: vwx ؁_cancelHiresRender: vwx { IE@_showHiresRenderSheet: vwx { MEGZsaveAsSVG: vwx { NEI\saveAsMovie: vwx  PL_uploadToGallery:   w  XNSMarkerVNSFileՁ_NSToolTipHelpKey%&  _NSIBHelpConnector )_NSIBHelpConnector   w !  Ł@_$The variation code determines the random choices used to generate the image. Using the same variation code will allow you to reproduce the same image as before. The variation code automatically increments each time you render an image. The variation code is a one to six letter sequence. ' ( ) vwx *V + , - .YNSKeyPath_NSNibBindingConnectorVersionYNSBinding~ 1 2_NSSharedInstance %& 5 6_NSUserDefaultsController 7 8)_NSUserDefaultsController\NSController_value: values.MovieQualityUvalue_values.MovieQuality%& = >_NSNibBindingConnector ? @)_NSNibBindingConnector^NSNibConnector ' ( ) vwx BV C , E ._selectedTag: values.MovieFormat[selectedTag_values.MovieFormat ' ( ) vwx LV + , O .܁Á_value: values.BorderSize_values.BorderSize ' ( ) vwx UV + , X .ƁŁ_value: values.MovieZoom_values.MovieZoom ' ( ) vwx ^V C , a .Ɂȁ_"selectedTag: values.MovieFrameRate_values.MovieFrameRate ' ( ) vwx gV + , j .́ˁp_value: values.MovieLength_values.MovieLength ' ( ) vwx pV + , s .ځρ΁_value: values.HiresMinimumSize_values.HiresMinimumSize ' ( ) vwx yV + , | .؁ҁс_value: values.SaveCropped_values.SaveCropped ' ( ) vwx V + , .сՁԁl_value: values.HiresHeight_values.HiresHeight ' ( ) vwx V + , .ρ؁ׁW_value: values.HiresWidth_values.HiresWidth ' ( ) vwx V , .{܁ہځ _fontName: values.EditorFontNameXfontName_values.EditorFontName ' ( ) vwx Vs , .{_NSPreviousConnectorف߁ށ _fontSize: values.EditorFontSizeXfontSize_values.EditorFontSize +  { :{{}z = H J K L I M N O P "@Pfv ,=m~ .  9 {s*4VdGfd 6     - K ? ہF !؁#܀EрӁDH8;@E:AЀԁ0-+.<?BDE@GIKLSNTWYdflnoqtvxz|~€ĀƁX~jinqpāƁ́΁́Ӂ|~ׁsvuzyځفށ݁"# ! F]NSApplication~  I J L N P R S U4 ́pxQ_{{526, 169}, {305, 107}}_Save Image Accessory Z&TViewZ{213, 107} +3 ^)؁Z{305, 107}_{{0, 0}, {1680, 1050}}Z{213, 129}_ {10000000000000, 10000000000000}~  e f h{ j l n S o p4j ́_{{636, 421}, {530, 130}}_Save Animation Accessory u&WNSPanel x&TViewZ{213, 107} +3 |)siZ{530, 130}_{{0, 0}, {1680, 1050}}Z{213, 129}_ {10000000000000, 10000000000000}~      S 4 ́Q_{{767, 252}, {305, 56}}_Save Tile Accessory &TViewZ{213, 107}_{{0, 0}, {1680, 1050}}Z{213, 129}_ {10000000000000, 10000000000000} + z = = = = = = = = =  {sss4VVVVVVVVVVVVVssssffsssssss 6   -  ǀFFрӁDӁ8Ӂ@Ӂ:рЀррс+<<<<<<<<<NTWTdTlToTtTxT|TTTTTTTTTTTTĀjiniiipiāií΁΁i|i~isiuiyiفi݀" +5 { :{{}z = H J K L I M N O P "@Pfv ,=m~ .  9 {s*4VdGfd 6     - K ? 56789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstF !؁#܀EрӁDH8;@E:AЀԁ0-+.<?BDE@GIKLSNTWYdflnoqtvxz|~€ĀƁX~jinqpāƁ́΁́Ӂ|~ׁsvuzyځفށ݁"#DMπ׀[]_`bdfh.023579;OQRVWrsuwy{}āǁʁ́ЁӁցف + !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÁāŁƁǁȁɁʁˁ́́΁ρЁсҁӁԁՁցׁ؁فځہ܁݁      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ +3ƀ) +Ɂ%&^NSIBObjectData)_NSKeyedArchiver]IB.objectdata"+5:? :M[bov       & ( * 7 @ K T c h q z 9 ; = ? A C E H K N Q T W Z ] ` c f i l o r u x { ~   # % ' ) + n x    ! # % ' ) + - / 1 4 6 8 : < > @ B T _     ! # % ' ) + - / 1 3 5 7 9 ; U q  7Uq6@ir{!+>@BDFS\^`bkuwx  *19BTYkt '/<Pf} '<JV^`bdfho %')5BHJQZqv?KMOQSUXZ\^ /1357v!/;OQSUWY[\^`bdmoq!#%')+-/13579V`ghjlnpr  "$%',=DKTVXadqz!-8B_`bdfhj4579;=?X}!$ABDFHJLe  3468:<>Wx}Rgu'.7@Kp{|~  N o !!!!$!)!2!>!E!L!U!a!l!!!!!!!!!!!!!!!!!!""""""" "9"Z"\"^"`"b"d"f#l###################$$$$$ $#$D$I$K$M$O$Q$S$U$p$$$$$$$$$$%%%$%9%V%a%i%k%m%o%x%%%%%%%%%%%%%%%%%%%%%& &&&#&.&7&T&U&W&Y&[&]&_&x&&&&&&&&&&&&&&&&&' '"'$'&'('*','5'F'H'J'S'V's't'v'x'z'|'~''''''''''''''''(()(+(-(/(1(3(5(;(X(Y([(](_(a(c({((((((((((((()))/)4)@)Q)S)U)W)Y)~)))))))))))))))))))))*+*5*C*Q*^*p***********************+++++-+/+1+3+5+n+p+r+t+v+x+z+|+~+++++++++++++++++,,,,, , , ,,,,,,,,,,!,#,.,[,e,h,j,m,p,y,|,,,,,,,,,,,,,,,,,,,,,,,,,,-,-.-0-2-4-9-;-=-?-A-N-P-U-W-Y-^-`-b-o-q-x-z-|-~-----------------.. ..".-.4.@.Q.S.V.X.Z..................// ////$/E/G/I/K/M/P/R/T/]/_/f/h/j/l///////////////////////00080:0<0>0@0B0F0S0U0g0p0v0000000000000000000011 1111F1O1[1g1j1o1q1t1w1y1|11111111111111111111112222222'2)2,2/282;2@2C2F2O2f2i2l33333333333344444$4<4m4p4s4u4x4{4}444444444444444555 5 5515<5E5R5[5d5f5m5o5q5t5}5555555555555666 6'6@6K6b6{66666666666666666667717>7H7K7N7W7Y7b7e7g7j7l7o7777777777777777777888888)8B8K8a8j8888888888888888888899 9 9999999:9_9`9c9f9i9l9n9q9s999999999999999999::<:=:@:C:F:I:K:N:P:q:t:w:y:{:}::::::::::::; ;;#;&;);+;-;/;0;2;9;P;y;;;;;;;;;;;;;;;;<< <<<'<2<< >>>>>>0>2>5>8>:>L>]>_>b>e>g>q>>>>>>>>>>>>>>>>???? ? ???2?5?7?:?=?@?B?E?N?P?S?V?w?z?|??????????????????????@@@@@ @@@@@1@V@W@Z@]@`@c@e@h@j@@@@@@@@@@@@@@@@@@A#A$A'A*A-A0A2A5A7AXA]A`AcAeAgAiAkArAAAAAAAAAAAAAAAAAABBBB!B$B'B)B,B.BVB{B|BBBBBBBBBBBBBBBBBBBBBBBCCC+CPCQCTCWCZC]C`CcCeCCCCCCCCCCCCCCCCCCDDDDD D#D&D)D+DLDODRDTDVDXDZDoDDDDDDDDDDDE+E=EDEVEdEyEEEEEEEEEEEEEEEEEEEEEEFF F F F9F?FGFQF\FjFwFFFFFFFFFFFFFFFFFFFFFFFFFFGG$G-G8G=GFGHGSG\G^GyG|GGGGGGGGGGGGGGGGGGGGGGGHHHHCHFHIHLHOHRHUHWHZH]H`HtHHHHHHHHHHHHHHHIIII I IIII*ISIVIYI\I_IbIeIgIjImIsIIIIIIIIIIIIIJ J JJJJJJJ!J$J'J;JdJgJjJmJpJsJvJxJ{J~JJJJJJJJJJJJJJKKK!K$K'K*K-K/K2K5K8KLKuKxK{K~KKKKKKKKKKKKKKKKKKKLL LLL!L5LBLQL^LeLnL|LLLLLLLLLLLMMMMMMM M"M$M&M5M>MJMMMPMYMbMxM}MMMMMMMMMMMMMN%N(N+N.N1N4N6N9NRARDRGRIRKRZRpRRRRRRRRRRRRRRRRRRRRRS S S SSSSSSS5SZS[S^SaSdSgSiSlSnSSSSSSSSSSSSSSSTTTT T T-T0T3T5T7T9T;TATXT}T~TTTTTTTTTTTTTTTTUU%U,U@ULU_UsU{UUUUUUUUUUUUUUUUUVVVV VVVVVV#V&V3V6V9V]A]r]]]]]]]]]]]]]^^^^^^ ^*^-^0^3^5^8^;^R^s^v^y^|^~^^^^^^^^^^^__"_%_(_+_-_._/_1_R_U_X_[_]_`_c_____________________```,`.`1`4`7`H`J`M`P`R```````````````````````````aaaa a aa)a,a/a2a5a8a;a>aAaDaGaJaMamaaaaaaaabbb-b:b=b@bCbGbPbSbUbZb`bmbpbsbvbxbbbbbbbbbbbbbbbbccccccccc1cBcDcGcIcKcWchcjcmcpcrccccccccccccccccccd1d2d5d8d:doAoDoGoJofo{ooooooooooooppppp#p7pTpWpZp]p`pcpeppppppppppppqqq6q?qBrurxrzr|r~rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrssssss s ssssssssss s"s$s&s(s*s,s.s0s2s4s6s9sy@yByDyFyHyJyMyPySyUyWyYy\y_ybyeyhykynyqytywyzy}yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyzzzz zzzz{{{{{{{{{{{{{{{{{{{{|||| ||||||||!|$|'|*|-|0|3|6|9|<|?|B|E|G|I|K|M|O|Q|S|U|W|Y|[|]|_|a|c|e|g|i|k|m|o|q|s|u|w|y|{|}|||||||||||||||||||||||||||||||||||||||||||||||}}}} } }}}}}}}"}%}(}+}.}1}4}7}:}=}@}C}F}I}L}O}R}U}X}[}^}a}d}g}i}k}m}o}q}s}v}y}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~ ~ ~~~~~~~!~*~- !$'*-0369ADGJMPSVY\_behknqtwz}Łȁˁ΁сԁׁځ݁ "%(+.147:=@CFILORUX[^adgjmpsvy|Ăǂʂ͂Ђӂւق܂߂ !$'*-0369ADGJMPSVY\_behknqtwz}„ńȄ˄΄фԄׄڄ݄ ).@ESUcontextfree-3.0.5+dfsg1.orig/src-osx/English.lproj/InfoPlist.strings0000644000175000017500000000044012076364074024075 0ustar brambram/* Localized versions of Info.plist keys */ CFBundleName = "Context Free"; NSHumanReadableCopyright = " Mark Lentczner & John Horigan, 2005";contextfree-3.0.5+dfsg1.orig/src-osx/English.lproj/MainMenu.nib/0000755000175000017500000000000012245646004023027 5ustar brambramcontextfree-3.0.5+dfsg1.orig/src-osx/English.lproj/MainMenu.nib/designable.nib0000644000175000017500000112607512076364074025640 0ustar brambram 1050 12B19 2549 1187 624.00 com.apple.InterfaceBuilder.CocoaPlugin 2549 YES NSBox NSButton NSButtonCell NSColorWell NSCustomObject NSMatrix NSMenu NSMenuItem NSNumberFormatter NSSlider NSSliderCell NSTextField NSTextFieldCell NSUserDefaultsController NSView NSWindowTemplate YES com.apple.InterfaceBuilder.CocoaPlugin PluginDependencyRecalculationVersion YES NSApplication FirstResponder NSApplication MainMenu YES Context Free 1048576 2147483647 NSImage NSMenuCheckmark NSImage NSMenuMixedState submenuAction: Context Free YES About Context Free 2147483647 Check for Update… 1048576 2147483647 YES YES 1048576 2147483647 Preferences… , 1048576 2147483647 YES YES 1048576 2147483647 Services 1048576 2147483647 submenuAction: Services YES _NSServicesMenu YES YES 1048576 2147483647 Hide Context Free h 1048576 2147483647 Hide Others h 1572864 2147483647 Show All 1048576 2147483647 YES YES 1048576 2147483647 Quit Context Free q 1048576 2147483647 _NSAppleMenu File 1048576 2147483647 submenuAction: File YES New n 1048576 2147483647 Open... o 1048576 2147483647 Open Recent 1048576 2147483647 submenuAction: Open Recent YES Clear Menu 1048576 2147483647 _NSRecentDocumentsMenu YES YES 1048576 2147483647 Close w 1048576 2147483647 Save s 1048576 2147483647 Save As… S 1048576 2147483647 Revert 2147483647 YES YES 1048576 2147483647 Upload to Gallery… u 1048576 2147483647 Edit 1048576 2147483647 submenuAction: Edit YES Undo z 1048576 2147483647 Redo Z 1048576 2147483647 YES YES 1048576 2147483647 Cut x 1048576 2147483647 Copy c 1048576 2147483647 Paste v 1048576 2147483647 Delete 1048576 2147483647 Select All a 1048576 2147483647 YES YES 2147483647 Insert Character 2147483647 submenuAction: Insert Character YES < 1048576 2147483647 8804 > 1048576 2147483647 8805 = 1048576 2147483647 8800 . 1048576 2147483647 8230 ± + 1048576 2147483647 177 i 1048576 2147483647 8734 Insert Symmetry 2147483647 submenuAction: Insert Symmetry YES CF::Cyclic 2147483647 CF::Dihedral 2147483647 YES YES 2147483647 CF::p11g 2147483647 CF::p11m 2147483647 CF::p1m1 2147483647 CF::p2 2147483647 CF::p2mg 2147483647 CF::p2mm 2147483647 YES YES 2147483647 CF::p2 2147483647 CF::pm 2147483647 CF::pg 2147483647 CF::cm 2147483647 CF::pmm 2147483647 CF::pmg 2147483647 CF::pgg 2147483647 CF::cmm 2147483647 CF::p4 2147483647 CF::p4m 2147483647 CF::p4g 2147483647 CF::p3 2147483647 CF::p3m1 2147483647 CF::p31m 2147483647 CF::p6 2147483647 CF::p6m 2147483647 Insert Variable 2147483647 submenuAction: Insert Variable YES CF::AllowOverlap 2147483647 CF::Alpha 2147483647 CF::Background 2147483647 CF::BorderDynamic 2147483647 CF::BorderFixed 2147483647 CF::Color 2147483647 CF::ColorDepth 2147483647 CF::Frame 2147483647 CF::FrameTime 2147483647 CF::Impure 2147483647 CF::MaxNatural 2147483647 CF::MinimumSize 2147483647 CF::Size 2147483647 CF::Symmetry 2147483647 CF::Tile 2147483647 CF::Time 2147483647 Insert Flag 2147483647 submenuAction: Insert Flag YES CF::MiterJoin 2147483647 CF::RoundJoin 2147483647 CF::BevelJoin 2147483647 CF::ButtCap 2147483647 CF::RoundCap 2147483647 CF::SquareCap 2147483647 CF::ArcCW 2147483647 CF::ArcLarge 2147483647 CF::Continuous 2147483647 CF::Align 2147483647 CF::EvenOdd 2147483647 CF::IsoWidth 2147483647 YES YES 1048576 2147483647 Find 1048576 2147483647 submenuAction: Find YES Find… f 1048576 2147483647 1 Find Next g 1048576 2147483647 2 Find Previous G 1048576 2147483647 3 Use Selection for Find e 1048576 2147483647 7 Jump to Selection j 1048576 2147483647 Spelling 1048576 2147483647 submenuAction: Spelling YES Spelling… : 1048576 2147483647 Check Spelling ; 1048576 2147483647 Check Spelling as You Type 1048576 2147483647 Render 1048576 2147483647 submenuAction: Render YES Render r 1048576 2147483647 Repeat Render R 1048576 2147483647 Render with dimensions… r 1572864 2147483647 Stop rendering / 1048576 2147483647 YES YES 1048576 2147483647 Save Image… 1048576 2147483647 Save as SVG… 1048576 2147483647 Save as Animation… 1048576 2147483647 Window 1048576 2147483647 submenuAction: Window YES Zoom 1048576 2147483647 Minimize m 1048576 2147483647 YES YES 1048576 2147483647 Color Calculator c 1572864 2147483647 YES YES 1048576 2147483647 Bring All to Front 1048576 2147483647 Close All Windows 2147483647 Enter Full Screen f 1310720 2147483647 420 _NSWindowsMenu Examples 1048576 2147483647 submenuAction: Examples YES YES Help 1048576 2147483647 submenuAction: Help YES _NSMainMenu CFDGController 7 2 {{396, 318}, {489, 386}} 1882718208 Context Free Preferences NSWindow View {489, 386} {489, 386} 256 YES 256 {{207, 308}, {184, 58}} YES NO 3 1 YES -2080374784 0 Open Welcome document LucidaGrande 13 1044 2 1211912448 0 NSRadioButton 200 25 67108864 0 Open Untitled document 1 1211912448 0 200 25 67108864 0 Do nothing 1211912448 0 549453824 {18, 18} YES YES TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFugEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 3 MCAwAA 400 75 {184, 18} {4, 2} 1143472128 NSActionCell 67108864 0 Radio 1211912448 0 549453824 {18, 18} YES YES TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ 29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ 0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ 7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ 5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ 3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ 6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ /v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ ///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFugEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 400 75 6 System controlColor 3 MC42NjY2NjY2NjY3AA 3 MQA 256 {{34, 349}, {170, 17}} YES 67108864 71303168 When Context Free opens: 6 System controlTextColor 3 MAA NO 256 {{207, 246}, {190, 18}} YES -2080374784 0 Start rendering 1211912448 2 NSImage NSSwitch NSSwitch 200 25 NO 256 {{17, 247}, {187, 17}} YES 67108864 71303168 When a document is opened: NO 256 {{207, 90}, {264, 18}} YES 67108864 0 Include the variation code in file name 1211912448 2 200 25 NO 256 {{54, 91}, {150, 17}} YES 67108864 71303168 When saving an image: NO 256 {{54, 25}, {150, 17}} YES 67108864 71303168 Editor Font: NO 256 {{207, 68}, {190, 18}} YES 67108864 0 Crop the image 1211912448 2 200 25 NO 256 {{96, 206}, {108, 17}} YES 67108864 71303168 While rendering: NO 256 {{207, 205}, {220, 18}} YES -2080374784 0 Progressively update the image 1211912448 2 200 25 NO 256 {{207, 286}, {228, 18}} YES 67108864 0 Check for updates (once a week) 1211912448 2 200 25 NO 256 {{207, 154}, {190, 25}} YES 67108864 0 Helvetica 12 16 2 -1 2 0.0 4 0 NO NO NO 256 {{81, 165}, {123, 17}} YES 67108864 71303168 Image border size: NO 256 {{193, 132}, {45, 14}} YES 67108864 138412032 negative LucidaGrande 9 3614 NO 256 {{259, 135}, {30, 11}} YES 67108864 138412032 none NO 256 {{316, 135}, {30, 11}} YES 67108864 138412032 fixed NO 256 {{368, 135}, {43, 11}} YES 67108864 138412032 variable NO 268 {{209, 20}, {168, 22}} YES -2075131840 272630784 YES 6 System textBackgroundColor 6 System textColor NO 268 {{379, 14}, {96, 32}} YES 67108864 134217728 Change -2038284288 129 200 25 NO {489, 386} {{0, 0}, {1680, 1050}} {489, 408} {489, 408} PreferencesFrame YES YES 19 2 {{471, 451}, {337, 231}} -260571136 Color Calculator NSPanel View {338, 232} {337, 231} 256 YES 256 {{61, 170}, {60, 19}} YES -1804599231 71435264 234.1 LucidaGrande 11 3100 YES NO 256 {{129, 170}, {60, 19}} YES -1804599231 71435264 0.8901 YES NO 256 {{197, 170}, {60, 19}} YES -1804599231 71435264 0.7501 YES NO 256 YES YES NSColor pasteboard type {{265, 167}, {52, 24}} YES NO YES 1 MC4wNTE1NzU0OTMgMC4xODYxNjAwNyAwLjcyOTA2MDgzAA 256 {{126, 197}, {66, 14}} YES 67108864 138543104 Saturation NO 256 {{194, 197}, {66, 14}} YES 67108864 138543104 Brightness NO 256 {{20, 172}, {36, 14}} YES 67108864 71434240 Start NO 256 {{20, 111}, {36, 14}} YES 67108864 71434240 Delta NO 256 {{20, 50}, {36, 14}} YES 67108864 71434240 Finish NO 256 {{58, 148}, {262, 14}} YES 69206017 4194304 hue =234 sat =0.89 b =0.75 NO 256 {{61, 109}, {60, 19}} YES -1804599231 71435264 3 YES NO 256 {{129, 109}, {60, 19}} YES -1804599231 71435264 -0.03 YES NO 256 {{197, 109}, {60, 19}} YES -1804599231 71435264 0 YES NO 256 {{58, 87}, {262, 14}} YES 69206017 4194304 hue 3 sat -0.03 b 0 NO 256 {{61, 48}, {60, 19}} YES -1804599231 71435264 237 YES NO 256 {{129, 48}, {60, 19}} YES -1804599231 71435264 0.86 YES NO 256 {{197, 48}, {60, 19}} YES -1804599231 71435264 0.75 YES NO 256 YES YES NSColor pasteboard type {{265, 45}, {52, 24}} YES NO YES 1 MC4wNTgxMzA0OTkgMC4wNTU1NDE4OTkgMQA 256 {{58, 26}, {262, 14}} YES 69206017 4194304 hue =237 sat =0.86 b =0.75 NO 256 YES 274 {{1, 1}, {295, 0}} {{20, 82}, {297, 1}} {0, 0} 67108864 0 Box 3 MCAwLjgwMDAwMDAxAA 1 3 0 NO 256 {{58, 197}, {66, 14}} YES 67108864 138543104 Hue NO 268 {{265, 109}, {52, 19}} YES -1804599231 71435264 1 YES NO 256 {{262, 131}, {43, 14}} YES 67108864 4325376 Steps NO {337, 231} {{0, 0}, {1680, 1050}} {337, 247} {338, 248} YES ColorCalc YES YES allowsFloats attributedStringForZero decimalSeparator formatterBehavior groupingSeparator maximum minimum negativeFormat positiveFormat textAttributesForNegativeValues usesGroupingSeparator YES 0.0 YES YES . , -0.0### 0.0### YES 0.0### -0.0### NaN . , NO YES YES YES YES allowsFloats attributedStringForZero decimalSeparator formatterBehavior groupingSeparator negativeFormat positiveFormat usesGroupingSeparator YES 0.0 . , -#,##0.0 #,##0.0 #,##0.0 -#,##0.0 NaN 0 0 YES NO 1 AAAAAAAAAAAAAAAAAAAAAA . , YES YES YES YES YES allowsFloats decimalSeparator formatterBehavior groupingSeparator maximum minimum negativeFormat positiveFormat usesGroupingSeparator YES . , -#,##0.00 #,##0 #,##0 -#,##0.00 0 NaN . , YES YES YES YES YES allowsFloats attributedStringForZero decimalSeparator formatterBehavior groupingSeparator maximum minimum negativeFormat positiveFormat usesGroupingSeparator YES 0.0 YES YES NSColor NSFont NSOriginalFont NSParagraphStyle YES 4 2 . , -0.0### 0.0### 0.0### -0.0### NaN . , NO YES YES Menu 2147483647 submenuAction: Menu YES Item 2147483647 Item 2147483647 Item 2147483647 YES YES 2147483647 YES terminate: 139 orderFrontStandardAboutPanel: 142 hideOtherApplications: 146 hide: 152 unhideAllApplications: 153 delegate 231 performMiniaturize: 37 arrangeInFront: 39 clearRecentDocuments: 127 cut: 175 paste: 176 redo: 178 selectAll: 179 undo: 180 copy: 181 showGuessPanel: 188 checkSpelling: 190 toggleContinuousSpellChecking: 192 performClose: 193 delete: 195 performZoom: 198 performFindPanelAction: 199 performFindPanelAction: 200 performFindPanelAction: 201 performFindPanelAction: 202 centerSelectionInVisibleArea: 203 newDocument: 213 openDocument: 214 saveDocument: 215 saveDocumentAs: 216 revertDocumentToSaved: 217 startRender: 225 saveImage: 227 showHiresRenderSheet: 229 finishRender: 316 saveAsSVG: 389 saveAsMovie: 391 uploadToGallery: 401 repeatRender: 404 closeAll: 602 enterFullscreen: 607 insertUnicode: 621 insertUnicode: 622 insertUnicode: 623 insertUnicode: 624 insertUnicode: 625 insertUnicode: 626 insertUnicode: 655 insertUnicode: 656 insertUnicode: 657 insertUnicode: 659 insertUnicode: 661 insertUnicode: 663 insertUnicode: 665 insertUnicode: 667 insertUnicode: 669 insertUnicode: 671 insertUnicode: 673 insertUnicode: 675 insertUnicode: 677 insertUnicode: 679 insertUnicode: 681 insertUnicode: 683 insertUnicode: 687 insertUnicode: 689 insertUnicode: 691 insertUnicode: 693 insertUnicode: 695 insertUnicode: 697 insertUnicode: 699 insertUnicode: 700 insertUnicode: 702 insertUnicode: 704 insertUnicode: 706 insertUnicode: 708 insertUnicode: 710 insertUnicode: 712 insertUnicode: 714 insertUnicode: 716 insertUnicode: 718 insertUnicode: 720 insertUnicode: 722 insertUnicode: 724 insertUnicode: 726 insertUnicode: 728 insertUnicode: 729 insertUnicode: 731 insertUnicode: 733 insertUnicode: 735 insertUnicode: 737 insertUnicode: 739 insertUnicode: 741 insertUnicode: 743 insertUnicode: 745 insertUnicode: 747 insertUnicode: 749 insertUnicode: 751 insertUnicode: 753 insertUnicode: 761 mExampleMenu 241 checkForUpdateNow: 320 mHelpMenu 323 setEditorFont: 545 mFontDisplay 546 mFullScreenMenu 604 makeKeyAndOrderFront: 302 value: values.RenderOnDocumentOpen value: values.RenderOnDocumentOpen value values.RenderOnDocumentOpen 2 291 selectedTag: values.LaunchAction selectedTag: values.LaunchAction selectedTag values.LaunchAction 2 294 value: values.SaveWithVariationCode value: values.SaveWithVariationCode value values.SaveWithVariationCode 2 300 value: values.SaveCropped value: values.SaveCropped value values.SaveCropped 2 301 value: values.ProgressiveUpdate value: values.ProgressiveUpdate value values.ProgressiveUpdate 2 288 value: values.CheckUpdatesWeekly value: values.CheckUpdatesWeekly value values.CheckUpdatesWeekly 2 322 makeKeyAndOrderFront: 371 value: startHue value: startHue value startHue 2 352 formatter 383 value: startSaturation value: startSaturation value startSaturation 2 353 formatter 374 value: startBrightness value: startBrightness value startBrightness 2 354 formatter 375 value: startColor value: startColor value startColor 2 355 value: startText value: startText value startText NSAllowsEditingMultipleValuesSelection 2 357 value: deltaHue value: deltaHue value deltaHue 2 358 formatter 384 value: deltaSaturation value: deltaSaturation value deltaSaturation 2 359 formatter 494 value: deltaBrightness value: deltaBrightness value deltaBrightness 2 360 formatter 495 value: deltaText value: deltaText value deltaText NSAllowsEditingMultipleValuesSelection 2 362 value: finishHue value: finishHue value finishHue 2 363 formatter 385 value: finishSaturation value: finishSaturation value finishSaturation 2 364 formatter 380 value: finishBrightness value: finishBrightness value finishBrightness 2 365 formatter 381 value: finishColor value: finishColor value finishColor 2 366 value: finishText value: finishText value finishText NSAllowsEditingMultipleValuesSelection 2 368 value: values.BorderSize value: values.BorderSize value values.BorderSize 2 393 value: deltaSteps value: deltaSteps value deltaSteps 2 488 formatter 490 fontName: values.EditorFontName fontName: values.EditorFontName fontName values.EditorFontName 2 554 fontSize: values.EditorFontSize fontSize: values.EditorFontSize fontSize values.EditorFontSize 2 555 YES 0 -2 File's Owner -1 First Responder -3 Application 29 YES MainMenu 19 YES 24 YES 5 23 92 197 369 370 56 YES 57 YES 58 129 131 YES 130 134 136 143 144 145 149 150 196 319 83 YES 81 YES 72 73 75 79 80 82 112 124 YES 125 YES 126 399 400 103 YES 106 163 YES 169 YES 156 157 158 160 164 168 YES 159 YES 154 155 161 162 167 171 172 173 174 184 YES 185 YES 187 189 191 220 YES 219 YES 221 222 223 224 228 388 390 402 239 YES 238 230 CFDGController 242 YES Preferences 243 YES 244 YES 245 YES 248 249 250 251 YES 252 YES 253 YES 254 YES 255 YES 257 YES 266 YES 321 YES 392 YES 394 YES 395 YES 396 YES 397 YES 398 YES 537 YES 539 YES 543 YES 268 Shared Defaults 324 YES ColorCalc 325 YES 326 YES 327 YES 328 YES 329 330 YES 331 YES 332 YES 333 YES 334 YES 335 YES 336 YES 337 YES 338 YES 339 YES 340 YES 341 YES 342 YES 343 YES 344 345 YES 346 YES 484 YES 491 YES 348 ColorCalcObj 372 ColorCalcFormatter 382 ColorHueFormatter 489 StepFormatter 493 DeltaCalcFormatter 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 603 608 YES 609 YES 610 611 YES 612 YES 613 614 615 616 617 618 619 620 627 628 629 YES 630 YES 631 632 YES 633 YES 634 635 YES 636 YES 637 638 639 658 660 662 664 666 668 670 672 674 676 678 680 682 684 685 686 688 690 692 694 696 698 701 703 705 707 709 711 713 715 717 719 721 723 725 727 730 732 734 736 738 740 742 744 746 748 750 752 760 YES YES -1.IBPluginDependency -2.IBPluginDependency -3.IBPluginDependency 103.IBPluginDependency 106.IBPluginDependency 112.IBPluginDependency 124.IBPluginDependency 125.IBPluginDependency 126.IBPluginDependency 129.IBPluginDependency 130.IBPluginDependency 131.IBPluginDependency 134.IBPluginDependency 136.IBPluginDependency 143.IBPluginDependency 144.IBPluginDependency 145.IBPluginDependency 149.IBPluginDependency 150.IBPluginDependency 154.IBPluginDependency 155.IBPluginDependency 156.IBPluginDependency 157.IBPluginDependency 158.IBPluginDependency 159.IBPluginDependency 160.IBPluginDependency 161.IBPluginDependency 162.IBPluginDependency 163.IBPluginDependency 164.IBPluginDependency 167.IBPluginDependency 168.IBPluginDependency 169.IBPluginDependency 171.IBPluginDependency 172.IBPluginDependency 173.IBPluginDependency 174.IBPluginDependency 184.IBPluginDependency 185.IBPluginDependency 187.IBPluginDependency 189.IBPluginDependency 19.IBPluginDependency 191.IBPluginDependency 196.IBPluginDependency 197.IBPluginDependency 219.IBPluginDependency 220.IBPluginDependency 221.IBPluginDependency 222.IBPluginDependency 223.IBPluginDependency 224.IBPluginDependency 228.IBPluginDependency 23.IBPluginDependency 230.IBPluginDependency 238.IBPluginDependency 239.IBPluginDependency 24.IBPluginDependency 242.IBPluginDependency 242.IBWindowTemplateEditedContentRect 243.IBPluginDependency 244.IBPluginDependency 245.IBPluginDependency 248.IBPluginDependency 249.IBPluginDependency 250.IBPluginDependency 251.IBPluginDependency 252.IBPluginDependency 253.IBPluginDependency 254.IBPluginDependency 255.IBAttributePlaceholdersKey 255.IBPluginDependency 257.IBPluginDependency 266.IBAttributePlaceholdersKey 266.IBPluginDependency 268.IBPluginDependency 29.IBPluginDependency 319.IBPluginDependency 321.IBPluginDependency 324.IBPluginDependency 325.IBPluginDependency 326.IBPluginDependency 327.IBPluginDependency 328.IBPluginDependency 329.IBPluginDependency 330.IBPluginDependency 331.IBPluginDependency 332.IBPluginDependency 333.IBPluginDependency 334.IBPluginDependency 335.IBPluginDependency 336.IBPluginDependency 337.IBPluginDependency 338.IBPluginDependency 339.IBPluginDependency 340.IBPluginDependency 341.IBPluginDependency 342.IBPluginDependency 343.IBPluginDependency 344.IBPluginDependency 345.IBPluginDependency 346.IBPluginDependency 348.IBPluginDependency 369.IBPluginDependency 370.IBPluginDependency 372.IBPluginDependency 382.IBPluginDependency 388.IBPluginDependency 390.IBPluginDependency 392.IBPluginDependency 394.IBPluginDependency 395.IBPluginDependency 396.IBPluginDependency 397.IBPluginDependency 398.IBPluginDependency 399.IBPluginDependency 400.IBPluginDependency 402.IBPluginDependency 484.IBPluginDependency 489.IBPluginDependency 491.IBPluginDependency 493.IBPluginDependency 5.IBPluginDependency 537.IBPluginDependency 539.IBPluginDependency 543.IBPluginDependency 56.IBPluginDependency 561.IBPluginDependency 562.IBPluginDependency 563.IBPluginDependency 564.IBPluginDependency 565.IBPluginDependency 566.IBPluginDependency 567.IBPluginDependency 568.IBPluginDependency 569.IBPluginDependency 57.IBPluginDependency 570.IBPluginDependency 571.IBPluginDependency 572.IBPluginDependency 573.IBPluginDependency 574.IBPluginDependency 575.IBPluginDependency 576.IBPluginDependency 577.IBPluginDependency 578.IBPluginDependency 579.IBPluginDependency 58.IBPluginDependency 580.IBPluginDependency 581.IBPluginDependency 582.IBPluginDependency 583.IBPluginDependency 584.IBPluginDependency 585.IBPluginDependency 586.IBPluginDependency 587.IBPluginDependency 588.IBPluginDependency 589.IBPluginDependency 590.IBPluginDependency 591.IBPluginDependency 592.IBPluginDependency 593.IBPluginDependency 594.IBPluginDependency 595.IBPluginDependency 596.IBPluginDependency 597.IBPluginDependency 598.IBPluginDependency 599.IBPluginDependency 600.IBPluginDependency 603.IBPluginDependency 608.IBPluginDependency 609.IBPluginDependency 610.IBPluginDependency 611.IBPluginDependency 612.IBPluginDependency 613.IBPluginDependency 614.IBPluginDependency 615.IBPluginDependency 616.IBPluginDependency 617.IBPluginDependency 618.IBPluginDependency 619.IBPluginDependency 620.IBPluginDependency 627.IBPluginDependency 628.IBPluginDependency 629.IBPluginDependency 630.IBPluginDependency 631.IBPluginDependency 632.IBPluginDependency 633.IBPluginDependency 634.IBPluginDependency 635.IBPluginDependency 636.IBPluginDependency 637.IBPluginDependency 638.IBPluginDependency 639.IBPluginDependency 658.IBPluginDependency 660.IBPluginDependency 662.IBPluginDependency 664.IBPluginDependency 666.IBPluginDependency 668.IBPluginDependency 670.IBPluginDependency 672.IBPluginDependency 674.IBPluginDependency 676.IBPluginDependency 678.IBPluginDependency 680.IBPluginDependency 682.IBPluginDependency 684.IBPluginDependency 685.IBPluginDependency 686.IBPluginDependency 688.IBPluginDependency 690.IBPluginDependency 692.IBPluginDependency 694.IBPluginDependency 696.IBPluginDependency 698.IBPluginDependency 701.IBPluginDependency 703.IBPluginDependency 705.IBPluginDependency 707.IBPluginDependency 709.IBPluginDependency 711.IBPluginDependency 713.IBPluginDependency 715.IBPluginDependency 717.IBPluginDependency 719.IBPluginDependency 72.IBPluginDependency 721.IBPluginDependency 723.IBPluginDependency 725.IBPluginDependency 727.IBPluginDependency 73.IBPluginDependency 730.IBPluginDependency 732.IBPluginDependency 734.IBPluginDependency 736.IBPluginDependency 738.IBPluginDependency 740.IBPluginDependency 742.IBPluginDependency 744.IBPluginDependency 746.IBPluginDependency 748.IBPluginDependency 75.IBPluginDependency 750.IBPluginDependency 752.IBPluginDependency 760.IBPluginDependency 79.IBPluginDependency 80.IBPluginDependency 81.IBPluginDependency 82.IBPluginDependency 83.IBPluginDependency 92.IBPluginDependency YES com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{65, 609}, {489, 386}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip The image often does not fill the render dimensions. Cropping the image trims the white space, though still leaves a small border. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Update the window as the image is rendered. Slows rendering substantially, but looks very cool. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin YES YES 761 YES CFDGController NSObject YES YES checkForUpdateNow: gotoURL: openExample: setEditorFont: YES id id id id YES YES checkForUpdateNow: gotoURL: openExample: setEditorFont: YES checkForUpdateNow: id gotoURL: id openExample: id setEditorFont: id YES YES mExampleMenu mFontDisplay mFullScreenMenu mHelpMenu YES NSMenu NSTextField NSMenuItem NSMenu YES YES mExampleMenu mFontDisplay mFullScreenMenu mHelpMenu YES mExampleMenu NSMenu mFontDisplay NSTextField mFullScreenMenu NSMenuItem mHelpMenu NSMenu IBProjectSource ./Classes/CFDGController.h CFDGDocument NSDocument YES YES cancelHiresRender: closeAll: enterFullscreen: finishRender: insertUnicode: repeatRender: saveAsMovie: saveAsSVG: saveImage: showHiresRenderSheet: startHiresRender: startRender: stopRender: uploadToGallery: YES id id id id id id id id id id id id id id YES YES cancelHiresRender: closeAll: enterFullscreen: finishRender: insertUnicode: repeatRender: saveAsMovie: saveAsSVG: saveImage: showHiresRenderSheet: startHiresRender: startRender: stopRender: uploadToGallery: YES cancelHiresRender: id closeAll: id enterFullscreen: id finishRender: id insertUnicode: id repeatRender: id saveAsMovie: id saveAsSVG: id saveImage: id showHiresRenderSheet: id startHiresRender: id startRender: id stopRender: id uploadToGallery: id YES YES mEditor mGView mHiresSheet mStatus mStatusText YES NSTextView GView NSPanel NSTextField NSTextView YES YES mEditor mGView mHiresSheet mStatus mStatusText YES mEditor NSTextView mGView GView mHiresSheet NSPanel mStatus NSTextField mStatusText NSTextView IBProjectSource ./Classes/CFDGDocument.h ColorCalc NSObject IBProjectSource ./Classes/ColorCalc.h FirstResponder YES YES finishRender: repeatRender: saveAsMovie: saveAsSVG: saveImage: showHiresRenderSheet: showSvgRenderSheet: startRender: stopRender: toggleLegacyVariations: uploadToGallery: YES id id id id id id id id id id id YES YES finishRender: repeatRender: saveAsMovie: saveAsSVG: saveImage: showHiresRenderSheet: showSvgRenderSheet: startRender: stopRender: toggleLegacyVariations: uploadToGallery: YES finishRender: id repeatRender: id saveAsMovie: id saveAsSVG: id saveImage: id showHiresRenderSheet: id showSvgRenderSheet: id startRender: id stopRender: id toggleLegacyVariations: id uploadToGallery: id IBUserSource GView NSView YES YES adjustVariation: editVariation: enterFullscreen: finishRender: repeatRender: saveAsMovie: saveAsSVG: saveImage: saveTileImage: showHiresRenderSheet: startRender: stopRender: toggleRender: YES id id id id id id id id id id id id id YES YES adjustVariation: editVariation: enterFullscreen: finishRender: repeatRender: saveAsMovie: saveAsSVG: saveImage: saveTileImage: showHiresRenderSheet: startRender: stopRender: toggleRender: YES adjustVariation: id editVariation: id enterFullscreen: id finishRender: id repeatRender: id saveAsMovie: id saveAsSVG: id saveImage: id saveTileImage: id showHiresRenderSheet: id startRender: id stopRender: id toggleRender: id YES YES mDocument mOutputProgress mProgress mRenderControl mSaveAnimationAccessory mSaveImageAccessory mSaveTileAccessory mSaveTileHeight mSaveTileWidth mStatus mTopBar mVariationField mVariationLabel mVariationStepper YES CFDGDocument NSProgressIndicator NSProgressIndicator NSButton NSView NSView NSView NSTextField NSTextField NSTextField TopBar NSTextField NSTextField NSStepper YES YES mDocument mOutputProgress mProgress mRenderControl mSaveAnimationAccessory mSaveImageAccessory mSaveTileAccessory mSaveTileHeight mSaveTileWidth mStatus mTopBar mVariationField mVariationLabel mVariationStepper YES mDocument CFDGDocument mOutputProgress NSProgressIndicator mProgress NSProgressIndicator mRenderControl NSButton mSaveAnimationAccessory NSView mSaveImageAccessory NSView mSaveTileAccessory NSView mSaveTileHeight NSTextField mSaveTileWidth NSTextField mStatus NSTextField mTopBar TopBar mVariationField NSTextField mVariationLabel NSTextField mVariationStepper NSStepper IBProjectSource ./Classes/GView.h NSDocument YES YES printDocument: revertDocumentToSaved: runPageLayout: saveDocument: saveDocumentAs: saveDocumentTo: YES id id id id id id YES YES printDocument: revertDocumentToSaved: runPageLayout: saveDocument: saveDocumentAs: saveDocumentTo: YES printDocument: id revertDocumentToSaved: id runPageLayout: id saveDocument: id saveDocumentAs: id saveDocumentTo: id IBProjectSource ./Classes/NSDocument.h TopBar NSView YES YES mCenterControls mLeftStatus mProgressOne mProgressTwo mRightStatus YES NSView NSView NSView NSView NSView YES YES mCenterControls mLeftStatus mProgressOne mProgressTwo mRightStatus YES mCenterControls NSView mLeftStatus NSView mProgressOne NSView mProgressTwo NSView mRightStatus NSView IBProjectSource ./Classes/TopBar.h WebView reloadFromOrigin: id reloadFromOrigin: reloadFromOrigin: id IBProjectSource ./Classes/WebView.h 0 IBCocoaFramework com.apple.InterfaceBuilder.CocoaPlugin.macosx com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 YES 3 YES YES NSMenuCheckmark NSMenuMixedState NSSwitch YES {11, 11} {10, 3} {15, 15} contextfree-3.0.5+dfsg1.orig/src-osx/English.lproj/MainMenu.nib/keyedobjects.nib0000644000175000017500000015321712076364074026213 0ustar brambrambplist00X$versionX$objectsY$archiverT$topL#'.159 019:=GHINQVWZ_efk| !$%)*7>CDIQRZ[m  A!"#+01259>FGOPU]^fgltu}~ "&'()-4567;BCDEIPQRSW^_`aelmnry~  &'12:;?DEIJOQTWXYZ`afgkpstyz}  !"+234=FGHPQZ[dwz    !()*.59:;?FGHIMTXYZ[_fghimtuvw{  $+,-.29:;<@GHINUVW\cdtux{|}       % & - . 8 < ? @ C K L S T e i o p q r x y |          ! " # ' / 0 4 < = > B J K L P W [ \ ` g k l p w { |      # $ ( / 0 4 ; < @ G H L S T X _ ` d k l p w x |       $ + , 0 7 8 < C D H O P T [ \ ` g h l s t x          " # $ * + 2 3 4 ; < = D E F M N O W X Y _ f g h o p q x y z $-./47:;DMNWXY\irstw{|-678GPYZ[^fopqw !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~U$null VNSRoot]NSConnections\NSOidsValues_NSObjectsValues]NSObjectsKeys_NSAccessibilityOidsValues_NSVisibleWindows_NSAccessibilityOidsKeys_NSAccessibilityConnectorsV$classZNSOidsKeys_JJIK !"[NSClassName$%&YNS.string]NSApplication()*+Z$classnameX$classes_NSMutableString*,-XNSStringXNSObject()/0^NSCustomObject/-234ZNS.objects()67\NSMutableSet68-UNSSet2:ʯ;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ɀ *7?@ABCDEF[NSColorName\NSColorSpace]NSCatalogNameWNSColor#! "VSystem_textBackgroundColorJ?KLBWNSWhiteB1#()OPWNSColorO->?@ABSDEU#% &YtextColorJ?XLBB0#()[\_NSTextFieldCell[]^-\NSActionCellVNSCell()`a[NSTextField`bcd-YNSControlVNSView[NSResponder\mFontDisplayhiҀ +6 lmnopqrstuvwxyz{]NSMnemonicLocVNSMenu_NSKeyEquivModMaskYNSOnImageZNSKeyEquivUNSTag\NSMixedImage,5/.-34~_Enter Full ScreenQf ^NSResourceName021WNSImage_NSMenuCheckmark()_NSCustomResource- 024_NSMenuMixedState()ZNSMenuItem-_mFullScreenMenuҀ 8; 9:THelp2ʠYmHelpMenuҀ=C` @?(>>  .k_{{61, 170}, {60, 19}} !"#$%&),.pA='B A$BU234.123478#@& \NS.localizedVNS.nil_NS.negativeformat[NS.rounding_NS.negativeattrsVNS.nanVNS.max_NS.positiveattrs_NS.positiveformatWNS.zeroVNS.minZNS.decimal[NS.thousand_NS.hasthousands_NS.allowsfloats]NS.attributes YM[]WP]NU D_2WNS.keysEFGHIJKLMNOOPUVWX^negativeFormat_decimalSeparator_usesGroupingSeparator\allowsFloats_attributedStringForZero_groupingSeparator_formatterBehavior^positiveFormatX-#,##0.0Q.     XNSString\NSAttributesQTRS0.02S()\NSDictionary-()_NSAttributedString-_NSAttributedStringQ,W#,##0.0() _NSMutableDictionary- " ZTP  & \TRSNaN+,-./012454[NS.mantissa[NS.negative[NS.exponent^NS.mantissa.boYNS.lengthZNS.compact^O ()89_NSDecimalNumberPlaceholder:;<=-_NSDecimalNumberPlaceholder_NSDecimalNumberXNSNumberWNSValue()?@_NSNumberFormatterAB-_NSNumberFormatter[NSFormatterYformatterEFҀbf` JKdc(>> _{{129, 170}, {60, 19}} !"#$%&E),X.b'B e$V0.8901]^`abdefk rkmslpoqNU g_2nzqryEFhiGHIJKLj^b`edfkNlmnOoUVpqXWmaximum_textAttributesForNegativeValuesWminimumW-0.0####?2S    QTRV0.0#### " ZT  & \TRFҀuf` wv(>> _{{197, 170}, {60, 19}} !"#$%&),.u'B x$V0.7501ҀzC` |{(>> _{{61, 109}, {60, 19}} !"#$%&),.z'B }$Q3Ҁ` 态(>> _{{129, 109}, {60, 19}} !"#$%&),.'B $U-0.03 NU _2qyEFhGHIJKLjNnUVXW-0.0####?    QT2.$BBS_NSParagraphStyleVNSFont^NSOriginalFont$%&()*ZNSTabStops[NSAlignment_NSLineBreakMode(),-_NSMutableParagraphStyle./-_NSMutableParagraphStyle_NSParagraphStyleV0.0#### " ZT  & \TR:Ҁ` ?@怗(>> _{{197, 109}, {60, 19}} !"#$%&:),M.'B $Q0QҀC` VW怜(>> _{{61, 48}, {60, 19}} !"#$%&Q),d.'B $S237hFҀf` mn怡(>> _{{129, 48}, {60, 19}} !"#$%&h),{.'B $T0.86FҀf` 怦(>> _{{197, 48}, {60, 19}} !"#$%&),.'B $T0.75Ҁ`  怫(>> _{{265, 109}, {52, 19}} !"#$%&),.'B $Q1 NU _2qyEFhGHJKLjNOUVXY-#,##0.00#@@U#,##0#?   TRQ0 " ZT  & \TR瀸lmnoprstvw-{,5/3_Bring All to Front_arrangeInFront:()_NSNibControlConnector-^NSNibConnector瀽lmnoprstvw{,5/3XMinimizeQm_performMiniaturize:€ŀmloprv sw-{5À/Ā34hft_About Context Free_orderFrontStandardAboutPanel:ǀˀlmnoprsvw {Ȁ5/ʀɀ3#$xyWOpen...Qo]openDocument:*+̀Ѐlmnoprsvw12{Ȁ5/π΀3UCloseQw]performClose:89ҀՀlmnoprsvw?@{Ȁ5/ԀӀ3TSaveQs]saveDocument:FG׀ڀlmnoprsvwMN{Ȁ5/ـ؀3hSave As &QS_saveDocumentAs:TU܀߀lmnoprsvw[\{Ȁ5/ހ݀3SNewQn\newDocument:bc〻mloprvsw-j{5Ȁ/3VRevert_revertDocumentToSaved:op耻lmnoprssvw-w{5/34{|}~}ZClear Menu_clearRecentDocuments:qlmnoprs vw{À5/U3lPreferences &*\NSWindowRect_NSUserInterfaceItemIdentifier]NSWindowTitleYNSMaxSize\NSWindowViewYNSMinSize_NSFrameAutosaveName_NSWindowContentMaxSize_NSWindowIsRestorable\NSScreenRect_NSWindowContentMinSize_NSWindowBackingYNSWTFlags]NSWindowClass[NSViewClass_NSWindowStyleMasknmo lpp8_{{396, 318}, {489, 386}}_Context Free PreferencesXNSWindow$%TViewZ{489, 386}Z{489, 386}2ʯ #,0592%AKEMX]a#FL*_NSCellBackgroundColor[NSProtoCell[NSCellClassZNSCellSizeYNSNumRowsYNSNumCols_NSIntercellSpacing^NSSelectedCell]NSMatrixFlagsVNSFontWNSCells"D( _{{207, 308}, {184, 58}}IH+, 2ʣ& $!q-4 * *4_NSPeriodicInterval]NSButtonFlags_NSAlternateContents_NSKeyEquivalent_NSAlternateImage_NSPeriodicDelay^NSButtonFlags2H?@ABvDEx# \controlColorJ?{LBM0.6666666667#()~XNSMatrixbcd-XNSMatrix( _{{34, 349}, {170, 17}} !#%$&)*'! @_When Context Free opens:>?@ABDEU#" &_controlTextColor&$+% _{{207, 246}, {190, 18}}B@(A & ($!--4 * *#('_Start rendering 02)XNSSwitch)()XNSButtonbcd-.-(# _{{17, 247}, {187, 17}} !#%$&)*,'!/_When a document is opened:31+2 _{{207, 90}, {264, 18}}>=+9 & ($!--4 * *0(4_'Include the variation code in file name76(0 _{{54, 91}, {150, 17}} !#%$&)*5'!8_When saving an image:;:( _{{54, 25}, {150, 17}} !#%$&)*9'!<\Editor Font:_{{207, 68}, {190, 18}}& ($!--4 * *2(?^Crop the image_{{96, 206}, {108, 17}}#$FD+E  !#%$&)*1%'!C_While rendering:_{{207, 205}, {220, 18}}56UT(K & ($!--4C * *A(G_Progressively update the image_{{207, 286}, {228, 18}}& $!--4M * *J_Check for updates (once a week)RSUNLSM _{{207, 154}, {190, 25}}\]YW(X & $ef!ghijkl4noDpq(suvZNSMaxValue_NSTickMarkPosition]NSAltIncValue_NSNumberOfTickMarks_NSAllowsTickMarkValuesOnlyZNSMinValueZNSVerticalWNSValueKO#@P##R#@$%yP234{|}8#@(QYHelvetica()\NSSliderCell-\NSSliderCell\NSActionCellVNSCell()XNSSliderbcd-XNSSlider_{{81, 165}, {123, 17}} !#%$&)*E'!V_Image border size:_{{193, 132}, {45, 14}}^\(]  !#%$&)M'[!Z@Xnegative23478#@"_{{259, 135}, {30, 11}}b`(a  !#%$&)X'[!_Tnone_{{316, 135}, {30, 11}}ed(5  !#%$&)]'[!cUfixed_{{368, 135}, {43, 11}} !#%$&)a'[!fXvariable_{{379, 14}, {96, 32}}& $!--  * @iVChangeZ{489, 386}()ccd-_{{0, 0}, {1680, 1050}}Z{489, 408}Z{489, 408}_PreferencesFrame()_NSWindowTemplate-_makeKeyAndOrderFront:svlmnoprs vw{À5/ut3_Hide Context FreeQhUhide:x{lmnoprs vw{À5/zy3_Quit Context FreeQqZterminate:}lmnoprs vw{5/u~3[Hide Others_hideOtherApplications:lmnoprs vw-&{À5/3XShow All_unhideAllApplications:+,lmnopqrs/vwx3{5/.367eFind &_performFindPanelAction:<=lmnoprs/vwCD{5/3_Jump to SelectionQj_centerSelectionInVisibleArea:JKlmnoprsNvwQR{5/3UVTCopyQcUcopy:\]lmnoprsNvwcd{5/3TUndoQzUundo:jklmnoprsNvwqr{5/3SCutQxTcut:x,lmnopqrs/vw{5/3_Use Selection for FindQe,lmnopqrs/vwL{5/3]Find PreviousQGlmnoprsNvw-{5/3VDeleteWdelete:,lmnopqrs/vw*{5/3YFind NextQglmnoprsNvw{5/3UPasteQvVpaste:lmnoprsNvw{5/3ZSelect AllQaZselectAll:lmnoprsNvw{5/3TRedoQZUredo:€lmnoprsvw{5/3iSpelling &Q:_showGuessPanel:āǀlmnoprsvw{5/Ɓŀ3^Check SpellingQ;^checkSpelling:Ɂˀlmnoprsvw-{5/ʀ3_Check Spelling as You Type_toggleContinuousSpellChecking:́πlmnoprstvw- {,5/΀3TZoom\performZoom:сԀlmnoprsvw-{Ҁ5/Ӏ3ׁkSave Image &ZsaveImage:!"ցـlmnoprsvw({Ҁ5/؁׀3VRenderQr\startRender:/0ہހlmnoprsvw67{Ҁ5/݁܀3^Stop renderingQ/]finishRender:=>※lmnoprsvw(E{Ҁ5/؁3oRender with dimensions &_showHiresRenderSheet:JL 总lmnoprs vw-S{À5/3oCheck for Update &_checkForUpdateNow:XYqlmnoprstvwQa{,5/3_Color Calculatoreahjlmo*pqrs1>0 /px_{{471, 451}, {337, 231}}$%wWNSPanel$%zTViewZ{338, 232}Z{337, 231}2~ʯE:Qh=bu z&*A\NSIsBordered[NSDragTypes >> 24$%_NSColor pasteboard type_{{265, 167}, {52, 24}}?BUNSRGBO"0.051575493 0.18616007 0.72906083#()[NSColorWellbcd-[NSColorWell(>> _{{126, 197}, {66, 14}} !#%$&)Á'B!BZSaturation(>> _{{194, 197}, {66, 14}} !#%$&)Á'B!ZBrightness(>> _{{20, 172}, {36, 14}} !#%$&)'B!BUStart(>> _{{20, 111}, {36, 14}} !#%$&)'B!UDelta (>> _{{20, 50}, {36, 14}} !#%$&) 'B! VFinish   (>> _{{58, 148}, {262, 14}} !#%$& )    'B!@_hue =234 sat =0.89 b =0.75  (>> _{{58, 87}, {262, 14}} !#%$& ) , 'B!_hue 3 sat -0.03 b 0A 0 3 6 >> 2 94 :$% >_NSColor pasteboard type_{{265, 45}, {52, 24}}? ABO0.058130499 0.055541899 1# D E(>> _{{58, 26}, {262, 14}} !#%$& ) R 'B!_hue =237 sat =0.86 b =0.75 U V W X Y Z [L ] ^ _D b c dYNSBoxType]NSTransparent]NSContentView_NSTitlePosition\NSBorderType[NSTitleCellYNSOffsets %>>"!2 fʡ ^ m nk_{{1, 1}, {295, 0}}_{{20, 82}, {297, 1}}V{0, 0}!#%$&), v w4'B$#SBoxJ? zLBM0 0.80000001#() } ~UNSBox }cd- ('(>> _{{58, 197}, {66, 14}} !#%$&) Á&'B!)SHue ,+(>> _{{262, 131}, {43, 14}} !#%$&) *'B!-BUStepsZ{337, 231}_{{0, 0}, {1680, 1050}}Z{337, 247}Z{338, 248} 35lmnoprsvw- {Ҁ5/43lSave as SVG &ZsaveAsSVG: 79lmnoprsvw- {Ҁ5/83oSave as Animation &\saveAsMovie: ;>lmnoprsvw {Ȁ5/=<3oUpload to Gallery &Qu_uploadToGallery: @Clmnoprsvw {Ҁ5/BA3]Repeat RenderQR]repeatRender:  E^setEditorFont: GImloprvtsw- {5,/H3_Close All WindowsYcloseAll:h +K_enterFullscreen: MQlmnopqrs vw {N5/P"dO3  a"dQ<^insertUnicode:  SQlmnopqrs vw   {N5/U"eT3a"eQ>  WQlmnopqrs vw   {N5/Y"`X3a"`Q= $ [Qlmnopqrs vw , -{N5/N &\3a & 1 ^Qlmnopqrs vw 8 9 :{N5/`_3aQ+ ? bQlmnopqrs vw F G H{N5/d"c3a"Qi M fQmloprv Rsw- U{5g/h3 X YZCF::Cyclic ] jQmloprv bsw- e{5k/l3 h i_CF::AllowOverlap m nQmloprv rsw- u{5o/p3 x y]CF::MiterJoin } rQmloprv Rsw- {5g/s3\CF::Dihedral uQmloprv Rsw- {5g/v3XCF::p11g xQmloprv Rsw- {5g/y3XCF::p11m {Qmloprv Rsw- {5g/|3XCF::p1m1 ~Qmloprv Rsw- {5g/3VCF::p2 Qmloprv Rsw- {5g/3XCF::p2mg Qmloprv Rsw- {5g/3XCF::p2mm Qmloprv Rsw- {5g/3VCF::pm Qmloprv Rsw- {5g/3VCF::pg Qmloprv Rsw- {5g/3VCF::cm Qmloprv Rsw- {5g/3WCF::pmm  Qmloprv Rsw- {5g/3WCF::pmg Qmloprv Rsw- {5g/3WCF::pgg  Qmloprv Rsw- !{5g/3WCF::cmm % Qmloprv Rsw- -{5g/3VCF::p4 1 Qmloprv Rsw- 9{5g/3WCF::p4m = Qmloprv Rsw- E{5g/3WCF::p4g I Qmloprv Rsw- Q{5g/3VCF::p3 U Qmloprv Rsw- ]{5g/3XCF::p3m1 a Qmloprv Rsw- i{5g/3XCF::p31m m Qmloprv Rsw- u{5g/3VCF::p6 y Qmloprv Rsw- {5g/3WCF::p6m Qmloprv bsw- {5k/3YCF::Alpha Qmloprv bsw- {5k/3^CF::Background Qmloprv bsw- {5k/3_CF::BorderDynamic Qmloprv bsw- {5k/3_CF::BorderFixed Qmloprv bsw- {5k/3YCF::Color ÁQmloprv bsw- {5k/Ā3^CF::ColorDepth ƁQmloprv bsw- {5k/ǀ3YCF::Frame ɁQmloprv bsw- {5k/ʀ3]CF::FrameTime ́Qmloprv bsw- {5k/̀3ZCF::Impure ρQmloprv bsw- {5k/Ѐ3_CF::MinimumSize ҁQmloprv bsw- {5k/Ӏ3XCF::Size ՁQmloprv bsw- {5k/ր3\CF::Symmetry  ؁Qmloprv bsw- {5k/ـ3XCF::Tile ! ہQmloprv bsw- ){5k/܀3XCF::Time - ށQmloprv rsw- 5{5o/߀3]CF::RoundJoin 9 Qmloprv rsw- A{5o/3]CF::BevelJoin E Qmloprv rsw- M{5o/3[CF::ButtCap Q Qmloprv rsw- Y{5o/3\CF::RoundCap ] Qmloprv rsw- e{5o/3]CF::SquareCap i Qmloprv rsw- q{5o/3YCF::ArcCW u Qmloprv rsw- }{5o/3\CF::ArcLarge Qmloprv rsw- {5o/3^CF::Continuous Qmloprv rsw- {5o/3YCF::Align Qmloprv rsw- {5o/3[CF::EvenOdd Qmloprv rsw- {5o/3\CF::IsoWidth Qmloprv Rsw- {5g/3 mloprv bsw- {5k/3^CF::MaxNatural^insertUnicode:  XNSMarkerVNSFile2_NSToolTipHelpKey_The image often does not fill the render dimensions. Cropping the image trims the white space, though still leaves a small border.() _NSIBHelpConnector -_NSIBHelpConnector  ΁A _`Update the window as the image is rendered. Slows rendering substantially, but looks very cool.  _NSNibBindingConnectorVersionYNSKeyPathYNSBinding    _NSSharedInstance  () _NSUserDefaultsController -_NSUserDefaultsController\NSController_fontName: values.EditorFontNameXfontName_values.EditorFontName() _NSNibBindingConnector -_NSNibBindingConnector^NSNibConnector  _NSPreviousConnector  _fontSize: values.EditorFontSizeXfontSize_values.EditorFontSize        "YColorCalc_value: deltaStepsUvalueZdeltaSteps     K _value: values.BorderSize_values.BorderSize       YNSOptions! _value: finishTextZfinishText2 % ' &"nS_&NSAllowsEditingMultipleValuesSelection    / 0 $%_value: finishColor[finishColor    8 9 '(_value: finishBrightness_finishBrightness h   A B *+_value: finishSaturation_finishSaturation Q   J K -._value: finishHueYfinishHue    R  T U 201_value: deltaTextYdeltaText2 Z \ &"nS :   c d 45_value: deltaBrightness_deltaBrightness    l m 78_value: deltaSaturation_deltaSaturation    u v z:;_value: deltaHueXdeltaHue    }    ?=>_value: startTextYstartText2  &"nS    AB_value: startColorZstartColor    uDE_value: startBrightness_startBrightness E   bGH_value: startSaturation_startSaturation    =JK_value: startHueXstartHue    MN_ value: values.CheckUpdatesWeekly_values.CheckUpdatesWeekly   A PQ_value: values.ProgressiveUpdate_values.ProgressiveUpdate   2 ST_value: values.SaveCropped_values.SaveCropped   0 VW_#value: values.SaveWithVariationCode_values.SaveWithVariationCode   ؀ Y[Z_ selectedTag: values.LaunchAction[selectedTag_values.LaunchAction   # ]^_"value: values.RenderOnDocumentOpen_values.RenderOnDocumentOpen2 C t X h     J*8FTb so NJ\j/+<x#$)   $ 1 ?12 R M }   %DE 1 = I U a m y N b ]  ! ` r m - 9 E Q ] i u n!/s= x#R5\  YEJ  :? QVhm D Fށ`b,́G+eÀ€knsxjr}siuȀǀ̀ҁ׀܀z;8āɁNMSW[^bgfrux{~kjÁƁɁ́ρҁՁ؁ہonށҁсցہ37@ #&,.03572>%BAFIKNEUMYX^]baeh9; >=@bduw&(   z|*,fC "a]NSApplication4dcXMainMenu2ʧ n xeulmnoprs vw- {YNSSubmenuXNSActionb5/Áfg3\Context Free^submenuAction:2ʬJ  ijkrs}sxlmnoprs vw--{]NSIsSeparator\NSIsDisabledÀ5 / 3lmnoprs vw--{À5 / 3lmnoprs vw- *+{À5/nlm3XServices^submenuAction:4123poq$%6XServices28ʠ__NSServicesMenulmnoprs vw--{À5 / 3lmnoprs vw--{À5 / 3\_NSAppleMenulmnoprs vw-TU{b5/ȁvw3TFile^submenuAction:$%[TFile2]ʪT *8Fb ܀ǁz̀Ҁ׀;lmnoprsvw-sop{Ȁ5/{|3[Open Recent^submenuAction:$%v[Open Recent2xʡo__NSRecentDocumentsMenulmnoprsvw--{Ȁ5 / 3lmnoprsvw--{Ȁ5 / 3lmnoprs vw-N{b5/3TEdit^submenuAction:$%TEdit2ʯ\jJ1)2N`#$lmnoprsNvw--{5 / 3lmoprsNvw--{5/  3mloprNsvw- {5/N3_Insert Character^submenuAction:2ʦ   $ 1 ?MSW[^bmloprNsvw- R X{5/g3_Insert Symmetry^submenuAction:2ʯ M }D E   % 1 = I U a m yfrux{~lmoprs Rvw--{g5/  3lmoprs Rvw--{g5/  3mloprNsvw- b h{5/k3_Insert Variable^submenuAction:2ʯ ]  !jÁƁɁ́ρҁՁ؁ۀmloprNsvw- r x4{5/o3[Insert Flag^submenuAction:29ʬ m - 9 E Q ] i u nށlmnoprsNvw--{5 / 3lmnoprsNvw-/VW{5/3TFind^submenuAction:$%]TFind2_ʥ+x<lmnoprsNvw-m{5/3XSpelling^submenuAction:2rʣāɀlmnoprs vw-~{b5/ҁׁ3^submenuAction:2ʨ! =/s ց@ہс37lmnoprsvw--{Ҁ5 / 3lmnoprs vw-t{b5/,3VWindow^submenuAction:2ʨ X  h̀G+lmnoprstvw--{,5 / 3lmnoprstvw--{,5 / 3^_NSWindowsMenulmnoprs vw-{b5/3^submenuAction:lmnoprs vw-{b5/893^submenuAction:[_NSMainMenuloprsvw-{5/3TMenu^submenuAction:2ʡہmloprvsw-{5/3TItemporl-vw{s5/3porl-vw{s5/3loprsvw--{5/  32C tttttttt              s  NNNNNN/////NNNNN$N) NN2 R R R R R R R R R R R R R R R R R R R R R R R R R RNN b b b b b b b b b b b b b b b bN` r r r r r r r r r r r r n x YE:Qhb,,,,,,,,beÀÀÁkÀÀÀÀÀÀÀÀÁbuȀȀȀȀȀȀȀȁzȀȁbbNNNNNNggggggggggggggggggggggggggkkkkkkkkkkkkkkkkoooooooooooobҁҁҁҁҁҁҁҁb#,052%AKEMX]a9>=>b>u>>&>>>>>> >z>>>>>>>>>>>* 2C t X h     J*8FTb so NJ\j/+<x#$)   $ 1 ?12 R M }   %DE 1 = I U a m y N b ]  ! ` r m - 9 E Q ] i u n!/s= x#R5\  YEJ  :? QVhm D F;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ɀ`b,́G+eÀ€knsxjr}siuȀǀ̀ҁ׀܀z;8āɁNMSW[^bgfrux{~kjÁƁɁ́ρҁՁ؁ہonށҁсցہ37@ #&,.03572>%BAFIKNEUMYX^]baeh9; >=@bduw&(   z|*,fC *7?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvxyz{|}~     ÁāŁƁǁȁɁʁˁ́́΁ρЁсҁӁԁՁցׁ؁فځہ܁݁ށ߁      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~VÁāŁƁǁȁɁʁˁ́́΁ρЁсҁӁԁՁցׁ؁فځہ܁݁ށ߁      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH       !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~2ʠ2C ()^NSIBObjectData-_NSKeyedArchiver]IB.objectdata"+5:?   # 0 B P l     ! * 5 > P W ` i r   !$'*-0369<?BEHKNQTWZ]`cfilorux{~  #&),/258;>ADGJMPSVY\_behknqtwz}#%')+<HW_abdfoxy{ 2DP^gqsuvxz|~  0<JTh| +7DRZ\^`bdk$-9DNUan   '),/2FHUdfhjr    "'013=NPRTVwy{|~ "iv} /=>@BDFHJLNPRTVWXZ\iq*>MVXYfo|~&(*+8:<>B_kw"+3<PWkw   `acegikmoqsuwyz{}"+89:<=JLNPW`ikmz|~   )+-/1RTVWY[]^v .024579;A        ( * , . ; D F H J L U W Y [ ] _ r y !!!!(!1!:!!K!M!O!Q!b!d!f!h!j!!!!!!!!!!!!!!!!!!!!!!!"" """#"%"'")"*"A"f"h"j"l"m"o"q"s"w"""""""""""""""""###### ###!###%#F#H#J#K#M#O#Q#R#j######################$$%$'$)$+$,$.$0$2$4${$|$~$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%% %%"%$%&%(%*%3%5%7%D%F%H%J%W%Y%[%]%~%%%%%%%%%%%%%%%%&&!&#&%&'&)&+&-&6&8&N&_&a&c&e&g&&&&&&&&&&&&&&&&&&'''''''!'.'1'4'6'>'@'N'[']'_'a''''''''''''''''''''''''((( ( (-(/(1(3(5(7(9(J(L(^(k(m(o(q(((((((((((((((((((((() )))) )A)C)E)G)I)K)M)^)`)c)f)i)t))))))))))))))*3*@*`*n*x*******+ ++%+1+E+G+I+K+N+P+S+V+X+Y+\+_+a+f+h+j+l+++++++++,,,, ,,,,,,, ,",%,(,+,.,1,4,6,8,:,,,,,,,,------ -"-%-(-+-.-1-4-6-;-=->-@-B-D-F-`-----------------. .".4.G.Y.h.j.s.x.z.|.~.................// //#/*/c/h/j/l/n/p/s/u/w////////////000000!0$0'00090<0?0A0J0O0R0U0X0Z0c0z0}06N6W6j6q66666666666667777777$797<7?7B7E7N7W7Z7]7_7h7m7p7s7v777=S=h=j=m=o=r=================>>1>4>6>8>;>>>A>F>a>v>x>{>}>>>>>>>>>>>>?? ????????R?T?V?Y?\?_?b?d?f?h?z????????????????????@@2@5@7@9@<@?@B@_@@@@@@@@@@@@@@@@@@@AA!A#A&A)A,A/A1A3A]AAAAAAAAAAAAAAAAAABBBB B"B$B&B(B)BABbBeBgBiBlBoBrBBBBBBBBBBBBC C2C5C8C9CC@CCCDCeChCjClCoCrCuCCCCCCCCCCCDDDDDDD!D#D%DFD`DDDDDDDDDDDDDDDDDDEE=E@ECEDEFEHEJEMENEEEEEEEEFF F FFF!F"F+F,F/F8FAFCFDFUF^F`FcFeFoFxFFFFFFFFFFGGGGGGGG4GMGrGuGxGyG{G}GGGGGGGGGGGGGGGGGGH"H%H(H)H+H-H/H2H3HTHWHYH\H_HbHeHjHHHHHHHHHHHHHHHHHHI I+I.I0I3I6I9IL@LMLPLSLUL`LzLLLLLLLLLLLLLLMMMM M+M.M0M2M5M8M:MGMJMMMOMTMVM\MiMlMoMqMMMMMMMMMMMMMMMMMMMMMMMMN NNNN8N;N=N?NBNENGN`NbNoNrNuNwNNNNNNNNNNNNNNNNNNNNOOOOO!O#OHOKOMOOOROUOWOaOcOpOsOvOxOOOOOOOOOOOOOOOOOOOOOPP PP!P$P'P)PJPMPOPQPTPWPYP^P`PfPsPvPyP{PPPPPPPPPPPPPPPPPPQQ Q"Q$Q'Q*Q,Q;Q=QLQYQ\Q_QaQQQQQQQQQQQQQRRRR R RRRR#R0R3R6R8RYR\R^R`RbReRgRtRwRzR|RRRRRRRRRRRRRRRRSS S SS/S2S4S6S9SSMSOS]SjSmSpSrSSSSSSSSSSSTTTT'T)T+T-T/T2T4TYTnTTTTTTTTTTTTTUUUUUUUU U#U&U)U,U5U8U;U=UXUaUcUkUtUvU{UUUUUUUUUUUUUUUUUUUUUUUUVVVVV1V>VJVMVPVQVRVUVWVYV\V]VfViVlVnVwVyVVVVVVVVWWW3W6W9W:WW@WAWZW{W~WWWWWWWWWWWWWWWWXXX X XXXXX@XCXFXGXIXKXMXNXfXXXXXXXXXXXXXXXXXXY Y YYYYYY YAYDYGYHYJYLYNYOYfYYYYYYYYYYYYYYYYYZZ ZZZZZZZ!Z>Z_ZbZeZfZhZjZlZmZZZZZZZZZZZZZZ[[[[[[[[[["[$[>[V[c[[[[[[[[[[[[[[[[[[\\L\V\d\r\\\\\\\\\\\\\\\\\\\\\\\]]]&]C]E]G]I]L]O]S]`]n]p]y]]]]]]]]]]]]]]]]]^^^%^(^+^,^.^0^2^3^L^m^p^r^t^w^z^}^^^^^^^^^^^^^^_____*_7_:_=_?_`_c_e_g_i_l_n_____________` ``"`/`2`5`7`X`[`]`_`b`e`g`u`w``````````````````aa aaaaa2a?aBaEaGalaoaqasavaya|a~aaaaaaaaaaaaaaaaaaaaabbb b b2b5b7b9bd@dMdPdSdUdcdpdsdvdxddddddddddddddddddddee e ee+e-e0e2e4e7e9eBeOeReUeWeteveye{e}eeeeeeeeeeeeeeeeeeefff f f ffff(f+f.f0fMfOfRfTfVfYf[fdfqftfwfyfffffffffffffffffffffgggg$g&g)g+g-g0g2g9gFgIgLgNgkgmgpgrgtgwgyggggggggggggggggggghhhhh hhh!h$h&hChEhHhJhLhOhQhYhfhihlhnhhhhhhhhhhhhhhhhhhhhhhhhiiii!i#i&i(i0i=i@iCiEibidigiiikinipiwiiiiiiiiiiiiiiiiiiiiiijj jjjjj;j=j@jBjDjGjIjPj]j`jcjejjjjjjjjjjjjjjjjjjjjjjjjkkkkkk k"k1k>kAkDkFkckekhkjklkokqkkkkkkkkkkkkkkkkkl l llllll!l.l1l4l6lSlUlXlZl\l_lalpl}llllllllllllllllllllllmmmmmm:m~A~D~G~J~M~P~u~~Āǀʀ̀ЀӀրـ܀ހ  #&),/258;>ADGJMPSVY\_behknqtwz}Łȁˁ΁сԁׁځ݁ "%(+.1468:@CFHM\eglu͆φцӆՆ׆چ݆߆!:ceghjlmoqчԇև؇ڇ݇ 58;>ADGJMPSVY\_begĈLjɈˈ̈Έψшӈ .7DGJMPSVX} "%(+.147:=@BgjlnoqrtvϊҊԊ֊؊ۊފ 0369@CEHJMORTWY\^acegjloqtvy{~ÔŔȔʔ̔ΔДҔԔ֔ٔ۔ݔߔ /147:<>@CFILOQTVXZ]`cfilorux{~˜ŘȘ˘ΘјԘטژݘ "%(+.147:=@CFILORUX[^adgjmpsvy|ęǙʙ͙Йәؙ֙ڙܙޙ "%(+.147:=@CEGILORUXZ\^`bdfilorux{~Ěǚʚ̚ΚКҚ՚ؚۚޚ !$'*-0369ADGJMPSVY\_behknqtwzğǟʟ͟Пӟٟ֟ܟߟ !$'*-0369ADGJMPSVY\_behknqtwz}¡šȡˡΡѡԡסڡݡ "%(+.147:=@CFILORUX[^acfilorux{~âƢɢ̢ϢҢբآۢޢ  #&),/258;>ADGJMPSVY\_behknqtwz}£ţȣˣΣѣԣףڣݣ "%(+.147:=@CFILORUX[^adgjmpsvy|ĤǤʤͤФӤ֤٤ܤߤ !$'*-0369ADGJMPSVY\_behknqtwz}¦ŦȦ˦ΦѦԦצڦݦ "%(+.147:=@CFILORUX[^adgjmpsvy|ħǧʧͧЧӧ֧٧ܧߧ !$'*-0369 @interface GrammarTextView : NSTextView { } - (void)changeColor:(id)sender; @end contextfree-3.0.5+dfsg1.orig/src-osx/VariationFormatter.h0000644000175000017500000000312412076364074022030 0ustar brambram// VariationFormatter.h // this file is part of Context Free // --------------------- // Copyright (C) 2005 Mark Lentczner - markl@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // Mark Lentczner can be contacted at markl@glyphic.com or at // Mark Lentczner, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #import @interface VariationFormatter : NSFormatter { } + (int)minVariation; + (int)maxVariation; + (int)randomVariation; + (NSString*)stringForVariation:(int)v lowerCase:(BOOL)lowerCase; - (NSString *)stringForObjectValue:(id)obj; - (BOOL)getObjectValue:(id *)obj forString:(NSString *)string errorDescription:(NSString **)error; - (BOOL)isPartialStringValid:(NSString **)partialStringPtr proposedSelectedRange:(NSRangePointer)proposedSelRangePtr originalString:(NSString *)origString originalSelectedRange:(NSRange)origSelRange errorDescription:(NSString **)error; @end contextfree-3.0.5+dfsg1.orig/src-osx/Credits.html0000644000175000017500000000262312076364074020325 0ustar brambram

 

Written and Designed by:
Mark Lentczner
John Horigan

Based on CFDG by:
Chris Coyne

Context Free Copyright © 2005-2007 Mark Lentczner and John Horigan
CFDG Copyright © 2005 Chris Coyne
Anti-Grain Geometry library Copyright © 2002-2006 Maxim Shemanarev

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA

contextfree-3.0.5+dfsg1.orig/src-osx/UserDefaults.plist0000644000175000017500000000135612076364074021527 0ustar brambram CheckUpdatesWeekly HiresHeight 3000 HiresWidth 2000 HiresMinimumSize 0.3 LaunchAction 2 ProgressiveUpdate RenderOnDocumentOpen SaveCropped SaveWithVariationCode MovieLength 10.0 MoveLengthType 2 MovieZoom BorderSize 2.0 contextfree-3.0.5+dfsg1.orig/src-osx/GalleryUploader.h0000644000175000017500000000642712076364074021314 0ustar brambram// GalleryUploader.h // this file is part of Context Free // --------------------- // Copyright (C) 2007 Mark Lentczner - markl@glyphic.com // Copyright (C) 2008-2012 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // Mark Lentczner can be contacted at markl@glyphic.com or at // Mark Lentczner, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #import #import @class CFDGDocument; @class GView; @interface GalleryUploader : NSWindowController { CFDGDocument* mDocument; GView* mView; int mStatus; IBOutlet NSView* mContentView; IBOutlet NSView* mLicenseView; IBOutlet WebView* mCreativeCommonsWidget; IBOutlet NSView* mFormView; IBOutlet NSTextField* mUserNameField; IBOutlet NSTextField* mPasswordField; IBOutlet NSTextField* mTitleField; IBOutlet NSTextView* mNotesView; IBOutlet NSTextField* mFileField; IBOutlet NSTextField* mVariationField; IBOutlet NSMatrix* mCompressionMatrix; IBOutlet NSButton* mTiled; IBOutlet NSTextField* mLicenseName; IBOutlet NSButton* mLicenseImage; IBOutlet NSTextField* mSaveTileWidth; IBOutlet NSTextField* mSaveTileHeight; IBOutlet NSButton* mCropCheck; IBOutlet NSTextField* mWidthLabel; IBOutlet NSTextField* mHeightLabel; IBOutlet NSTextField* mMultLabel; IBOutlet NSView* mProgressView; IBOutlet NSProgressIndicator* mProgressBar; IBOutlet NSView* mDoneView; IBOutlet NSTextView* mMessage; IBOutlet NSButton* mRetryButton; NSURLConnection* mConnection; NSMutableData* mResponseBody; NSString* mDefccURI; NSString* mDefccName; NSString* mDefccImage; } - (id)initForDocument:(CFDGDocument*)document andView:(GView*)view; - (IBAction)show:(id)sender; - (IBAction)goToCreateAccount:(id)sender; - (IBAction)changeLicense:(id)sender; - (IBAction)updateLicense:(id)sender; - (IBAction)noChangeLicense:(id)sender; - (IBAction)licenseDetails:(id)sender; - (IBAction)upload:(id)sender; - (IBAction)cancel:(id)sender; - (IBAction)retry:(id)sender; - (void)webView:(WebView *)sender decidePolicyForNavigationAction:(NSDictionary *)actionInformation request:(NSURLRequest *)request frame:(WebFrame *)frame decisionListener:(id)listener; - (void) updateCCInfo; @end contextfree-3.0.5+dfsg1.orig/src-osx/qtCanvas.h0000644000175000017500000000335612076364074017777 0ustar brambram// qtCanvas.h // this file is part of Context Free // --------------------- // Copyright (C) 2006-2008 Mark Lentczner - markl@glyphic.com // Copyright (C) 2008-2011 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // Mark Lentczner can be contacted at markl@glyphic.com or at // Mark Lentczner, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #ifndef INCLUDE_QTCANVAS_H #define INCLUDE_QTCANVAS_H #include "aggCanvas.h" #import "BitmapImageHolder.h" @class NSString; @class NSError; class qtCanvas : public aggCanvas { public: qtCanvas(NSString* name, BitmapImageHolder* bits, int fps, int qual, bool mpeg4); ~qtCanvas(); NSError* getError() const; void enterThread(); void exitThread(); void end(); private: class Impl; Impl& impl; qtCanvas& operator=(qtCanvas& c) { return c; } }; #endif // INCLUDE_QTCANVAS_H contextfree-3.0.5+dfsg1.orig/src-osx/KFSplitView.h0000644000175000017500000000474012076364074020364 0ustar brambram// // KFSplitView.h // KFSplitView v. 1.3, 11/27/2004 // // Copyright (c) 2003-2004 Ken Ferry. Some rights reserved. // http://homepage.mac.com/kenferry/software.html // // This work is licensed under a Creative Commons license: // http://creativecommons.org/licenses/by-nc/1.0/ // // Send me an email if you have any problems (after you've read what there is to read). // // You can reach me at kenferry at the domain mac.com. #import @interface KFSplitView:NSSplitView { // retained NSMutableSet *kfCollapsedSubviews; NSMutableArray *kfDividerRects; NSString *kfPositionAutosaveName; NSCursor *kfIsVerticalResizeCursor; NSCursor *kfNotIsVerticalResizeCursor; // not retained NSCursor *kfCurrentResizeCursor; NSUserDefaults *kfDefaults; NSNotificationCenter *kfNotificationCenter; BOOL kfIsVertical; id kfDelegate; } // sets the collapse-state of a subview, which is completely independent // of that subview's frame (as in NSSplitView). (Sometime) after calling this // you'll need to tell the splitview to resize its subviews. // Normally, that would be this call: // [kfSplitView resizeSubviewsWithOldSize:[kfSplitView bounds].size]; - (void)setSubview:(NSView *)subview isCollapsed:(BOOL)flag; // To find documentation for these methods refer to Apple's NSWindow // documentation for the corresponding methods (e.g. -setFrameAutosaveName:). // To use an autosave name, call -setPositionAutosaveName: from the -awakeFromNib // method of a controller. + (void)removePositionUsingName:(NSString *)name; - (void)savePositionUsingName:(NSString *)name; - (BOOL)setPositionUsingName:(NSString *)name; - (BOOL)setPositionAutosaveName:(NSString *)name; - (NSString *)positionAutosaveName; - (void)setPositionFromPlistObject:(id)string; - (id)plistObjectWithSavedPosition; @end @interface NSObject(KFSplitViewDelegate) // in notification argument 'object' will be sender, 'userInfo' will have key @"subview" - (void)splitViewDidCollapseSubview:(NSNotification *)notification; - (void)splitViewDidExpandSubview:(NSNotification *)notification; - (void)splitView:(id)sender didDoubleClickInDivider:(int)index; - (void)splitView:(id)sender didFinishDragInDivider:(int)index; @end // notifications: 'object' will be sender, 'userInfo' will have key @"subview". // The delegate is automatically registered to receive these notifications. extern NSString *KFSplitViewDidCollapseSubviewNotification; extern NSString *KFSplitViewDidExpandSubviewNotification; contextfree-3.0.5+dfsg1.orig/src-osx/widget-style.css0000644000175000017500000000746212076364074021203 0ustar brambram/** * This was written by CC as a demonstration of how to interoperate * with the Creative Commons JsWidget. No rights reserved. * * See README for a little more detail. */ /** Edit me to fit your particular look **/ #cc_js_lic-menu { margin: 0 auto; } .cc_js_body { background-color: #fff; color: #343434; font: 71%/145% "Lucida Grande", verdana, sans-serif; padding: 0; margin: 0; text-align: center; } #cc_js_header-main { width: 93%; min-width: 700px; margin: 0 3%; padding: 10px 0 2px 1%; text-align: left; font-size: 11px !important; } /* -- elements */ a.cs_js_a, a:link.cs_js_a { text-decoration: none; color: #00b; } a:hover.cs_js_a { text-decoration: underline; } /** * This was written by CC as a demonstration of how to interoperate * with the Creative Commons JsWidget. No rights reserved. * * See README for a little more detail. */ #cc_js_license_selected { border: 1px solid #c2e0cf; text-align: center; padding: 3%; margin-bottom: 0; } #cc_js_jurisdiction_box { /* border: 1px solid black; */ padding: 0.5% 2% 1% 2%; margin-bottom: 1%; } #cc_js_lic-menu h2 { /* text-decoration: underline; */ /* border-bottom: 1px solid black; */ padding: 3% 0 1% 0; border: none; } #cc_js_lic-result { padding: 0; margin: 0; } select#cc_js_jurisdiction { margin-bottom: 2%; } textarea#cc_js_result { width: 9%; border: 1px solid #ccc; color: gray; margin-top: 1%; } a.cc_js_a img { border: none; text-decoration: none; } #cc_js_more_info { border: 1px solid #eee; padding: 0.5% 2% 1% 2%; margin-bottom: 1%; margin-top: 1%; width: 87%; } #cc_js_more_info table { width: 65%; } #cc_js_more_info .header { width: 35%; } #cc_js_more_info input { width: 100%; border: 1px solid #ccc; } #cc_js_required { padding: 4% 2%; margin-bottom: -30px; margin-top: 10px; /* background: #efefef; background: #eef6e6;*/ } #cc_js_work_title { font-style: italic; } #cc_js_optional { border: 1px solid #eee; padding: 0.5% 2% 1% 2%; margin-bottom: 1%; margin-top: 1%; width: 87%; } .cc_js_cc-button { padding-bottom: 1%; } .cc_js_info { vertical-align: middle; } img.cc_js_info { float: right; } #cc_js_jurisdiction_box { clear: left; } #cc_js_lic-menu p{ padding: 3px 0 5px 0; margin: 0 0 5px 0; } .cc_js_tooltip { background: white; border: 2px solid gray; padding: 3px 10px 3px 10px; width: 300px; text-align: left; } .cc_js_tooltip .cc_js_icon { float: left; padding-right: 4%; padding-bottom: 20%; } .cc_js_tooltipimage { border: 2px solid gray; } .cc_js_infobox { cursor: help; } .cc_js_question { cursor: help; /*color: #00b;*/ border-bottom: 1px dashed #66b; } .cc_js_hidden { display: none; } #cc_js_required .cc_js_question { border: none; } #cc_js_want_cc_license_at_all { padding: 0; padding-left: 0; } #cc_js_want_cc_license_at_all span { padding: 0.25em; display: block; } #cc_js_want_cc_license_at_all span span { margin: 0; padding: 0; display: inline; } #cc_js_required p { padding-bottom: 26px; } #cc_js_remix-label span { background: url('http://creativecommons.org/images/deed/remix.png') no-repeat top left; padding-left: 60px; padding-bottom: 20px; padding-top: 15px; } #cc_js_nc-label span { background: url('http://creativecommons.org/images/deed/nc.png') no-repeat top left; padding-left: 60px; padding-bottom: 20px; padding-top: 15px; } #cc_js_sa-label span { background: url('http://creativecommons.org/images/deed/sa.png') no-repeat top left; padding-left: 60px; padding-bottom: 20px; padding-top: 15px; } contextfree-3.0.5+dfsg1.orig/src-osx/doc.icns0000644000175000017500000012376212076364074017475 0ustar brambramicnsics#H????????????????????????????????is32 p οj ̴p[ ׺۫~zr ĵ}κ ےƯ ĨkÁ Ё ڲ ԯ ϫٻi[ p οj ̴p[ ׺۫~zr ĵ}κ ےƯ ĨkÁ Ё ڲ ԯ ϫٻi[ p οj ̴p[ ׺۫~zr ĵ}κ ےƯ ĨkÁ Ё ڲ ԯ ϫٻi[s8mk%<999'9?9H 9I9N9N9N.9}>9u9N;P=Cit32cׁՀȿՀԁǙҀ\тU UffNN½NſNĿN ľ NľNօſNքſN΅ϿÿNԁ(¾|xwNԀ*÷{{xrqf(̿ƿ¼yrn f(ʽֱʤŽwni f)ϼѫϸƿwlb f)̽İ̶Ըȿn`Z f׀(Ԥʳ͹¯ʺƿ|kgf̈́ f>ƺШĺy~ytkͮU׌@ſºttäùypyqjdbacgnu~U؂CȿŴʰȮֳyxqkhghjou|X؂؅Cķſ¶Ōʧϯĭҽztqnnptx~\فEǺ˫¬ϳʞ~{yxyz~aق:ƻcã̙RrĘx׿yʿkT·yŴhʼ͸SϻľlʻvӼ½ΥWúů»}ɾŢrեTïwbŨúfեFѺɧĿǫs}~otŇ{h}ɿ եˀNѼ˖{{bͶեWʾȹ̮Ĺݵ˫vj]ϽեBƴϷȽ͋з{yNfʴрե6öȸצʾLftɿˀɲ֥R˷̽mŻb}ɷւץ6ĿʽquuŽ_nʀȐԀՁץIǸwgs|YşſՀրץHê\|Úwxmrֽ½փԁץĿǻtԻmBRXeہ̕ֆցץ)ԿLJt՚KXa]ƦºՒץ܀ ׀'øšsӕojIDŽ{źրؐץ#˽͡zm׽od|߀ sùڀ؎ե #Ǥxsk~N߯Źۀڀ؍֥0ſ˥i^afȫu۵Wۀڀ؍ץ/νɢ]9om^ۀڀ،ץ%Ƹеr?yڗ_̽݁ۀڀ؋ץ˼ϺHv۶Eĵځ݀ۀـ؉֥֚GIܱpE Kb}{ϥ-Ӥz|qB̩fy^ڥ'|R{S\bssڥAw/u.9{ʾĺڥ Ez9q|ıڥWٯO;pڥ@WYڥWVGڥ $aDڥ ^[ڥ=ڥ-ڥ8݀ڥ2݀ڥ&ڥڥ3ڥ/ڥ#ڥ  ݀ۀڥ٥$٥ׁՀȿՀԁǙҀ\тU UffNN½NſNĿN ľ NľNօſNքſN΅ϿÿNԁ(¾|xwNԀ*÷{{xrqf(̿ƿ¼yrn f(ʽֱʤŽwni f)ϼѫϸƿwlb f)̽İ̶Ըȿn`Z f׀(Ԥʳ͹¯ʺƿ|kgf̈́ f>ƺШĺy~ytkͮU׌@ſºttäùypyqjdbacgnu~U؂CȿŴʰȮֳyxqkhghjou|X؂؅Cķſ¶Ōʧϯĭҽztqnnptx~\فEǺ˫¬ϳʞ~{yxyz~aق:ƻcã̙RrĘx׿yʿkT·yŴhʼ͸SϻľlʻvӼ½ΥWúů»}ɾŢrեTïwbŨúfեFѺɧĿǫs}~otŇ{h}ɿ եˀNѼ˖{{bͶեWʾȹ̮Ĺݵ˫vj]ϽեBƴϷȽ͋з{yNfʴрե6öȸצʾLftɿˀɲ֥R˷̽mŻb}ɷւץ6ĿʽquuŽ_nʀȐԀՁץIǸwgs|YşſՀրץHê\|Úwxmrֽ½փԁץĿǻtԻmBRXeہ̕ֆցץ)ԿLJt՚KXa]ƦºՒץ܀ ׀'øšsӕojIDŽ{źրؐץ#˽͡zm׽od|߀ sùڀ؎ե #Ǥxsk~N߯Źۀڀ؍֥0ſ˥i^afȫu۵Wۀڀ؍ץ/νɢ]9om^ۀڀ،ץ%Ƹеr?yڗ_̽݁ۀڀ؋ץ˼ϺHv۶Eĵځ݀ۀـ؉֥֚GIܱpE Kb}{ϥ-Ӥz|qB̩fy^ڥ'|R{S\bssڥAw/u.9{ʾĺڥ Ez9q|ıڥWٯO;pڥ@WYڥWVGڥ $aDڥ ^[ڥ=ڥ-ڥ8݀ڥ2݀ڥ&ڥڥ3ڥ/ڥ#ڥ  ݀ۀڥ٥$٥ׁՀȿՀԁǙҀ\тU UffNN½NſNĿN ľ NľNօſNքſN΅ϿÿNԁ(¾|xwNԀ*÷{{xrqf(̿ƿ¼yrn f(ʽֱʤŽwni f)ϼѫϸƿwlb f)̽İ̶Ըȿn`Z f׀(Ԥʳ͹¯ʺƿ|kgf̈́ f>ƺШĺy~ytkͮU׌@ſºttäùypyqjdbacgnu~U؂CȿŴʰȮֳyxqkhghjou|X؂؅Cķſ¶Ōʧϯĭҽztqnnptx~\فEǺ˫¬ϳʞ~{yxyz~aق:ƻcã̙RrĘx׿yʿkT·yŴhʼ͸SϻľlʻvӼ½ΥWúů»}ɾŢrեTïwbŨúfեFѺɧĿǫs}~otŇ{h}ɿ եˀNѼ˖{{bͶեWʾȹ̮Ĺݵ˫vj]ϽեBƴϷȽ͋з{yNfʴрե6öȸצʾLftɿˀɲ֥R˷̽mŻb}ɷւץ6ĿʽquuŽ_nʀȐԀՁץIǸwgs|YşſՀրץHê\|Úwxmrֽ½փԁץĿǻtԻmBRXeہ̕ֆցץ)ԿLJt՚KXa]ƦºՒץ܀ ׀'øšsӕojIDŽ{źրؐץ#˽͡zm׽od|߀ sùڀ؎ե #Ǥxsk~N߯Źۀڀ؍֥0ſ˥i^afȫu۵Wۀڀ؍ץ/νɢ]9om^ۀڀ،ץ%Ƹеr?yڗ_̽݁ۀڀ؋ץ˼ϺHv۶Eĵځ݀ۀـ؉֥֚GIܱpE Kb}{ϥ-Ӥz|qB̩fy^ڥ'|R{S\bssڥAw/u.9{ʾĺڥ Ez9q|ıڥWٯO;pڥ@WYڥWVGڥ $aDڥ ^[ڥ=ڥ-ڥ8݀ڥ2݀ڥ&ڥڥ3ڥ/ڥ#ڥ  ݀ۀڥ٥$٥t8mk@`  '2":&?'B'B'B'B'B'B'B'B'B'B'B'B'B'B'B'B'B'B'B'B'B'B'B['B'B 'B'B'B' 'B1 'B9!'B>$'BA&'BA''BB''BB''BB''BB' 'BD) 'BH. 'BE.  'BB*"'BC* ''BE+'BF,!'BC( ! 'BD) %"'BF+ 3'BG. :'BF- 8%'BE* < 'BC(   @)'BB' /C'BB'   I 'BB' :B'CB' )U'FB'Y&'GB' T.'KB' U2'IB'"#X2'FB' #5^0'HB'$?f7'DB' K[ 'BB' ]{ 'BB''l\'CB' >H'FB'dx:'EB'oU-'CB' JyC('CB'-]Z4 'BB'x<0'BB'cLR3+'BB't;6$ 'BB'rC=20'BB'dG04#'BB(]F<280'BB(1*U=,;5#'BB'41@>*'BB'pxM{93BD2'B|O"2HJ5'BHG$4FD8 'BY-6EHB+'B[QGOPB('BlgZG3! 'BeL''BsG('BY1'BF)'BB''BB''BB''BB''BB''BB''BB''BB''BB''BB''BB''BB''BB''BB''BB''BB''BB''BB''BB''BB''BB''BB''Bc}}cB'&?^xx^?&":WmmW:"2K^nx}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}xn^K2 ';JW^cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc^WJ;' '2:?BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB?:2' "&''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''&"   contextfree-3.0.5+dfsg1.orig/src-osx/BitmapImageHolder.h0000644000175000017500000000531412076364074021530 0ustar brambram// BitmapImageHolder.h // this file is part of Context Free // --------------------- // Copyright (C) 2009-2012 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #ifndef _H_BitmapImageHolder #define _H_BitmapImageHolder @class NSString; @class NSMutableData; @class NSBitmapImageRep; @interface BitmapImageHolder : NSObject { // Attributes NSString* _colorSpace; BOOL _hasAlpha; int _bitsPerSample; int _pixelsWide; int _pixelsHigh; unsigned int _bytesPerRow; unsigned int _bitsPerPixel; unsigned int _samplesPerPixel; BOOL _isPlanar; unsigned char *_imagePlanes[5]; NSMutableData *_imageData; } // // Allocating and Initializing a New BitmapImageHolder Object // - (id) initWithBitmapDataPlanes: (unsigned char**)planes pixelsWide: (NSInteger)width pixelsHigh: (NSInteger)height bitsPerSample: (NSInteger)bps samplesPerPixel: (NSInteger)spp hasAlpha: (BOOL)alpha isPlanar: (BOOL)isPlanar colorSpaceName: (NSString*)colorSpaceName bytesPerRow: (NSInteger)rowBytes bitsPerPixel: (NSInteger)pixelBits; // // Getting Information about the Image // - (int) bitsPerPixel; - (int) samplesPerPixel; - (BOOL) isPlanar; - (int) numberOfPlanes; - (int) bytesPerPlane; - (int) bytesPerRow; - (int) bitsPerSample; - (NSString *) colorSpaceName; - (BOOL) hasAlpha; - (int) pixelsHigh; - (int) pixelsWide; // // Getting Image Data // - (unsigned char*) bitmapData; - (void) getBitmapDataPlanes: (unsigned char**)data; // // Getting an NSBitmapImageReps // - (NSBitmapImageRep*) newImageRep; - (NSBitmapImageRep*) getImageRep; - (NSBitmapImageRep*) getImageRepCropped: (NSRect)cropRect; @end #endif // _H_BitmapImageHolder contextfree-3.0.5+dfsg1.orig/src-osx/GView.mm0000644000175000017500000010663512076364074017426 0ustar brambram// GView.mm // this file is part of Context Free // --------------------- // Copyright (C) 2005-2007 Mark Lentczner - markl@glyphic.com // Copyright (C) 2007-2012 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // Mark Lentczner can be contacted at markl@glyphic.com or at // Mark Lentczner, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #import "GView.h" #import "CFDGDocument.h" #import "VariationFormatter.h" #import "TopBar.h" #import "BitmapImageHolder.h" #include "cfdg.h" #include "SVGCanvas.h" #include "ImageCanvas.h" #include "qtCanvas.h" #include "tiledCanvas.h" #include "Rand64.h" // Provide the forward-declarations of new 10.7 SDK symbols so they can be // called when building with the 10.5 SDK. #if !defined(MAC_OS_X_VERSION_10_7) || \ MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_7 @interface NSWindow (LionSDKDeclarations) - (void)toggleFullScreen:(id)sender; @end enum { NSWindowCollectionBehaviorFullScreenPrimary = 1 << 7, NSWindowCollectionBehaviorFullScreenAuxiliary = 1 << 8 }; enum { NSWindowFullScreenButton = 7 }; enum { NSFullScreenWindowMask = 1 << 14 }; #endif // MAC_OS_X_VERSION_10_7 //#define PROGRESS_ANIMATE_DIRECTLY //#define USE_SAVE_GRAPHICS_STATE //#define TIME_AND_LOG_RENDER #define UPDATE_RATE (1.0/12.0) #define PROGRESS_DELAY 12 @interface BitmapAndFormat : BitmapImageHolder { aggCanvas::PixelFormat _aggPixFmt; } - (id) initWithAggPixFmt: (aggCanvas::PixelFormat)fmt pixelsWide: (NSInteger)width pixelsHigh: (NSInteger)height; - (aggCanvas::PixelFormat) aggPixelFormat; @end @implementation BitmapAndFormat - (id) initWithAggPixFmt: (aggCanvas::PixelFormat)fmt pixelsWide: (NSInteger)width pixelsHigh: (NSInteger)height { int bps = (fmt & aggCanvas::Has_16bit_Color) + 8; switch (fmt) { case aggCanvas::RGBA8_Blend: case aggCanvas::RGBA16_Blend: self = [super initWithBitmapDataPlanes: NULL pixelsWide: width pixelsHigh: height bitsPerSample: bps samplesPerPixel: 4 hasAlpha: YES isPlanar: NO colorSpaceName: NSCalibratedRGBColorSpace bytesPerRow: 0 bitsPerPixel: 0]; break; case aggCanvas::RGB8_Blend: case aggCanvas::RGB16_Blend: self = [super initWithBitmapDataPlanes: NULL pixelsWide: width pixelsHigh: height bitsPerSample: bps samplesPerPixel: 3 hasAlpha: NO isPlanar: NO colorSpaceName: NSCalibratedRGBColorSpace bytesPerRow: 0 bitsPerPixel: 0]; break; case aggCanvas::Gray8_Blend: case aggCanvas::Gray16_Blend: self = [super initWithBitmapDataPlanes: NULL pixelsWide: width pixelsHigh: height bitsPerSample: bps samplesPerPixel: 1 hasAlpha: NO isPlanar: NO colorSpaceName: NSCalibratedWhiteColorSpace bytesPerRow: 0 bitsPerPixel: 0]; break; default: return nil; } if (!self) return self; _aggPixFmt = fmt; return self; } - (aggCanvas::PixelFormat) aggPixelFormat { return _aggPixFmt; } @end @interface GView (internal) - (void)drawCheckerboardRect:(NSRect)rect; - (void)buildEngine; - (void)buildRendererSize:(NSSize)size minimum:(double)minSize; - (void)buildImageCanvasSize; - (void)invalidateDrawingImage; - (void)validateDrawingImage; - (void)redisplayImage:(NSValue*)sizeObj; - (void)noteProgress; - (void)requestRenderUpdate; - (void)showSavePanelTitle:(NSString *)title fileType:(NSString *)fileType accessoryView:(NSView *)view didEndSelector:(SEL)selector; - (void)savePanelDidEnd:(NSSavePanel *)sheet returnCode:(int)result contextInfo:(void *)ctx; - (void)saveImage:(bool)save toFile:(NSString*)filename; - (void)saveTileImage:(bool)save toFile:(NSString*)filename; - (void)saveSvg:(bool)save toFile:(NSString*)filename; - (void)saveMovie:(bool)save toFile:(NSString*)filename; - (void)deleteRenderer; + (void)rendererDeleteThread:(id)arg; @end namespace { NSString* saveImageDirectory = nil; NSString* PrefKeyMovieZoom = @"MovieZoom"; NSString* PrefKeyMovieLength = @"MovieLength"; NSString* PrefKeyMovieFrameRate = @"MovieFrameRate"; NSString* PrefKeyMovieFormat = @"MovieFormat"; NSString* PrefKeyMovieQuality = @"MovieQuality"; class RenderParameters { public: bool render; bool periodicUpdate; bool animate; bool animateZoom; int animateFrameCount; RenderParameters() : render(true), periodicUpdate(true), animate(false) { } }; } @interface GView (renderThread) - (void) renderBegin:(RenderParameters*)parameters; - (void) renderThread:(id)arg; - (void) renderStopped:(id)arg; // sent by thread @end @implementation GView - (id)initWithFrame:(NSRect)frame { self = [super initWithFrame:frame]; if (self) { mEngine = 0; mRenderer = 0; mCanvas = 0; mRenderBitmap = nil; mDrawingImage = nil; mRestartRenderer = false; mUpdateTimer = nil; mRendering = false; mRestartRenderer = false; mRendererFinishing = false; mRendererStopping = false; mLastRenderWasHires = false; mCloseOnRenderStopped = false; mCurrentVariation = 0; mIncrementVariationOnRender = false; mAnimationCanvas = 0; mTiled = false; mFullScreenMenu = nil; } return self; } - (void)awakeFromNib { [mSaveImageAccessory retain]; [mSaveTileAccessory retain]; [mSaveAnimationAccessory retain]; [mDocument retain]; [self initializeVariation]; NSNumber* one = [NSNumber numberWithInt: 1]; NSNumber* hundred = [NSNumber numberWithInt: 100]; NSNumberFormatter* fmt = [mSaveTileWidth formatter]; [fmt setMinimum: one]; [fmt setMaximum: hundred]; fmt = [mSaveTileHeight formatter]; [fmt setMinimum: one]; [fmt setMaximum: hundred]; [mSaveTileWidth setFloatValue: 1.0]; [mSaveTileHeight setFloatValue: 1.0]; NSWindow* window = [self window]; if ([window respondsToSelector:@selector(toggleFullScreen:)]) { NSWindowCollectionBehavior behavior = [window collectionBehavior]; behavior |= NSWindowCollectionBehaviorFullScreenPrimary; [window setCollectionBehavior:behavior]; NSButton* fullscreenButton = [window standardWindowButton:NSWindowFullScreenButton]; [fullscreenButton setAction:@selector(enterFullscreen:)]; [fullscreenButton setTarget:self]; NSMenuItem* winMenu = [[NSApp mainMenu] itemWithTitle: @"Window"]; mFullScreenMenu = [[winMenu submenu] itemWithTag: (NSInteger)420]; } [window setDelegate: self]; } - (void)windowDidBecomeMain:(NSNotification *)notification { [self updateFullScreenMenu]; } - (void)windowDidEnterFullScreen:(NSNotification *)notification { [self updateFullScreenMenu]; } - (void)windowDidExitFullScreen:(NSNotification *)notification { [self updateFullScreenMenu]; } - (BOOL)windowShouldClose:(id)sender { if (mRendering && mRenderer) { mRenderer->requestStop = true; mCloseOnRenderStopped = true; return NO; } return YES; } - (void)updateFullScreenMenu { NSUInteger masks = [[self window] styleMask]; if (masks & NSFullScreenWindowMask) { [mFullScreenMenu setTitle: @"Exit Full Screen"]; } else { [mFullScreenMenu setTitle: @"Enter Full Screen"]; } } - (void)dealloc { [self deleteRenderer]; [mDocument release]; mDocument = nil; [mDrawingImage release]; mDrawingImage = nil; [mRenderBitmap release]; mRenderBitmap = nil; [mUpdateTimer release]; mUpdateTimer = nil; [mSaveImageAccessory release]; mSaveImageAccessory = nil; [mSaveTileAccessory release]; mSaveTileAccessory = nil; [mSaveAnimationAccessory release]; mSaveAnimationAccessory = nil; [super dealloc]; } - (IBAction)enterFullscreen:(id)sender { [[self window] toggleFullScreen: nil]; } - (BOOL)isOpaque { return YES; } - (void)drawRect:(NSRect)rect { [self validateDrawingImage]; if (!mDrawingImage) { [[NSColor whiteColor] set]; [NSBezierPath fillRect: rect]; return; } agg::rgba backgroundColor(1.0, 1.0, 1.0, 1.0); if (mEngine && mRenderer) backgroundColor = mEngine->getBackgroundColor(0); if (backgroundColor.opacity() < 1.0) { [self drawCheckerboardRect: rect]; } [[NSColor colorWithCalibratedRed: backgroundColor.r green: backgroundColor.g blue: backgroundColor.b alpha: backgroundColor.a ] set]; [NSBezierPath fillRect: rect]; NSGraphicsContext* ctx = [NSGraphicsContext currentContext]; NSImageInterpolation oldInterp = [ctx imageInterpolation]; [ctx setImageInterpolation: [self inLiveResize] ? NSImageInterpolationNone #if 0 : NSImageInterpolationHigh #else : NSImageInterpolationDefault #endif ]; NSSize fSize = [self frame].size; NSSize rSize = mRenderedRect.size; float scale; if (rSize.width <= fSize.width && rSize.height <= fSize.height) { // rendered area fits within frame, center it scale = 1.0f; } else { float wScale = fSize.width / rSize.width; float hScale = fSize.height / rSize.height; scale = (hScale < wScale) ? hScale : wScale; } NSRect dRect; // center scaled image rectangle dRect.size.width = rSize.width * scale; dRect.size.height = rSize.height * scale; float ox = dRect.origin.x = floorf((fSize.width - dRect.size.width) / 2.0f); float oy = dRect.origin.y = floorf((fSize.height - dRect.size.height) / 2.0f); if (mTiled && scale == 1.0f) { tileList points; mRenderer->m_tiledCanvas->getTesselation(points, fSize.width, fSize.height, ox, oy); for (tileList::reverse_iterator pt = points.rbegin(); pt != points.rend(); ++pt) { NSPoint dPoint; dPoint.x = (float)pt->x; dPoint.y = (float)pt->y; if (backgroundColor.opacity() < 1.0) { NSRect cRect = dRect; cRect.origin = dPoint; // redraw checkerboard to erase global fill [self drawCheckerboardRect: NSIntersectionRect(cRect, rect)]; } [mDrawingImage drawAtPoint: dPoint fromRect: NSZeroRect operation: NSCompositeSourceAtop fraction: 1.0]; } NSRect boxRect = NSInsetRect(dRect, -0.5, -0.5); [[NSColor colorWithDeviceWhite: 0.0 alpha: 0.35 ] set]; [NSBezierPath strokeRect: boxRect]; boxRect = NSInsetRect(dRect, -1.5, -1.5); [[NSColor colorWithDeviceWhite: 1.0 alpha: 0.75 ] set]; [NSBezierPath strokeRect: boxRect]; } else { if (backgroundColor.opacity() < 1.0) { // redraw checkerboard to erase global fill [self drawCheckerboardRect: NSIntersectionRect(dRect, rect)]; } [mDrawingImage drawInRect: dRect fromRect: NSZeroRect operation: NSCompositeSourceAtop fraction: 1.0]; } [ctx setImageInterpolation: oldInterp]; } - (void)viewDidEndLiveResize { [super viewDidEndLiveResize]; [self setNeedsDisplay:YES]; } - (IBAction)toggleRender:(id)sender { if (mRendering) [self finishRender: sender]; else [self startRender: sender]; } - (IBAction)saveImage:(id)sender { if (mTiled) { [self saveTileImage: sender]; } else { [self showSavePanelTitle: NSLocalizedString(@"Save Image", @"") fileType: @"png" accessoryView: mSaveImageAccessory didEndSelector: @selector(saveImage:toFile:)]; } } - (IBAction)saveTileImage:(id)sender { CFDG::frieze_t frz = mEngine->isFrieze(); switch (frz) { case CFDG::no_frieze: [mSaveTileWidth setEnabled: YES]; [mSaveTileHeight setEnabled: YES]; break; case CFDG::frieze_x: [mSaveTileHeight setFloatValue: 1.0]; [mSaveTileWidth setEnabled: YES]; [mSaveTileHeight setEnabled: NO]; break; case CFDG::frieze_y: [mSaveTileWidth setFloatValue: 1.0]; [mSaveTileWidth setEnabled: NO]; [mSaveTileHeight setEnabled: YES]; break; } [self showSavePanelTitle: NSLocalizedString(@"Save Image", @"") fileType: @"png" accessoryView: mSaveTileAccessory didEndSelector: @selector(saveTileImage:toFile:)]; } - (IBAction)saveAsSVG:(id)sender { [self showSavePanelTitle: NSLocalizedString(@"Save as SVG", @"") fileType: @"svg" accessoryView: nil didEndSelector: @selector(saveSvg:toFile:)]; } - (IBAction)saveAsMovie:(id)sender { [self showSavePanelTitle: NSLocalizedString(@"Save as Animation", @"") fileType: @"mov" accessoryView: mSaveAnimationAccessory didEndSelector: @selector(saveMovie:toFile:)]; } - (BOOL)validateMenuItem:(NSMenuItem *)anItem; { SEL action = [anItem action]; if (action == @selector(startRender:)) return !mRestartRenderer; if (action == @selector(enterFullscreen:)) return YES; if (action == @selector(showHiresRenderSheet:) || action == @selector(repeatRender:)) return !mRendering; if (action == @selector(finishRender:)) return mRendering && !mRendererFinishing && !mRendererStopping; if (action == @selector(stopRender:)) return mRendering && !mRendererStopping; if (action == @selector(saveImage:) || action == @selector(saveAsSVG:) || action == @selector(saveAsMovie:) || action == @selector(uploadToGallery:)) return !mRendering && mRenderBitmap; return [super validateMenuItem: anItem]; } - (IBAction) showHiresRenderSheet:(id)sender { [mDocument showHiresRenderSheet: sender]; } - (void)noteStats:(NSValue*)value { AbstractSystem::Stats s; [value getValue: &s]; NSString *message = [NSString localizedStringWithFormat: @"%d shapes", s.shapeCount]; if (s.inOutput || s.animating) { if (s.fullOutput || s.finalOutput || s.animating) { NSString* prefix = s.finalOutput ? @"drawing - " : @"rescaling - "; message = [NSLocalizedString(prefix, @"") stringByAppendingString: message]; } } if (s.toDoCount > 0 && !s.finalOutput) { message = [message stringByAppendingString: [NSString localizedStringWithFormat: @" - %d expansions to do", s.toDoCount]]; } else { message = [message stringByAppendingString: [NSString localizedStringWithFormat: @", %d x %d pixels", (int)mRenderedRect.size.width, (int)mRenderedRect.size.height]]; if (mTiled) { message = [message stringByAppendingString: @", tiled"]; } } #if 0 if (!s.inOutput) { message = [message stringByAppendingString: [NSString localizedStringWithFormat: @" in %.3f seconds", (double)s.outputTime / CLOCKS_PER_SEC]]; } #endif [mStatus setStringValue: message]; if ((s.inOutput && s.fullOutput) || s.showProgress) { if (mOutputProgressDelay == PROGRESS_DELAY) { [mOutputProgress setHidden: NO]; [mTopBar relayout]; mOutputProgressDelay += 1; } if (mOutputProgressDelay >= PROGRESS_DELAY) { double v = 100.0 * s.outputDone / s.outputCount; [mOutputProgress setDoubleValue: v]; } else { mOutputProgressDelay += 1; } } else { if (mOutputProgress > 0) { [mOutputProgress setHidden: YES]; [mTopBar relayout]; mOutputProgressDelay = 0; } } } -(int)variation { return mCurrentVariation; } -(bool)canvasColor256 { return mCanvasColor256; } -(bool)isTiled { return mTiled; } -(int)isFrieze { return (mTiled && mEngine) ? mEngine->isFrieze() : 0; } - (NSData*) pngImageDataCropped:(BOOL)cropped multiplier:(NSSize*) mult; { NSBitmapImageRep* bits; if (mult) { NSRect iRect = NSMakeRect(0.0, 0.0, 0.0, 0.0); iRect.size = mRenderedRect.size; NSRect fRect = iRect; fRect.size.width *= mult->width; fRect.size.height *= mult->height; tileList points; mRenderer->m_tiledCanvas->getTesselation(points, fRect.size.width, fRect.size.height, 0, 0); NSImage* tileImage = [[NSImage alloc] initWithSize: fRect.size]; [self validateDrawingImage]; [tileImage lockFocus]; for (tileList::iterator pt = points.begin(); pt != points.end(); ++pt) { NSPoint dPoint; dPoint.x = (float)pt->x; dPoint.y = (float)pt->y; [mDrawingImage drawAtPoint: dPoint fromRect: NSZeroRect operation: NSCompositeCopy fraction: 1.0]; } bits = [[NSBitmapImageRep alloc] initWithFocusedViewRect: fRect]; [tileImage unlockFocus]; [tileImage release]; [bits autorelease]; } else if (cropped) { bits = [mRenderBitmap getImageRepCropped: mRenderedRect]; } else { bits = [mRenderBitmap getImageRep]; } CGImageRef iref = [bits CGImage]; if (!iref) return nil; NSMutableData* mdata = [NSMutableData data]; CGImageDestinationRef destref = CGImageDestinationCreateWithData((CFMutableDataRef)mdata, (CFStringRef)@"public.png", 1, nil); if (!destref) return nil; CGImageDestinationAddImage(destref, iref, NULL); CGImageDestinationFinalize(destref); CFRelease(destref); return mdata; } @end @implementation GView (renderControl) - (IBAction) repeatRender:(id)sender { if (mLastRenderWasHires) { [self updateVariation: YES]; [self startHiresRender: mLastRenderSize minimum: mLastRenderMin]; } else { [self startRender: sender]; } } - (IBAction) startRender:(id)sender { mLastRenderWasHires = false; if (mRendering) { if (!mRestartRenderer) { mRestartRenderer = true; [self stopRender: sender]; } return; } [self updateVariation: YES]; NSSize size = [self frame].size; [self buildEngine]; if (!mEngine) return; if (mEngine->isTiled()) { size.width *= 0.9f; size.height *= 0.9f; } [self buildRendererSize: size minimum: 0.3]; if (!mRenderer) return; [self buildImageCanvasSize]; NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; RenderParameters parameters; parameters.periodicUpdate = [defaults boolForKey: @"ProgressiveUpdate"]; [self renderBegin: ¶meters]; } - (IBAction) finishRender:(id)sender { if (mRendererFinishing) { [self stopRender: sender]; } if (mRendering && !mRendererFinishing && !mRendererStopping) { if (mRenderer) mRenderer->requestFinishUp = true; mRendererFinishing = true; [mRenderControl setTitle: NSLocalizedString(@"Stop Now", @"")]; } } - (IBAction) stopRender:(id)sender { if (mRendering && !mRendererStopping) { if (mRenderer) mRenderer->requestStop = true; mRendererStopping = true; [mRenderControl setEnabled: NO]; } } - (void) startHiresRender: (NSSize) size minimum: (double) minSize { mLastRenderWasHires = true; mLastRenderSize = size; mLastRenderMin = minSize; if (mRendering) return; [self updateVariation: NO]; [self buildEngine]; if (!mEngine) return; [self buildRendererSize: size minimum: minSize]; if (!mRenderer) return; [self buildImageCanvasSize]; RenderParameters parameters; parameters.periodicUpdate = false; [self renderBegin: ¶meters]; } @end @implementation GView (renderThread) - (void) renderBegin:(RenderParameters*)parameters; { [self useVariation]; mRendering = true; mRestartRenderer = false; mRendererFinishing = false; mRendererStopping = false; [mRenderControl setTitle: NSLocalizedString(@"Stop", @"")]; [mStatus setStringValue: @""]; [mProgress setHidden: NO]; [mTopBar relayout]; #ifndef PROGRESS_ANIMATE_DIRECTLY [mProgress setUsesThreadedAnimation: YES]; [mProgress startAnimation: self]; #endif mOutputProgressDelay = 0; [self display]; mUpdateTimer = [[NSTimer scheduledTimerWithTimeInterval: UPDATE_RATE target: self selector: @selector(requestRenderUpdate) userInfo: nil repeats: YES] retain]; // ensure all stays alive while the thread is running [[self window] retain]; [mDocument retain]; [self retain]; NSValue* v = [NSValue value: parameters withObjCType: @encode(RenderParameters)]; [NSThread detachNewThreadSelector: @selector(renderThread:) toTarget: self withObject: v]; } - (void)renderThread:(id)arg { RenderParameters parameters; [arg getValue: ¶meters]; NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; #ifdef TIME_AND_LOG_RENDER NSDate* sTime = [NSDate date]; #endif if (mEngine && mRenderer && mCanvas) { if (parameters.render) mScale = mRenderer->run(mCanvas, parameters.periodicUpdate); else if (parameters.animate) { qtCanvas* qt = dynamic_cast (mCanvas); assert(qt); qt->enterThread(); mRenderer->animate(mCanvas, parameters.animateFrameCount, parameters.animateZoom); qt->exitThread(); } else mRenderer->draw(mCanvas); if (ImageCanvas* ic = dynamic_cast(mCanvas)) mCanvasColor256 = ic->colorCount256(); } #ifdef TIME_AND_LOG_RENDER NSLog(@"render took %g seconds", [sTime timeIntervalSinceNow]); #endif [self performSelectorOnMainThread: @selector(renderStopped:) withObject: self waitUntilDone: NO]; [pool release]; } - (void) renderStopped:(id)arg { [mUpdateTimer invalidate]; [mUpdateTimer release]; mUpdateTimer = nil; mRendering = false; mRendererFinishing = false; mRendererStopping = false; delete mCanvas; mCanvas = 0; #ifndef PROGRESS_ANIMATE_DIRECTLY [mProgress stopAnimation: self]; #endif [mProgress setHidden: YES]; [mTopBar relayout]; [self setNeedsDisplay: YES]; [mRenderControl setTitle: NSLocalizedString(@"Render", @"")]; [mRenderControl setEnabled: YES]; if (mRestartRenderer && !mCloseOnRenderStopped) { mRestartRenderer = false; [self startRender: self]; } // can let everyone go if they really want [self release]; [mDocument release]; [[self window] release]; if (mCloseOnRenderStopped) [[self window] performClose: self]; } @end @implementation GView (variationControl) - (void) initializeVariation { mCurrentVariation = [VariationFormatter randomVariation]; mIncrementVariationOnRender = false; [mVariationStepper setMinValue: [VariationFormatter minVariation]]; [mVariationStepper setMaxValue: [VariationFormatter maxVariation]]; [mVariationStepper setIncrement: 1.0]; [mVariationStepper setIntValue: mCurrentVariation]; [mVariationField setIntValue: mCurrentVariation]; [self reuseVariation]; } - (void) updateVariation:(BOOL)incrementIfNeeded { if ([mVariationField currentEditor]) { [[self window] makeFirstResponder: nil]; } if (incrementIfNeeded && mIncrementVariationOnRender) { ++mCurrentVariation; if (mCurrentVariation > [VariationFormatter maxVariation]) mCurrentVariation = [VariationFormatter minVariation]; [mVariationStepper setIntValue: mCurrentVariation]; [mVariationField setIntValue: mCurrentVariation]; } [mVariationLabel setStringValue: NSLocalizedString(@"this variation:", @"")]; } - (void) useVariation { mIncrementVariationOnRender = true; } - (void) reuseVariation { mIncrementVariationOnRender = false; [mVariationLabel setStringValue: NSLocalizedString(@"next variation:", @"")]; } - (IBAction) adjustVariation:(id)sender { if ([mVariationField currentEditor]) { int delta = [mVariationStepper intValue] - mCurrentVariation; [[self window] makeFirstResponder: nil]; mCurrentVariation += delta; [mVariationStepper setIntValue: mCurrentVariation]; } else { mCurrentVariation = [mVariationStepper intValue]; } [mVariationField setIntValue: mCurrentVariation]; [self reuseVariation]; } - (IBAction) editVariation:(id)sender { mCurrentVariation = [mVariationField intValue]; [mVariationStepper setIntValue: mCurrentVariation]; [self reuseVariation]; } @end @implementation GView (internal) - (void)drawCheckerboardRect:(NSRect)rect { [[NSColor whiteColor] set]; [NSBezierPath fillRect: rect]; if ([self inLiveResize]) return; static NSColor* gray = nil; if (!gray) { gray = [[NSColor colorWithCalibratedWhite: 0.95 alpha: 1.0] retain]; } [gray set]; static const float u = 10.0; NSRect box; box.size.width = u; box.size.height = u; for (box.origin.y = floor(NSMinY(rect) / box.size.height) * box.size.height; box.origin.y < NSMaxY(rect); box.origin.y += box.size.height) { for (box.origin.x = (floor(NSMinX(rect) / (2.0 * box.size.width)) * 2.0 + fmodf(box.origin.y / box.size.height, 2.0)) * box.size.width; box.origin.x < NSMaxX(rect); box.origin.x += 2*box.size.width) { [NSBezierPath fillRect: NSIntersectionRect(box, rect)]; } } } - (void)buildEngine { [self deleteRenderer]; mEngine = [mDocument buildEngine]; mTiled = false; } - (void)buildRendererSize:(NSSize)size minimum:(double)minSize { if (!mEngine) return; assert(mRenderer == 0); mRenderer = mEngine->renderer( (int)size.width, (int)size.height, minSize, mCurrentVariation, [[NSUserDefaults standardUserDefaults] floatForKey: @"BorderSize"]); } - (void)buildImageCanvasSize { if (!mRenderer || !mEngine) return; BitmapAndFormat* bm = [[BitmapAndFormat alloc] initWithAggPixFmt: aggCanvas::SuggestPixelFormat(mEngine) pixelsWide: mRenderer->m_width pixelsHigh: mRenderer->m_height]; if (!bm) return; [self invalidateDrawingImage]; [mRenderBitmap release]; mRenderBitmap = bm; mRenderSize.width = (float)mRenderer->m_width; mRenderSize.height = (float)mRenderer->m_height; mRenderedRect.origin.x = 0.0; mRenderedRect.origin.y = 0.0; mRenderedRect.size = mRenderSize; mCanvas = new ImageCanvas(self, mRenderBitmap, [bm aggPixelFormat]); mTiled = mEngine->isTiled() || mEngine->isFrieze() != CFDG::no_frieze; mRenderer->draw(mCanvas); } - (void)invalidateDrawingImage { if (mDrawingImage) { [mDrawingImage release]; mDrawingImage = nil; } } - (void)validateDrawingImage { if (mDrawingImage || !mRenderBitmap) return; mDrawingImage = [[NSImage alloc] initWithSize: mRenderedRect.size]; [mDrawingImage setScalesWhenResized: TRUE]; [mDrawingImage setDataRetained: TRUE]; NSBitmapImageRep* bitmap = [mRenderBitmap getImageRepCropped: mRenderedRect]; if (bitmap) [mDrawingImage addRepresentation: bitmap]; } - (void)redisplayImage:(NSValue*)rectObj { mRenderedRect = [rectObj rectValue]; [self invalidateDrawingImage]; [self display]; } - (void)noteProgress { #ifdef PROGRESS_ANIMATE_DIRECTLY [mProgress animate: self]; [mProgress displayIfNeeded]; #endif } - (void)requestRenderUpdate { if (mRenderer) mRenderer->requestUpdate = true; } - (void)showSavePanelTitle:(NSString *)title fileType:(NSString *)fileType accessoryView:(NSView *)view didEndSelector:(SEL)selector { NSSavePanel *sp = [NSSavePanel savePanel]; [sp setRequiredFileType: fileType]; [sp setTitle: title]; [sp setAccessoryView: view]; [sp setCanSelectHiddenExtension: YES]; if (saveImageDirectory == nil) { saveImageDirectory = [NSHomeDirectory() retain]; } NSString* name = [[[[mDocument fileURL] path] stringByDeletingPathExtension] lastPathComponent]; if ([name length] == 0) name = [[self window] title]; if ([[NSUserDefaults standardUserDefaults] boolForKey: @"SaveWithVariationCode"]) { NSString* var = [VariationFormatter stringForVariation: mCurrentVariation lowerCase: YES]; name = [name stringByAppendingFormat: @"-%@", var]; } [sp beginSheetForDirectory: saveImageDirectory file: name modalForWindow: [self window] modalDelegate: self didEndSelector: @selector(savePanelDidEnd:returnCode:contextInfo:) contextInfo: (void*)selector]; } - (void)savePanelDidEnd:(NSSavePanel *)sheet returnCode:(int)result contextInfo:(void *)ctx { [saveImageDirectory release]; saveImageDirectory = [[sheet directory] retain]; bool doSave = result == NSOKButton && [sheet makeFirstResponder: nil]; NSString* filename = [sheet filename]; NSInvocation* send = [NSInvocation invocationWithMethodSignature: [self methodSignatureForSelector: (SEL)ctx]]; [send setTarget: self]; [send setSelector: (SEL)ctx]; [send setArgument: &doSave atIndex: 2]; [send setArgument: &filename atIndex: 3]; [send invoke]; } - (void)saveImage:(bool)save toFile:(NSString*)filename { if (!save) return; NSData *pngData = [self pngImageDataCropped: [[NSUserDefaults standardUserDefaults] boolForKey: @"SaveCropped"] multiplier: nil]; if (pngData) { [pngData writeToFile: filename atomically: YES]; } else { [mStatus setStringValue: @"An error occured while writing the PNG file."]; NSBeep(); } } - (void)saveTileImage:(bool)save toFile:(NSString*)filename { if (!save) return; NSSize mult = NSMakeSize([mSaveTileWidth floatValue], [mSaveTileHeight floatValue]); NSData *pngData = [self pngImageDataCropped: YES multiplier: &mult]; if (pngData) { [pngData writeToFile: filename atomically: YES]; } else { [mStatus setStringValue: @"An error occured while writing the PNG file."]; NSBeep(); } } - (void)saveSvg:(bool)save toFile:(NSString*)filename { if (!save || mRendering) return; mCanvas = new SVGCanvas([filename UTF8String], (int)mRenderedRect.size.width, (int)mRenderedRect.size.height, false); RenderParameters parameters; parameters.render = false; parameters.periodicUpdate = false; [self renderBegin: ¶meters]; } - (void)saveMovie:(bool)save toFile:(NSString*)filename { if (!save || mRendering) { return; } RenderParameters parameters; parameters.render = false; parameters.periodicUpdate = false; parameters.animate = true; NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; parameters.animateZoom = [defaults boolForKey: PrefKeyMovieZoom] && !mTiled; float movieLength = [defaults floatForKey: PrefKeyMovieLength]; int movieFrameRate = [defaults integerForKey: PrefKeyMovieFrameRate]; bool mpeg4 = (bool)[defaults integerForKey: PrefKeyMovieFormat]; int qual = (int)[defaults floatForKey: PrefKeyMovieQuality]; parameters.animateFrameCount = movieLength * movieFrameRate * 0.01; NSSize* sz = mTiled ? &mRenderedRect.size : &mRenderSize; BitmapAndFormat* bits = [BitmapAndFormat alloc]; [bits initWithAggPixFmt: aggCanvas::RGBA8_Blend pixelsWide: (NSInteger)sz->width pixelsHigh: (NSInteger)sz->height]; if (!bits) { [mStatus setStringValue: @"An error occured while initializing the movie canvas."]; NSBeep(); return; } mAnimationCanvas = new qtCanvas(filename, [bits autorelease], movieFrameRate, qual, mpeg4); bool movieOK = mAnimationCanvas->getError() == nil; if (movieOK) { mCanvas = mAnimationCanvas; mAnimationCanvas = 0; [self renderBegin: ¶meters]; } else { delete mAnimationCanvas; mAnimationCanvas = 0; [mStatus setStringValue: @"An error occured while initializing the movie file."]; NSBeep(); } } - (void)deleteRenderer { mEngine = 0; if (mRenderer == 0) return; NSValue* r = [NSValue valueWithPointer: (const void*)mRenderer]; mRenderer = 0; [NSThread detachNewThreadSelector:@selector(rendererDeleteThread:) toTarget:[GView class] withObject:r]; } + (void)rendererDeleteThread:(id)arg { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSValue* rv = (NSValue*)arg; Renderer* r = (Renderer*)[rv pointerValue]; delete r; [pool release]; } @end contextfree-3.0.5+dfsg1.orig/src-osx/version.plist0000644000175000017500000000071212076364074020601 0ustar brambram BuildVersion 92 CFBundleVersion 1.0 ProductBuildVersion 7K571 ProjectName NibPBTemplates SourceVersion 1200000 contextfree-3.0.5+dfsg1.orig/src-osx/CFDGDocument.h0000644000175000017500000000514312076364074020415 0ustar brambram// CFDGDocument.h // this file is part of Context Free // --------------------- // Copyright (C) 2005-2007 Mark Lentczner - markl@glyphic.com // Copyright (C) 2008-2011 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // Mark Lentczner can be contacted at markl@glyphic.com or at // Mark Lentczner, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #import #include "cfdg.h" @class GalleryUploader; @class GView; @class CfdgErrorWrapper; class CFDG; class AbstractSystem; @interface CFDGDocument : NSDocument { AbstractSystem* mSystem; NSData* mContent; IBOutlet NSTextView* mEditor; IBOutlet NSTextField* mStatus; IBOutlet NSTextView* mStatusText; IBOutlet GView* mGView; IBOutlet NSPanel* mHiresSheet; GalleryUploader* mUploader; NSString* mDisplayName; } - (IBAction) startRender:(id)sender; - (IBAction) repeatRender:(id)sender; - (IBAction) finishRender:(id)sender; - (IBAction) stopRender:(id)sender; - (IBAction) saveImage:(id)sender; - (IBAction) saveAsSVG:(id)sender; - (IBAction) saveAsMovie:(id)sender; - (IBAction) uploadToGallery:(id)sender; - (IBAction) insertUnicode:(id)sender; - (BOOL)validateMenuItem:(NSMenuItem *)anItem; - (IBAction) showHiresRenderSheet:(id)sender; - (IBAction) startHiresRender:(id)sender; - (IBAction) cancelHiresRender:(id)sender; - (IBAction) closeAll:(id)sender; - (IBAction) enterFullscreen:(id)sender; - (CFDG*)buildEngine; - (void)showContent; - (NSData*)getContent; - (void)noteStatus:(NSString*)s; - (void)noteStats:(NSValue*)v; - (void)noteError:(CfdgErrorWrapper*)e; - (void)highlightChars:(CfdgErrorWrapper*)link; - (void)readFromExample:(NSString*)path; + (NSString*)documentType; + (BOOL)autosavesInPlace; @end contextfree-3.0.5+dfsg1.orig/src-osx/ColorCalc.h0000644000175000017500000000325612076364074020057 0ustar brambram// ColorCalc.h // this file is part of Context Free // --------------------- // Copyright (C) 2005-2006 Mark Lentczner - markl@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // Mark Lentczner can be contacted at markl@glyphic.com or at // Mark Lentczner, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #import @interface ColorCalc : NSObject { float startHue; float startSaturation; float startBrightness; float finishHue; float finishSaturation; float finishBrightness; int deltaSteps; } - (NSColor*) startColor; - (NSColor*) finishColor; - (void) setStartColor: (NSColor*) c; - (void) setFinishColor: (NSColor*) c; - (NSString*) startText; - (NSString*) finishText; - (float) deltaHue; - (void) setDeltaHue: (float) h; - (float) deltaSaturation; - (void) setDeltaSaturation: (float) s; - (float) deltaBrightness; - (void) setDeltaBrightness: (float) b; - (NSString*) deltaText; @end contextfree-3.0.5+dfsg1.orig/src-osx/Prefix.pch0000644000175000017500000000021312076364074017764 0ustar brambram// // Prefix header for all source files of the 'CFDA' target in the 'CFDA' project // #ifdef __OBJC__ #import #endif contextfree-3.0.5+dfsg1.orig/src-osx/CFDGController.h0000644000175000017500000000317312076364074020763 0ustar brambram// CFDGController.h // this file is part of Context Free // --------------------- // Copyright (C) 2005 Mark Lentczner - markl@glyphic.com // Copyright (C) 2011 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // Mark Lentczner can be contacted at markl@glyphic.com or at // Mark Lentczner, 1209 Villa St., Mountain View, CA 94041-1123, USA // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #import @interface CFDGController : NSObject { NSDictionary* mUpdateInfo; IBOutlet NSMenu* mExampleMenu; IBOutlet NSMenu* mHelpMenu; IBOutlet NSMenuItem* mFullScreenMenu; IBOutlet NSTextField* mFontDisplay; } - (IBAction) checkForUpdateNow:(id)sender; - (IBAction) gotoURL:(id)sender; - (IBAction) openExample:(id)sender; - (IBAction) setEditorFont:(id)sender; - (void)changeFont:(id)sender; @end contextfree-3.0.5+dfsg1.orig/src-osx/VariationFormatter.mm0000644000175000017500000000537612076364074022225 0ustar brambram// VariationFormatter.mm // this file is part of Context Free // --------------------- // Copyright (C) 2005 Mark Lentczner - markl@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // Mark Lentczner can be contacted at markl@glyphic.com or at // Mark Lentczner, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #import "VariationFormatter.h" #include "variation.h" @implementation VariationFormatter + (int)minVariation { return Variation::recommendedMin(); } + (int)maxVariation { return Variation::recommendedMax(6); } + (int)randomVariation { return Variation::random(3); } + (NSString *)stringForVariation:(int)v lowerCase:(BOOL)lowerCase { char code[Variation::maxStringLength]; Variation::toString(v, code, lowerCase); return [NSString stringWithUTF8String: code]; } - (NSString *)stringForObjectValue:(id)obj { int v = 0; if ([obj respondsToSelector: @selector(intValue)]) { v = [obj intValue]; } return [VariationFormatter stringForVariation: v lowerCase: NO]; } - (BOOL)getObjectValue:(id *)obj forString:(NSString *)string errorDescription:(NSString **)error { unsigned int l = [string length]; if (l > 6) { if (error) *error = NSLocalizedString(@"No more than six letters", @""); return NO; } for (unsigned int i = 0; i < l; ++i) { unichar c = [string characterAtIndex: i]; if (('A' <= c && c <= 'Z') || ('a' <= c && c <= 'z')) continue; if (error) *error = NSLocalizedString(@"Only accepts letters", @""); return NO; } int v = Variation::fromString([string UTF8String]); if (obj) *obj = [NSNumber numberWithInt: v]; return YES; } - (BOOL)isPartialStringValid:(NSString **)partialStringPtr proposedSelectedRange:(NSRangePointer)proposedSelRangePtr originalString:(NSString *)origString originalSelectedRange:(NSRange)origSelRange errorDescription:(NSString **)error { return [self getObjectValue: nil forString: *partialStringPtr errorDescription: error]; } @end contextfree-3.0.5+dfsg1.orig/src-osx/CFDGController.mm0000644000175000017500000003563112076364074021151 0ustar brambram// CFDGController.mm // this file is part of Context Free // --------------------- // Copyright (C) 2005 Mark Lentczner - markl@glyphic.com // Copyright (C) 2008-2012 John Horigan - john@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // Mark Lentczner can be contacted at markl@glyphic.com or at // Mark Lentczner, 1209 Villa St., Mountain View, CA 94041-1123, USA // // John Horigan can be contacted at john@glyphic.com or at // John Horigan, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #import "CFDGController.h" #import "CFDGDocument.h" #include "SystemConfiguration/SCNetwork.h" #include "cfdg.h" @interface CFDGController (setup) + (void)setupURLs; + (void)setupExamples; + (void)setupDefaults; - (void)buildExamplesMenu; - (void)buildHelpMenu; @end @interface CFDGController (internal) - (void)openExampleFromPath:(NSString*)path; - (void)updateFontDisplay:(NSFont*)font; @end @interface CFDGController (update) - (void)checkForUpdateInBackground; - (void)checkForUpdate:(BOOL)inBackground; - (void)updateThread:(id)arg; - (void)getUpdateInfo; - (void)gotUpdateInfo:(id)arg; @end // Provide the forward-declarations of new 10.7 SDK symbols so they can be // called when building with the 10.5 SDK. #if !defined(MAC_OS_X_VERSION_10_7) || \ MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_7 enum { NSApplicationPresentationFullScreen = 1 << 10 }; #endif // MAC_OS_X_VERSION_10_7 namespace { NSArray* urls = 0; NSArray* examples = 0; NSString* PrefKeyLaunchAction = @"LaunchAction"; enum LaunchAction { LaunchActionWelcome = 2, LaunchActionUntitled = 1, LaunchActionNone = 0 }; // Preferences keys static NSString* prefKeyCheckUpdateWeekly = @"CheckUpdatesWeekly"; static NSString* prefKeyCheckUpdateLast = @"CheckUpdatesLastTime"; // Update location static NSString* updateURL = @"http://www.ozonehouse.com/ContextFree/ContextFreeMacOSXVersion.xml"; static const char* updateServer = "www.ozonehouse.com"; // Update dictionary keys (fetched from server) static NSString* updateKeyVersion = @"CFBundleVersion"; static NSString* updateKeyShortVersion = @"CFBundleShortVersionString"; static NSString* updateKeyDownloadURL = @"DownloadURL"; static NSString* updateKeyWebSiteURL = @"WebSiteURL"; static const NSTimeInterval updateCheckingInterval = 7*24*60*60; // one week in seconds static NSString* prefKeyEditorFontName = @"EditorFontName"; static NSString* prefKeyEditorFontSize = @"EditorFontSize"; void addFileMenuItems(NSArray* filePaths, NSMenu* menu, CFDGController* target, SEL selector) { int n = [filePaths count]; for (int i = 0; i < n; ++i) { NSString* path = [filePaths objectAtIndex: i]; NSString* title = [[path lastPathComponent] stringByDeletingPathExtension]; NSMenuItem* item = [menu addItemWithTitle: title action: selector keyEquivalent: @""]; [item setTarget: target]; [item setTag: i]; } } void openFileMenuItem(NSArray* filePaths, id sender, CFDGController* target) { if (![sender respondsToSelector: @selector(tag)]) return; int index = [sender tag]; if (index < 0 || index >= (int)[filePaths count]) return; id path = [filePaths objectAtIndex: index]; [target openExampleFromPath: path]; } } @implementation CFDGController + (void)initialize { [CFDGController setupURLs]; [CFDGController setupExamples]; [CFDGController setupDefaults]; } - (void)awakeFromNib { mUpdateInfo = nil; [self buildExamplesMenu]; [self buildHelpMenu]; [self updateFontDisplay: [mFontDisplay font]]; SInt32 vers; if (Gestalt(gestaltSystemVersionMinor, &vers) != noErr || vers < 7) { [mFullScreenMenu setHidden: YES]; [mFullScreenMenu setEnabled: NO]; } else { [mFullScreenMenu setHidden: NO]; [mFullScreenMenu setEnabled: YES]; NSApplicationPresentationOptions opts = [NSApp presentationOptions]; if (opts & NSApplicationPresentationFullScreen) { [mFullScreenMenu setTitle: @"Exit Full Screen"]; } } } - (IBAction)gotoURL:(id)sender { if (![sender respondsToSelector: @selector(tag)]) return; int index = [sender tag]; if (index < 0 || index >= (int)[urls count]) return; NSURL* url = [NSURL URLWithString: [urls objectAtIndex: index]]; [[NSWorkspace sharedWorkspace] openURL: url]; } - (IBAction)openExample:(id)sender { openFileMenuItem(examples, sender, self); } - (IBAction)checkForUpdateNow:(id)sender { [self checkForUpdate: NO]; } - (IBAction)setEditorFont:(id)sender { NSFontManager* fontWindow = [NSFontManager sharedFontManager]; [fontWindow setDelegate: self]; [fontWindow orderFrontFontPanel: self]; } - (void)changeFont:(id)sender { NSFont* oldFont = [mFontDisplay font]; NSFont* newFont = [sender convertFont: oldFont]; NSString* name = [newFont fontName]; float size = [newFont pointSize]; [[NSUserDefaults standardUserDefaults] setObject: name forKey: prefKeyEditorFontName]; [[NSUserDefaults standardUserDefaults] setFloat: size forKey: prefKeyEditorFontSize]; [self updateFontDisplay: newFont]; } - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { [self checkForUpdateInBackground]; } - (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender { Renderer::AbortEverything = true; return NSTerminateNow; } - (BOOL)applicationShouldOpenUntitledFile:(NSApplication *)sender { LaunchAction l = (LaunchAction)[[NSUserDefaults standardUserDefaults] integerForKey: PrefKeyLaunchAction]; switch (l) { case LaunchActionNone: return NO; case LaunchActionUntitled: case LaunchActionWelcome: default: return YES; } } - (BOOL)applicationOpenUntitledFile:(NSApplication *)theApplication { LaunchAction l = (LaunchAction)[[NSUserDefaults standardUserDefaults] integerForKey: PrefKeyLaunchAction]; switch (l) { case LaunchActionNone: return YES; case LaunchActionWelcome: { NSString* welcomePath = [[NSBundle mainBundle] pathForResource: @"welcome" ofType: @"cfdg" inDirectory: @"Examples"]; [self openExampleFromPath: welcomePath]; return YES; } case LaunchActionUntitled: default: return NO; } } @end @implementation CFDGController (setup) + (void)setupURLs { NSString* helpMenuPath = [[NSBundle mainBundle] pathForResource:@"HelpMenu" ofType:@"plist"]; urls = [[NSArray arrayWithContentsOfFile: helpMenuPath] retain]; } + (void)setupExamples { examples = [[[NSBundle mainBundle] pathsForResourcesOfType: @"cfdg" inDirectory: @"Examples"] retain]; } + (void)setupDefaults { NSString* userDefaultsValuesPath = [[NSBundle mainBundle] pathForResource:@"UserDefaults" ofType:@"plist"]; NSDictionary* userDefaultsValuesDict = [NSDictionary dictionaryWithContentsOfFile: userDefaultsValuesPath]; [[NSUserDefaults standardUserDefaults] registerDefaults: userDefaultsValuesDict]; [[NSUserDefaultsController sharedUserDefaultsController] setInitialValues: userDefaultsValuesDict]; } - (void)buildExamplesMenu { addFileMenuItems(examples, mExampleMenu, self, @selector(openExample:)); } - (void)buildHelpMenu { int n = [urls count]; for (int i = 0; i < n; i += 2) { NSString* title = [urls objectAtIndex: i]; if ([title length] == 0) { [mHelpMenu addItem: [NSMenuItem separatorItem]]; } else { NSMenuItem* item = [mHelpMenu addItemWithTitle: title action: @selector(gotoURL:) keyEquivalent: @""]; [item setTarget: self]; [item setTag: i+1]; } } } @end @implementation CFDGController (internal) - (void)openExampleFromPath:(NSString*)path { id doc = [[NSDocumentController sharedDocumentController] openUntitledDocumentOfType: [CFDGDocument documentType] display: NO]; [doc readFromExample: path]; [doc showWindows]; } - (void)updateFontDisplay:(NSFont*)font { float size = [font pointSize]; NSString* name; if (fabs(size - floor(size + 0.5)) >= 0.05) { name = [NSString stringWithFormat: @"%@ %.1f", [font displayName], size]; } else { name = [NSString stringWithFormat: @"%@ %d", [font displayName], (int)size]; } [mFontDisplay setStringValue: name]; } @end @implementation CFDGController (update) - (void)checkForUpdateInBackground { NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; if (![defaults boolForKey: prefKeyCheckUpdateWeekly]) return; NSString* lastUpdateCheckString = [defaults stringForKey: prefKeyCheckUpdateLast]; if (lastUpdateCheckString) { NSDate* lastUpdateCheck = [NSDate dateWithString: lastUpdateCheckString]; NSTimeInterval sinceLastCheck = - [lastUpdateCheck timeIntervalSinceNow]; if (sinceLastCheck < updateCheckingInterval) return; } [self checkForUpdate: YES]; } - (void)checkForUpdate:(BOOL)inBackground { [mUpdateInfo release]; mUpdateInfo = nil; bool networkUp = false; SCNetworkConnectionFlags flags; if (SCNetworkCheckReachabilityByName(updateServer, &flags)) { networkUp = !(flags & kSCNetworkFlagsConnectionRequired) && (flags & kSCNetworkFlagsReachable); // See "Technical Note TN1145 Living in a Dynamic TCP/IP Environment // http://developer.apple.com/technotes/tn/tn1145.html } if (!networkUp) { if (!inBackground) { [self gotUpdateInfo: self]; // Hack: non-nil means not in background } return; } if (inBackground) { [NSThread detachNewThreadSelector: @selector(updateThread:) toTarget: self withObject: nil]; } else { [self getUpdateInfo]; [self gotUpdateInfo: self]; // Hack: non-nil means not in background } } - (void)updateThread:(id)arg { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; [self getUpdateInfo]; [self performSelectorOnMainThread: @selector(gotUpdateInfo:) withObject: nil // Hack: nil means in background waitUntilDone: NO]; [pool release]; } - (void)getUpdateInfo { mUpdateInfo = [[NSDictionary dictionaryWithContentsOfURL: [NSURL URLWithString: updateURL]] retain]; } - (void)gotUpdateInfo:(id)arg { if (!mUpdateInfo) { if (arg) { // Hack: non-nil arg means checking in the foreground NSAlert* alert = [[[NSAlert alloc] init] autorelease]; [alert setMessageText: NSLocalizedString(@"Could not check for an update.", @"")]; [alert setInformativeText: NSLocalizedString(@"Either the network is down or the update server could not be reached.", @"")]; [alert addButtonWithTitle: NSLocalizedString(@"OK", @"")]; [alert runModal]; } return; } NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; [defaults setObject: [[NSDate date] description] forKey: prefKeyCheckUpdateLast]; [defaults synchronize]; NSDictionary* bundleInfo = [[NSBundle bundleForClass: [self class]] infoDictionary]; int thisVersion = [[bundleInfo objectForKey: updateKeyVersion] intValue]; int updateVersion = [[mUpdateInfo objectForKey: updateKeyVersion] intValue]; if (thisVersion >= updateVersion) { if (arg) { // Hack: non-nil arg means checking in the foreground NSAlert* alert = [[[NSAlert alloc] init] autorelease]; [alert setMessageText: NSLocalizedString(@"Your version of Context Free is up to date.", @"")]; [alert setInformativeText: [NSString stringWithFormat: NSLocalizedString(@"You are running version %@ (v%d).", @""), [bundleInfo objectForKey: updateKeyShortVersion], thisVersion]]; [alert setAlertStyle: NSInformationalAlertStyle]; [alert addButtonWithTitle: NSLocalizedString(@"OK", @"")]; [alert runModal]; } return; } NSAlert* alert = [[[NSAlert alloc] init] autorelease]; [alert setMessageText: NSLocalizedString(@"There is a new version of Context Free available.", @"")]; [alert setInformativeText: [NSString stringWithFormat: NSLocalizedString(@"You are running version %@ (v%d). Version %@ (v%d) is now available.", @""), [bundleInfo objectForKey: updateKeyShortVersion], thisVersion, [mUpdateInfo objectForKey: updateKeyShortVersion], updateVersion]]; [alert setAlertStyle: NSInformationalAlertStyle]; [alert addButtonWithTitle: NSLocalizedString(@"Download now", @"")]; [alert addButtonWithTitle: NSLocalizedString(@"Go to website", @"")]; [alert addButtonWithTitle: NSLocalizedString(@"Remind me later", @"")]; switch ([alert runModal]) { case NSAlertFirstButtonReturn: [[NSWorkspace sharedWorkspace] openURL: [NSURL URLWithString: [mUpdateInfo objectForKey: updateKeyDownloadURL]]]; break; case NSAlertSecondButtonReturn: [[NSWorkspace sharedWorkspace] openURL: [NSURL URLWithString: [mUpdateInfo objectForKey: updateKeyWebSiteURL]]]; break; }; } @end contextfree-3.0.5+dfsg1.orig/src-osx/Info.plist0000644000175000017500000000246112076364074020012 0ustar brambram CFBundleDevelopmentRegion English CFBundleDocumentTypes CFBundleTypeExtensions cfdg CFBundleTypeIconFile doc.icns CFBundleTypeName ContextFree Design Grammar CFBundleTypeRole Editor LSTypeIsPackage NSDocumentClass CFDGDocument CFBundleExecutable Context Free CFBundleIconFile app.icns CFBundleIdentifier com.ozonehouse.ContextFree CFBundleInfoDictionaryVersion 6.0 CFBundlePackageType APPL CFBundleSignature ???? CFBundleVersion $CURRENT_PROJECT_VERSION CFBundleShortVersionString 3.0.5 NSMainNibFile MainMenu NSPrincipalClass NSApplication contextfree-3.0.5+dfsg1.orig/src-osx/misc/0000755000175000017500000000000012245646004016764 5ustar brambramcontextfree-3.0.5+dfsg1.orig/src-osx/misc/doc-design.png0000644000175000017500000014316112076364074021522 0ustar brambramPNG  IHDR>asBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time4/25/05TQprVWxZu8 @uDi'If\6 .IIcrK@J___~{y n<nSt_z*94sǃC'x* ~ @=sp<ʎG"C JOŀ8v7/O!?]άi _KbU>Uo*p?1PyO=?7@+wr+/+YȮP?( xVwrћ6S820HoEP)Ql28tY @ɿZF S@=cIpX1(:tS,X)] WxO35I3k^oASr,ObJc笳Tϩ}d]鼤2T.7]ɺ 9!? MX:L-"DCr_0c.^&Te?SU% T>*<oo*Hd_0A)@}CL["yԾ]:6CR- QePOt@`[V5*~WBel@GVE|-g1>a/;s"VJ;DŽ{D?,~# ^JDx#W$8n/Tr7)>`t S`JEt_>V! |>6bSTڛ'bZ|߂5Lm>{mT^iFWV7 .t/,>Xž@9U~yh OP !wLP&~qCx*|Y A9|^^jC V=/&I0gL Ĕ!OٖV|l#&U/E/yTiƀ?j^㰆Mר O?M:m$+ǷV\ <+陼>&RݚP$-B1u ZtzhƋ3%Iʱtxhp~N"|]UkcX|m@m?< ivs11Tr*$<}kEXzJm HrruNMPkA tWW8o'ܶ|yj|Qn{݊%)>BYoq֗+TK}j8{&WG~Iػ̺8wx)U\b/€'_=-i쯴=9h+=`7plƣv oIu'_ :8.?[{&gg'УމGKBYUaBo+ %`4 % iqV8ܡc0o:`i#xt7?!߬so/AC/~SfZ6[h:`=|a7%O.'ݍqv࡟+eaXVBx1,`/`HmkBF)3mkTSx]YsHL[՞٘}ElLln4$1%qJcYJz *\Iy-(e֗YYev?|N؞XYo[kvxujCv2ud7 ~~whz! VjK#ZK?p}_ISiKA41}Deo6v`|1\mwnr؉O=vxI#^ntoMߺ:n!K҇.KKD JtW7Xw wwXf= Y܉JbF^K{8$ HP,TŹ__[QJ%_EfMV޺6@aɛ4A;d T"={Ed_=kR_ܺq^n1b }ǥOx\+X/h*rf*K$f8ĉYd)?8n ( %X̌:f1@S2"#M:QM. )R^/dGϓ9KN6 -<ٲOƞ0h*4P*(#}f8 r!bwFg051tj+1t:G͑:=4^K(N Nь˵( .(Og{H=g3骊^ՁM1fUvfN1s?l{ Th@Icc.٪ђnqǃ(P/p$s]׫q=Aٳ-e]FD̄V&JЧLO{^ ӋLal܅)dF1h2jU&#q: 5˽<'Œ“ 0}+QVQ{C l|ȄM\%˩f 9?bPdVF05a$',DIB)@@~ ]wSL ʞ2 w5dJͽdo$j9>8Abz"d7`N[;"G+%I~9`WH6g-e89{Ueuc >lε6>"su3%o6׻o Ww Ǻ=^|c5sFh*Xk%y:0^@3$S+3"&"-  kl1Ɲj*ShWFO'ɒ9jՑP,mcS{1\hAϨ#Y:S0;:^F 2Yf*j0#.4GHᗒkQhQ !b&ԑL͢}7.os48dT@7:p ֲF,Mru, X/bDyxxpi >uEjQ+]뉙T(uRƋ g8BZls=V_AYG.f/`7"XÌe 6fsX$t)j;25̒YLHy{P>_B윴WAG\z~ s,`[D-)1DhvP$I%*;̪8ZҖ 4me?9ͨ0#Skq3J^L2Ye\ߟ6K,s#\6T_<aͬxxm~pr8'uzZ YU7pw$(ٛĴAmaJPu0 QEdTe 8y%SfN]-SA;d2Y5{iBNOȣ:7S%he0SS#|Ren]jwA3wn60HF7=_(Y D{柵QL-!2z:+c -Ӆ䴝>e12̱>80+ܶ^<U2s8'R(zb0MvD܈ =z~׹]toxKQDp=XB$7e=eue0`i4Y9k "}-ܔi{aS^@C&ahv&ܾoilL0Ѓ@nw>a^벇dcIJğôט&߽e"$w5x|{ԜBjSq = uI{eQncô^z/ N Җވ"+;h/cˉhĴNLbsz|\?ɹFLˈKLC<qDOr/'&S1=b叽}"*[\0YwޱFu M/᪌>?s3r4#б6"(EE) kk62R+~s}911-3GK˾|񴓂D%Z$T4:$sZVEOJҗkǎQߴ7=mH;k= E6zYKc p׀v㾦c`e͑o2}B 0Z 1hkyFeu4ԃd#,+Z8Ԙ2whГ"fv4bsJF:6żfQV "Hݷu)FL!{E+MEZ8S{b$0՜3̛'Ӵ(ӄuۚ]ڐDkfv4B1$ٶ+cRyJtO7r&Enb+E6Ve4e[,B4ӕ$f<$Y9**ƒnyiٞ/EܡuA<MHec~bN,fg9 _u .UVp2G9y#XW7X+9#4 ? kU-уnq|/r[V|5 8zq&ϝruS-HocrwHuLW ҢZݗt*Gw۹]vc3< o,|`$}v_/!?a^C4 @C !# J=ktG;)WԢXX͏I~ Kx$$GDUghaIs&{H9:<_dQ))%U 'pڔ^`5 RX ӂ 7?QF`I/B6cw?ns~EfO`$Cȳ гiAN+!ޑ~E|a- ,4+~E[nmN p=IC*0v&|ZsAY<}7vg_!{"%135{ di3zfWNȝo$Gܧ[\%<.8 d?;52kA)#9e=H%KgcXuj\ .M|_;rN̹G'݉]78;!=~uka膡3Zka3f%膣h膣WAc@44t ;gѰskq &o C7 fha膡W j6pv6pڼg7 0t -rm CCghŚwE-jع;7;v^=;s] CK kz ޝw G7-qt8Va熝%vnv5켾:v5 0λWk] gKk8{}^:v5 0λCw|ԥ߅Md VA euΨbf?dMeшӅ7OVAҼsQЯioFЎg ۛpM)DOuͮkhߠ=g WqOAb-l oTG7*j]_TǺ}f|QE,h@sjiT4m8E膣K/x-*ؼm3Tsή{uL_(`zG=b-6qGs[6'3˵H񯣁R$W׿(HІZ^G z9|t(L3!Bi }^8Wʮrs=BN)O&VC]C)GPSzQǼ]Q+߄h_د--5,[ o;i%so+#ŧSϛ5=_ HG~bU{?zzz_\xwRG<ĜY{BY3RzDO=`vD&eiŵ=ĢbJM3pU8^YI-뵩kcp:AF;4?40 hCjeGD@*7W-]ٌ-.d^5%!Mh2x#PKD̈ߴz3ܹw֌f܈嗂F,6R&97 2-*Y 滌Y8ֵ77wC%}4v>i?]vOf?'~LgO"{>K/}ga<3&Js^%wis.rۆ>k*9g}kr\н%{XҾWg:@lµ''L%3c6D^V8ibQ۵twJaThMTJ4QH|#Om6 +bvjFjD\=N;\mP^e3R$t/.`Udǹ,e?+Q j꫋i{#oCBjU{j 73洚J_w3Lb+x}E~9#EL1?W2|!yu5k' I -havLkc-'ɫ+Iw$1bVj{$:'l{V|e--'E~K3kzoi֫X~:;\h?oBH>#_lW8 r}CvRZP41}LO4[;ޫa:2ڠyV2WL׼ZLÓsm"XjyFV̜{.`;gDHZ?D1']אr@әBMO ǫw3K[M3f3SIY=&*%)B~Z;O|7&٤o$ا~|lx7b⛫nX]<E{7_xo3?~ޒ68+%OhvAx=n|!e0`iw¦1CfD3v방)rW;]tvXpǍݽ>$%HckL^RTL?EI3j ]wtS7@c]57{mR*@ ;ta\(ewv0) jǣ˾Cum{x&}8z :sIe^웋b:xkՌ_H9.{p؁L>IH?Pb/D,P\(h?Cڌ !?{{w:I&!xunI-2m?sDvG~Ovx?pGiGvx{ ۆ~=0k0"U$ZLV8Ƿ @eM x|hx.`߅GȚ߅ Rt]ulٚc. uAwmp(\2mGwTʚS(fF{ ~FVNXfPXf,"BfCYQ5ý JCcueʎe52V 7̌uE %(M8\d]ļ9!+a||DddGDJ @$0-..OxK@-΍hP ?szyT@:ޠ>Ѕ=hqDOOVȲ2' q#X3kb(OMByjvybwEY3Yn&ˍǶ"m"95<6g ޻U/j}S94yl?Y.m1M4`bL`އA[2eqG=f0eS+lY?w/xT ™jQ58mzfҴczӡeA+[ Bg 2 [bW)+Yvtǒ-JQn[VP-8-t4B)z+-1uwi1P jTctGvL3Q B#`*+ʀ\>ܲ@@F B1P>rdYsb]d9z˱M d1(.Ɉ#7ޒGQ^ ~M7 %ք9i./&6*cQ1hIudR FY) uԖeۆdRzXeUӣR є $T2GdG $Tױ[vqP|IUd*k)PbUo,hɡ4e+.We,E0.%OWڏJs+ϭ6ͱJa+x~t`&bF{٣` &_OwCu^27Sqwƚg[%񋰞KeH@krjE"X]۴ʲwAmkBSx]N0 WV `o6I{ٙͨ26UbDZ9u3\dTFTFyqnSz ¾3 Aك=ٚy`C"uIQ:!eP`{̦23U;/T8wi_521?b0zX&ΏwN>]ZpzѮ*mkBTx}+$+nʔiSL")HdJ,DbH$T3;;W֊z]@&-Y>\yنytc u/$р_ ݈vvvͅUJ@4ZaE6HxV:F6Q>KSy.&{<}Ad:KN?2 n37,OMEN#HF`?- j!j {r+%Aqh $S@%%|9`ƅ}6.?jU 7KBC_{-׮8`Se[ lhF-*,?nt WTe\ÚMOsf^|ŝ}Em ;GFn^Kb[dAݜҥy_g:=h5=#*|3z¡F#$̣[^Y EO)ـ~Iȑ8  Ľ&C}24 L >bXXFkhFWI. -h-yU`F m<}hRvTf}|dT@OP\I' 0%U-b2֓yxd^ƣcAēwP)Xͣ KZQX!+}~CX@- >9Fwx+$@>,#Xٵ1vQ5%tᑄJ#5̖3S=R e[OjRgfM߉ZpE9%辴tc⏥R1. p8Ywh;w@^tug.XHT^?2!+tU#_:{*!nygn:@ Zgpwp٧P栢=ԇ|Utl7~䙔@0 +h%\'̊!Lu`tp/߹÷0!:lH- gA ^Z1KO_<*•G}|;n'e}*#(4hB9Th玡NŶ@%fĠpo9,vrdԬ,qcD-7= 7V >v`f1B+?`ؕ?ջ+yKV"o6TpŚUk}"bɍ7!H*3(Tu|jGyŪEe18-BYYdf[L>='4"}\x乢2EOcvxV|MڡBs%ȧԜ?U$g{075պ[=h`Iu7ޡ1t(f\%}R@uPA(@0Mz>n /:{7l6u]~m'3u/OOX-?Jk3pMNVnuS>q$t>NSgِ,yfzkf6{4!ڵ Y̳X?%ţG|j}~H)'FCy6)$.[xgߍJ<MC+QgPX 7~PT֜~5=4WaH]0/qJ!Ѧ?q?+kpB7ޠ">G}W=\&fH0e kƲ]N0Gg45*O xFD ~Pv_u9%|?vǾal*.p,S?5jPt~ۢ4$FMm3\9\fVdٿIuKk+s]h?:iĺ-^pYljkeA ֣;$3~:LH Ip#W,%ebbad{O`eE}9!mB ,ƈyAUkb]Nø ˌD_ˁj5j%u^׸ `O g9cE @=BHMlk@$ ءۖ#iBOOA\zXCR%ˆ6 _loNVL?7\iB#~_l5zq#wRf|{jSKlcԁt*=LfLQJ_Ke[LE(EU0"R4hbR |;i@fT,}X?GBP7A#Hk2dwըU¢ {3eKxŨ!tϼѝ;ZهMK+2S:¾m:ʋT,شt|H>(;:HfT+_oG=3fLál,0K@I rHmD-Kɵ""7@8bRz=Dmc CF_ŀT-DM2_=Wl@F䴦"%b||+h Un+z`Dv~_ClO$>Y Bcyg |rp]o:8khۘM埁/W^ֆE^ls wfY~(cUSM6:-=j0y-AgЀNN2g$>+y| GA]cپ6m n5v{y4y:l<5y7/CBqP!L||R۝I׷Iw|X\Zꑽܳuu}1c%(Hh!!&>{Ny! BC~{ Uz-b i>hTN./hY}_sPp͠ '.D1bԿoK'mCn0H]_ _&kdx3{G!~KdlfPej9dm5Zq[nJ;#:u|CC-y Oo!N獼7;tYW[kcd [@P {q7wΎd'>{*QVؿMAN: Zl]ѓ䯹c[}: pz$1 U(rtH):=)_]2{xlu:0'Y0v~p %Nj #o^'X՜T¯-d'dT{voƧ߇&9ގlOz|lxq!leP>ޓ 4lBޞ}yơ$9Eg/>_Y\j*SCş9Pdo/g_J7wG`fע4>*04yWĉ &oD93mϻL}5Čގv$OEA0h61s_ qhL`Iw^%M2g 0=f_v fM7R;IEJQ04Ys N[4HWR99s_;o@O7 @s21FQyhm`:o_ π7:zAE^,έx!{>!7r#{77;"{&/0WßﳠA[yυmk}ݲC,NZ M9@`CtD"<p& ^K_J}GR}/ +-khO.ЙZ"W 83;&_ EKًH|!GCVyhKj-үP~Z̚lpyN7;aACNh }p*}FZM8oMGeh ŕW&;0ܕ +$Dz sD %0x/{gݷB#cpD˵#e"K/) !Y#̓Dlg4b>EM3T (9&p~-'GɑlY[?E.`ހM Evn4s<{nҟ4z3ƿM(p4x։m |&x%Z@({~N1qy8FPjDo6SXyhr :JgǾfN&b7Ԋ{dK<ڜw#sںN}xU~Mf_ 244yYhtvш̪>Qc8{Y oߛ|u߄6W(-ߺȍ# n֚MPj] Mp# y}XK sSU>q݁(yug5s3q !{;ߓ"4dG _4>7IH4(.#B ؜cz (#}%şnMC- }|[ϸ%6Pe>4RQoZ ]r;^@UofJ_nnaL3RlP?yרfchRr$R΄"rKG,-cJ铞\ੂJq{} y+wܥMYaq$xH{h2؂H!XG-Cz+Ng÷M#Y#dnrjE!ٯ.Th";vv ׏I42'ZJFBѳ$.2n;ӹtw=xt劉f>W:m+zl<Q CsBL@G1RB9zBG/u9߱\!p"Mj} ӆr)nST&t`&YfpKOm5oI~6;6h'!aG^drE% v <R1%/LPskK\wIΌ\ӀxI7Jb(i(H<'ߟ-Ԥ)ycNŚ:V J>̛jATg /d^YOCrG:ic;CʀW4' hJ7_sQL3!Mۯ6Ky{⼲q 7x˼`[(sk349bx7|q T zըH?-m䙄3ΐ{K@lg)ݺ@ RtiMd\zK.(\rZȞqp~M`d6 /wOd`.HyEϼ zd&<ʉdd9}hR^օ=W"3D_=,!l,ŏq?E?BІ^^c] J*סIq+\bjō 0}6?t6Gл̂:?s%V/Df= ~4_ M=? uA? L`R.[ B:RZ^A)D(ϼRSJu!lꟆ&/Λ cM}[cXaDe(_Lz"oHqcTxwt]8a S!BɄL}XJ" Y[8—>;r xDv؅7Q/b .=_U$?&Y ]X>e F€"UE,hi#z@7Hzc/x27m0"f\0Ѓ>#au Mb5s$Tvb18#{c4+Ώѭ _'2Eeoߟe-2$i%  MrNMAN.9$Dayj~\l;]?B~^Ng~5/Bmu%hk^BiJʵ+w @F!M*yg_8,|:ֆmWàc 3FGu~2'uF=!"ct8/ZԸruڐGtXCg5ZbKZbb[^V ٤)E=+!KΔ\C50!xV~&,~"1>ύ^/kdCmBb4 rQ"x D!W'ܻ}QΏy"Bx|31H.Ͷ2!qb̬?M!?q9><-lW]M}m5NgO4Z{m݅o #CÇM] 2h2_AG@nn*I J<&ߟ Jk`:1Ϩ#{D+B2y\i1^_E1lAbBAnE FX0>>H1'H$K[~ l5n}*jV9/@>RL.$?m>EN$D'~.%8yFc`}{C;+@03Ft̋g; $O)O:f |"""yAБlDk#/{φ7$Ő; Žz ,^rp"~}5C|pKAyɼ"7zq%{SJ{.̥܅ؔNICC!nVzСÒ+e1f(G -/3h)I=қUbPxF?M;YͶTj^zWyr>&5zRnqO÷ My}vP/vFZ4Z#GqES:/]`<{f#y3lfT9FG Oy6uB%|@uf~3˙@}XSwx$"Q}S!T AHP!.Eev_\κ7+miy4qv0‰jdž?+o^+-Y>VH?uhR?wX[ЦKZ$'͡WF E c[`P[Џ q\_]R +zZQ>3jQÉ(cF̬BYB-yFvrQYc? PCt8|];_ svXV +P٭o)1[H>fo]HL@c9w ttW#0*-ZDx}n;,^y{Rn] *j^D;b0 7 63&7*}QxoɶR^dte3a(ԍʛ?ߚW♰\#zz>% T,ȦRkYp\V$PUઐuAXcg{ .uU69WDԶ,|=?_xb}N@;|P%})A?zR!@@P?t@Jy1P{mS̔eYZ^w^1*| ֊9L'd !P'hKh70b:lf'bYykxDm1mx*|u'8B@(čbJJc~0y7ŏz #9{khA׿Y&Y7NU6S@cFLRz}n@*&d^O?bF4k@~O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?YMwg.QmkBT~|`xk]U׼3~=v+8q;c4MҖ &-M@xQDJU^*@Z BB COa8?ξ5=_wk[FFFFFFFFFFFFFFFFFFFvCF=cd*gY? (-$fw7%:EW9 y\uO༝L݌h!>OymA_$?6  S\wfM_3ڴ?: V~*cs qþd s?:/p5lXv(Y>j`F y>څ?q[2Ѧ܏=v>n; ӣx}7x;q |~K|7xΒ|61|?Cۦח$nU㾓8?+.pE`&]yˉ JVNoQ=t l]WdaM"p[GoҮث?2b]Y9d_'!U.[5N>>wwT7cy /i{}\$OHn's5U\I|W#JfC;, B̋GcaWm!7ozܕOl]qVN:1N_xQ2x*0-buy5Ϛ),WbӜVô{|{AϾϛV>׷^GNZm-9 >S#ս%}?b ԕ9i_sڪ9A;n[H??=?V;>+Y/,=|{'t<~d3V|O[5KsV}14ǩ5[ys[{#׍Vۡct^BqV; amUfa}G^?h8ĵ׫[vK)`cVoJf4iTiu%u=܏:ddQ]cuIי{Ucu!s98d|h[i 5mJG|9o}Ov>:v?$Yhʷp?OA}]"2ksN-Y;׮M%vuV*l5}Og3_ߘeKV?%_ҿ2c?<|%]'خ.Œ|p_Ϗ^ MF:I3jI&8~:1+H>=Sװ,G3O\;l5[D6&bmUy.ȬCO{}'`Ȏ3^:$']}mĒf Xu+ct؎W% r2 ^z|Ϊ_ qe#]vq^׊z:h%/Hu X) }t䁾cTGk!qǠ| E[9f8n.Ŝ3>?,.oA_uu=?'#\lmBr@ZsnnMěŞ^"ӽ3s+YY}ЖPOl%ِ;G,>%y |̷ϐ?)ۊa_YnSC_/uL1zx’!>+V?Zp۩a-X[}i=R\m?io(ڑ3B3H[ȑ۾iŸϚϖᄃCEf?x&z]mE]@ƻ'Cuq߯O|Pub|uz\ĩ8׏t9$Êa-HF>4/iYEvm뭂9:.ػF!sݞ=ynr߳-:QGp"g5_o\cd`lS>0y""Eblgo˯Xi_{^9> wVy=Si{wynVƝȗ!5wc{]:k1q_yGFٝo؞>l+UsN1 4q[vsHzq,u+uy蓡NB~P||u3M9 ǹyWy;㴯[xt0aiXԾd8QəoJC[ 5OKDZs?~ύ>3|>D>/"_lz%kJ;GZbG 9&O1ÃߦZnݾgfpbU.*]`YSsR5>Nd|m=~E\}7sKSLPƿq?sFhY򟒁_ 5aq+Y& Y~/G'xOYqv{@!CVF)?B Qu~<;>wx9C~7|mG[q ;p@g>)5꺏 d)UcΜc&-gS&sMi89m +s|ur@LZ(#FJ(?ClL Nǻ|r6O~g= _, [x/m9 y^CTvmq>W&eE68^2py';Ӽ )SoϮyQ sy]!/- , q#56MXѧ:?umR>+a2V¸{Ί9a 9eywU><or_6)y=;e!cfޝ䑏2ӅO7faEZUN|x_osBoׇC9ñ^ܞ,Zwؑ]GV}?e?ȁg1y3SY;_SNE|8]C^y6^,eaض`-! Ĺ$޶i󾏗G9߲gAǑiM*96w۰A~7۴ia|SnShwP^XcGVo4m[,X4'x^~y +'_2eaۂ?<"6ܵ0Jn/؊M=ԞXq0 s޿0w|sd36lfB9yW 9q_|\ Xs.|vTrk9[S.8Φ䫨vLkc) ّ{sIK͘OYc%ǩ8>erp᳋:jxBs!;exr[r)(őH֕Zx?G5ǞS_ߣ쀷j3/ʳ([ߏg \erPKx@~a`Lߥ|(BYڰ,[;ԼA)⿦:#- (zي侟29E φ-~!Z;]= kB7\j uu`W |nG9Cb=NUr6k!/z{;Dك?Iǖ l1GlZkK`(Q.Hqb"hGLX]-R`+ j!oO ~~nBAwu4v@֖dcdr"Gpk\0?uݻn<~l!9D'ף,oRk4f@0clsqMraPn˞K|]ޣnWݜGޗ7ӸxJ:ycH޿s 1W;ɡ|ʋ/T;@"NNÌeƊc:>ߵ*Oy'>KkM{Y:zQr}k >rK}~ oaׇ 2ej:k 1aZ)K|fu&!eI QVAV(Ci#\:c}?Kh^T56u9 _ 2!__!? _BKMex\Py>Gp0u+1=.ӦѿV̧u8+#~k}euc H+#f.[ jj'mʉrB|s[{κv푏CkBG~%46yn/x|c'|{:Oיߛ@2PV[vx8<\P?zv` {e+֎vLaͯL~`ټi;'y3PR6ܴiP} IWq*kD>9#9Pgό>}ߑK}nCNyYi#mn޿> B_o7gjp܊{KZu2q8ΊE={GSʆ֎=" ke?5X|[X[1cњV=5~?_@aál)O@)_?\y.r`Z#d% M~F_Ǫy\<mg-ea^_u?>@C9=@:Y[A4Ѵgs5?>>Kjك^ \[:TԾ<^7z`?0N '9eޫFFM{֦5^ihO)qB;穳{}ڮu%6Hqc(k(Ô銅\v,u*poj9uѼ~qI.je=wynm|my} 9Px-~^Ju z*Z~V/ j~Ih3|<֬j7ψ!F-te瀴nhƊ=67y {{7nH.#v6ǖ v,idϞY~Jy)ǩ~πy l5ޑqc!ﵐfa_>GC&(k-k1iaj?X?_y;I٪E5nMk( rjs:Uע}/c_A(w5 sx{2Pm6NſoKٸ`OX4 vWcuNYk_hF'NS5$!זǁSE>u} u2.X m+jO,_gaLUXkJOdڎ#^SokW;dqWӢ6i U0_"9mo0?|@NߚE>e`/޼;(}GA X; w8{퉂]Z;wڝx/#?5Z;|՚0ozDϮu0 }k[xT[|}_ޔ}qqҧM6C~W 8I{ɿ9H2ٟ֣~穮~ Nr< |Ж_g. )|>yg쓆] * g-|遽IޡW>-3ŀSMlVqfamj'Pϱ Xqց~2|ky`Y㎩ 5<;ڄmP6jē,S}uUh,zʿ!߷M35Wڥz},Q݁~clGKJ[ߦ)ͅ'O oSi_ϦY \{VsME [qt4 }!0WuU3jҴg}ž]R|= O>ߧA!QwG_k8nu? ?[lZݶQh_ȵ\]a?%Ȼz6?=5OJ÷ʫޥoi#` w'<:) k$߯Sp5+7b-~kZwlgB'樟ߑw~/ v!څe~=X{wf~~cy53y{}d}qxL\ۻ׻gI@XjjgiЃ`0 `0 ?ϟ|:seQ3|ӧO|:2|.};7eGFO6_Qv]T]^ˮg{>pjzkuo{yye?{-x/ D:3D&򈼹e^Hyi#/OGzϪ߯_~ :sMe#M3Y#=2 QЙ[\s=E8}E>GȩT ڲTg-}VfoSVwzV}./>~!?U1<#}=F[ ~QڋBN..+푹^edLo+[\-k dW(}6q$#?z6Bөi?L7!3O_Q}Пuo[=tkȋM!'}/Ƈdr2_Cﲨ: `0 :8o=+8-4}۞cĥXdq{bUq©ήm!ƶg*ΪU\z[GA=^+ru{LV U?)V>ғ)x|Yҁgi\yi^cUo*= !TY?rfgWsʽVn*VX#=Fϫ+[F~yH\L~[O҇h5ݵTow|Sfӟ+);F;:x )/OS yUo2e)Ve3'wgGg=J^`0  ľu kU,Ksؑ5nY,bXw{ w&3QהNQev ]ƷgcH˞i{A3I8hwduwUIWq8I>+@pQşGcZ\ƪUߝ]/:3d;ɫ:gB9R|GW~w2;fzt|+i5nΟgZY|<1NyŬ|E7k?z/k><=Α}N΅>uWydʬdz `0 *\?W8GY:Dgcg< 2+'W6qn؟{ru"wU쏘~c#T?+y{Q,,^qF/Xv8.֩g3}ȸOP ~n%hUG4(_sn|W}Tg&x^c,Fѭ+ <#+}/Uw8BRh_|33!mr\7U9m({ѝpvew[xG]߱?g;,nҽow8]וb?OV=Z_#ve?vN_WrYLo;1g9pV^G~>[_vNOS3 `0Q[ veO\k^8֔v<Zbz\Opbn$~}oz3ј mK vU]^iNWA#x딫jt q :E= z%օq)CcYEqyRG-+u (K\hP'*^ء^q=m=y|Kvūe\rȊ4={W1;=ݷxp;o@>ȘT\Ԏ+C=*ɫ|GJOCW]x1.ﵠ9_Eб Vq)v(ʑ}[GwǺ{-oSdו_˞׃2;iT&w*w:g׭SOsj%Z[~_˯d֮+w]7 `0]kIu+eL]ւoA^;=GR?v쯱;<y o$N1紈=:ߥPVu< <&3KyC/4r)i=*/|Ύ^]QNН1qGw>ù{ ?Kv:A}E:_n+{u=rq͓̳]>>d}+|L01`0 leg:׺񶊝`W,3O?]\9P~[kOWiGc~)-<w.3q}'vuw$Vnv(r52S;Wk_Kϔ8B/hEՠ'9w?K;x:x<|@cϽVyc@ۖSw8Bq]=2lBe6V}eR( VeZT4ade2ޒ+nYBTqSߔ<[&=f[|szP)G}{Zׅ3n7jpWwftEw[ǽ;`l? `0 `0 `{~i`oLy>uoi\qK|}7Svu9G쯿c¾#>,jow{ՆݲL=mW2u_8دjo?kD߱mw>#}E:OۡO;y`$jڿ mkBTyx흍8 FSHI!)$FRHnw HYx3ꇤsaaaaxIǏ'U{o_ھgW9 o'GW {>~Jlo߾)*/N\ϱov[iZ_ձaJΝ/:6O- 92b?Tlk%?_21B sY5>:>c=1Ow y^- ڶ,XzusM#גU]>H_yYv!ۉ_mi Rus]Xm_g)YY)m]y,m z1aaaxEߓGקo/Y\k6xjgH|yu.\aæM&wk#ϐ$?]Mo\Ⱦ,/ڥQ@~6s?)}, l gX #vQg Bٙ^uのuhm?}{].~}v_J;xogJY]޳@.)oqC?}>@Xߘ'-(W? źvƔOʙRv[K?[A}?-wmՑ}g\=c}M ggg DŽ-B^k_g?F? v0||؎=ǧHPgs/hؑI t~{n^}ZyD5XWvO)"c0vY Z|~_%/,p\ɹyΰZ/;/xs_9?Pܯ5ݻ\[y|č8gʱL{? 0 0 _k3>z_\S |<)b|7aaaxn.ta?l^Cvkؽ#~e)3<3^kdlc&jK+o"e<.ʞ`^(3zu l+6v<ï k7]/lc[`On}򚄫 G뎱zt^v2)?;Wmr5ocIz?Ozx{&!ez."ѯ 1Gg{+ҏlw<=}GݽFƨ^)zIpG K֜{{e G12ۭqiumf>.}~a? 0 0 [u+7Svq֭y΅ ?ނ}XwŶv?ߩDZۓ-q/?߳=<~#>Fk"qzrQo 9r,nY[;o:)@-`ק-7({߯S@µK9֠ɸ>:n3 _[_*mtcmC>qSL=<6;ǫsaaa{xˌ\ފpx?0׋#5zяc]x^l򼠕(f:~٣^lin59W~\;?vn6erUbS~v^U O7O(|;+SG4|?f*?rW~2oNٟS9~daևmH6mX[J~s.ym4ٶO|Bd/b5ɿyU? 0 0 0 0 0 0 0.P~*1@G\⟿KrKXs2(ߥ纎J8'>X@▼QQbqwx b)_K|v 1M6kee-2Ǜ59?K^E~9ϱQﱮYF8N?~;:=J<-tĒyNAgC \NXKs)'^Kg\~2}6}Գ)n]Or^j~"{p29w6/.z-v:+M{WJYZ굢`% Ҥl9ힶկ#OUz+U?;sd~vND7*.Y+v:ye;8}~|+ÑޅN9}{Bƞ#txխsXɿkSV/uJ=o G<ջL'L:D]6jfgLz/+ؽ[{rCMYq~[{yy czA;w9zszWHVax3 Y:TfmkBTI xڍm0aaAXAtNuө~"B~v(I$Ic i#Gl6p8޾s[ouv?Ru߯+fԍ^|}m43ϭu!Z9RUY׽B,z"|~>/|RתY̞EGߔ뙷L?:fV\꺯Pv#R>cNb=^Fz=yNI}.3?3̥*Ǫ7٧ڞƵ2~zWİg#g&2yK;wʞ2vm"Ggʼd~g<[şXlk=^k͞Gy\ׇ3M^&}V3=3ڣ<_(녾v9> G@Sǿ99Gy*"QYu*lz;{-/9v=Q_s>c),k:gQ%ԝ,SFwA2vWcWqlׯ[},g7F}.2˘ڳj*a w}?]ǛZA6,pw]q TU*llG}g}6n:q -ﺂ _͈p`}oݔD*a]whjrLR\.S.)Jַ:ɈStͿ4A>r 'qA8' z]@X|il6[<'M@B?@"(Ќ2 .%O]X޿bL<3 E"8Λn0MRil@'(JJ0 CtKJ2O?50n(<4 :'X,qy\.M ~ @p8n]T*r9,b|>_'n6"DSM7ÁaJa,l5jB@Xdbb7|t4딴jJ$n_8) i<6.,q 8]uU'D>v;JReV(HREl6nJ@'F@fB5o~ <|MMOncx,gd\Pʝh""j5rH$fS_XTP(T*\THDpS@c| LL&CZvxO&QD H\DpC?oYW333,--E&QlRHT"JL&BU1$ ϩS#111餷B.o~ l00 V.` uܹ7<|^B@2pK\faad2ɹsB0??O2{Wxb kcffn a(ٞrJ%裏 Hfpvqx^<^]vKgg""WMKoƃ7@ K$ s ٱ22 |ϧ|)JD"N'sss " JfhhHkql6^/>T*@>Wc= X,YXXX,p\*IDU}BWq4W^M$QRg?__=3:j"h[0HעuJod& )d24yO8f߾}AU $0$~/ q1>>ZMH|o6JUaG9q4s+]Z%, ҆իr9:;;d2eN>M,|X,t Q(&)Ep(BW&^z\A6b{w 6%!l6岒 KjEBN<T*1<ݎiR)r^W95Ar.C3,aНw~=S ,VpZF>' *p8(Jr9\.ҼѨ2Ϯ^xv;@hTVHٳl6(={k.l]?Lt:9|Jrn{S%. uB Ip[+f7ac/.TQT*6 ۭ8COO^ZfcR! 1>>,Pnz{{q8r8s `KRPVezznM^% BꞚU*u}v#sbf=ϗ{{{l߷Rl;M.`y". ݮ;\.rЈ.^=Qn):::roGG2n7Pϧ^b~~1 H$p: +YXaD%RC`X}JyԹb¡P9e0*" rʣ&qxHp8wͻヒR{!~?###j5&I]]]<# ٭H*RcNOO!hyOBL":J+XDPf V N I6%XAvCWW333ʹ+[7e|>v.>"}>HIƔO!(9si8gnvX^ eRh4J$!\ҝb0JROR.eXA}"&m@4d]njaqqQ)2;"b7k^nEQr R(DQv;]]]q?dttsΑN9rwu2A] !L255E"a^o].tEO2,PJS8THFVcdd׫^{5z{{?Ͼ}h=e8W^fq뭷[ zZK:A˃J 4ORBP(0??O<W >{ LZ7}2#$-[H$HRD"|>vbvvd2I(Fn?OI$r-;vAr'T\nZYljD"޽[=빃rBH8ѹM"$6%;\.+,244Cǣ4h4<^/pXb-dl4LNNreKt\*RՅ$ (8ΝTgGG{W_ɓ*' H$B$!xIbY\\ĉ,--ͮ]ʯ!xM@71Wak;D[VDp'ab@D1dL4M BA>255ɓ'ٳgRyy~\r˅P(p8'<yjyFGGpHAu=Tz8Nnk)kc.kF?P7h@ TRK_|, ݦ{T/ʈF?~s4v;C]\.~:::㌌(P,yy衇0 L&C6@ PwL4 pb9J@ql{F(r j,QXy~OKP3_ĆV~Baq*)a̛.`$fZET'|x<O%3000АrFA`3fvDvcby @ Q0 4˫]sj56(_NS[vww+ ޾[n^{^{y|2a bD"UZ7~{]AVܿ5,P1MU< }rf㶜Cx#all㌏S(Ob_U^RQɤ߮2;;;U&~"!:[-i`0 ײqw2H¾uz711믿g>{=:;;PA? 뿎!Hp%b.ݭhU YYjXܢjFKO[uK:w7~T\.sI8'N`ppP=iCqIU!$\_t\z˗/|E"$oV܂>` ,#ʬ(Y4 c4 ij-UŢbօ)IҡT*ӟ%pm)](*v"` b;v Cy~|a[[%pV*,GXvlFKa{$?(މ0Vfǒ2/_ԩSn9,ejt:(DK.¡Cd||'Orӳ.bVcEX +,A(QX~0.5z RΤ,{־Yͼ@X?ԩS\.?iN---Q*TPHD"B2;;˛oI"W~WU/UZ3|VAiۅ \x @?0%%Lo)˪f̥*={>LGGpY lr\״Yo, (\NuRߦix_5P"ff+Vme/':f X1e*(i5ҀIBNH$2JcޖԩF\p)zzzZ2==J7.̗&fW'Jt:9r/^g~җT'Z[ f^lp$p+6]Y%gP_`K.1;;XLJJV&"~8ennt:"h4Rv {5"V ,awyhn $Y҄IkRTILLL(M$!Nx74RPYƆaYYe~?DBz %Hy|;!J4z3l|!XʒU,B[ݵM‘;i}8g<*AS:߯l[e56Hb>f#Oc&="`U@b!ǰ&ҡS̾R14j!!a]% !z1F+Q0y\.|A8@`K~/!X=5=Plfx^,lVT*8q9߯b>OzL&Mf C@ں fffaxxUN&ܭk"VtECSV P}t@H$BXdffi^/jl6ŋT$VMyi^dPh4J^x7|o|s۲ݙ]pY fZ D.ʞЩ)|tvvK*\.Kۭb1tbXG|+A߫ko3Ǭu&#PX)d-6*Gq7Mnh4 䤪rjD×B˽Bs[=Igy~ҡU+kX"`xU?R+;) V155"i233ӧ9{*T*Oo#۬3~/ۢFQS˿|Gk̭ޱ %1O i@Ћ4MFGGUٵkJKMiZJn X-* W^wW_ŋ|_~Z&߯=.@%m˗iZ]&'')۷OdIUnT?QB!>ކuj&looP*ѡ[p V ͦ[Mh[jUL )4MSnKl\.355*|uֶZH٬G;;; ɨҲ`+49\4j2`*2MS+q|),RvehhדkYp^v;.]駟k_'NfnGo\@ ЖfDӮVzŊt7+9ۨoOGt۬| &:sX"g`EA' w1ߪ*`Pe\K8R\>ůNzUU)%߷$_?oRKXڒ#Gz4 A䩛gzcDt:s277ѣG7fp;~mlc8C,?x= hsNnГB A5,_\Dzʷf4ⷖ52 ϟ9u_җ8rȚI"DZij p9nq,)XV8 mR&.I\QdaH=~h1{h#5"hvߒg +z>6ADU5 ^’y,ͿHm @Q/T"~JfMd[Q' J:t@ ׾U,}Vup E`r^,K}~ۡJն:Ac5Yi>%"\k~i~yjaV0 +%7i VK6Օcec7; ˏcyg9rȦA3BwK,6 d/SXGI\m@]}oʢQqz(xffa``@fYRJr]o8T dI වtckXOsp.VCj7Տ7+֛@H$ljFrرk<;-߰X{X +7]8)U4͎[kP -lkvf\@b1O6U [ٳg>²7VWn,a'FzѶпlkՕ\qk]\.y7;^z%fffz5fu\Xd||b(r(ۯ`85&aa=hUЏ5 4k Fa#7 ab1??GGx8Lb)}{=%ty,%pCCwD \k{mGZO}ǎcttGD|)lJ%op!~aWq]wLaepC#]ckA3Y0DQz)j xo[Y!|رcol6` `w y#4\kj ce}QLX䥗^bdd\tl6~{1DB:ŰVw垀h[0؜Bl=_{ ^x|>ߚP8}4*}my {_ . ϟرc?8l={x".]"N qi`qȇjzVOnvvt9^n7SSSE@([oq%{1yyyꩧ7+W裏TedC/fJxGd2;wNeIICwwf}oksm2؈]fqwP.9sZe$Nկ~d2#L277صkSSSWR===tvv*\*Tqo|2f'=nDj>v"?~ZVu"E^LH^ n(p=,v IJvM`0ȓO> Y%HY?ɰ,q[?q]x{ٽ{7lV3lTm]8Zmzzߢ y' lakw7r܍;um#fi|^ܟYNh9l7"ٹkjclQ1.h'7:VfFkm׋`"CVٿXoֺf7ȍmfn͌jh/F)~oc6[6?V?@m>h'bm`-6뉅VX %ߪ OI Q] \o&Ȳvv ZN@෰bX=kk)EbyB\H#2VjE,t6f*X7XjM^MgOaS 3-+ZX7U2,[*K>C"ֻ%`VmhFYoYS:WMcp7/7 +dMOa zU iw-b`[ T)'; L&|F:l˸GPDת"msk,IENDB`contextfree-3.0.5+dfsg1.orig/src-osx/misc/app-design.png0000644000175000017500000016361612076364074021544 0ustar brambramPNG  IHDR>asBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time4/20/05犡 prVWxZ[ZF.I-x\ PV2Nof0{L\r Bdɷou?//'z''txzHxOxG>{GG@ϟs}-!G!nz(+W!{+$nbrj l#{״LB[Ȼ\.YNpF-d]-08>DMK$8j`hjgAoe}Ϸ `\= =A@IXى'8@_Mw>&NU@j3ZL؂/ğ_02{TjfDRDZ! lT`5 ^0I 9(8R Z g!Pi@8fκFOi 9H<u)pw5+S!|%@o ϗ ĜHs+8qi5$GBGFtJϠ$dleI̺->5D}g$!UgUWNz@k!>0)usKD9\a`b.Ò)B@9I)J'dPHp{x \*`Էsd!^j[yJ^1"@ ,0Kj`1 *gVKnlTp~<_wu5EP_hĹ2ٔ ΢5p520Zǀ PBFZ(w%}V| 6. 11X xJ LƎވ\ d*ӡ"$&ѰPuaZCjHMS&$+^ %iC4@G%;>WTrlE!;E9AX!|(S F" %kVcVF$W #SҴ OoV;IuSU?HRoܞ K|ϧy1U:U\ /Xxn7z'$ {-v@YP/[ ?eLR\5]SRb XerJa4(~7A7%.RG2LȽX0/sh j@#.<:$~@D@ޚ厺f}.OƜ;uX*<ƹ q '|? j q„"侲dwr{ \UkH,Tp9^IhN% DԀ.^8FK`jqEoㆁ!k~Ly4M\,Oֹ1L| C9JIEcEvzƆL4kr\rp%jrސä8HV~x6scT{Bij]k_n2h# tol̍:opcNo  O6ŏYc&NrC|x\Pxh3̙vsEea?ۢ0'6c6\5N5hegM[~֡r9sH2hN箌>ۖ >P1&~OOQ3a8 aw?IZ) V8! QB1)}ȁ^GR;w7: /-5%@9j=sQ `BCdVwsTB]3KoCgu&r=:WVz%KWw9 lfų]k,+Ueު< mĮL%Y2* lL_ian5N̈́N0״Eg$)럷AGEWz=Ii+2%Vl) H:9$h=A6)h4OӨiz7}]y(+X ¬wFjMƒ`c6켃1{GP#mul#dƖ'oh! k;/iʋt>mY.jc&f~/d`[ledz;l߈ ug;(Txu7+ЗVpͷ U8{Uf/ik7|.["'鶟}7(qƂߊ"@ Pq 6/.F-cF~.Ep7k2{T&~\߾? pH0ښ O6]Bk\{dOh[_bw#bCB慀6ua5R?HT2:+>|Н90'|0stfDz?js}>\,p.cHHmkBF)3mkTSx]YsHL[>33؍fpIIIcR͵|$̬EI [8 㫬/J޳ղ3_,?bMؙ|/|4?<Aۛ/mx yyv>^,eLJ_)`oG=H) )?@B81fwL9y>sf$tס46.l>Ƞݡ.431?KC8=^H7G{XKTC&kK8`;R. eI5!`%!x* W>BS?*P ~e户[3E YݣD2V˷{]yK Vs'~xbc-`5R>)o!R$HIi&Iג!AɘÅ[ \P܉IcL<ùi!]h͜_oXw_RFf鍊|mwv&AsϡaMV4;b5b \J/lcQY*M'kE '@WS  dqD6D%y,s8#A&}_>;1yrI f@եr`h!0< ܢhM+#?x)™pf709P#V}ԅ*8<6 oYG'95'eKJhpq<5h*4PJs/#]ظ1lbcplHxC' 耺wDyWe2rrMn=4_ (N Nќ( E~q?T>  ZDD 'fy3ger?_^qG[ߒo?@Ʉ㴻2Ƥ|UىhM mi;N5^IH$psfй 7, QK<"axӿM?<ЂYE,j/}mŻ0ND{܅UJÒ+Uc@1Pal܃)_JH#S5T9!Ɉ &ZJNF*X Y}2w/53oU0}j OKҽ!A61pH!㓥0ɁP9%qtIeu l4n[ S35L䄔(1Jl1t[32@"2 w9dR-T| |qČD. bs7yA[#W@gR31G)|H1O*ʝrOpXӅlhF4"A Nb6r zd^rs͑NIK Cf i@:jTPsT$SG% )'#;p~LM?*Sע|PLe82DipD$" XRQez'{½=vh8Yb3@\~#ѕ1x2=S4m c\U|?j0(r7]mgv123x~KO;1$4[ynnbX>}8 T[s<vhFƊzz3ZQ5"^jQp,2YΤ0NM 8IAń71s(nV8m>$_Ђ['3@\'%KYU[TWG1snJPS= gOI#Ţ|;[kfCrKpfNK8$:_(q _iKʨ" kCd)U@XӯMl#bzE'd/􎗖ˇ")IL zf#1SV'F}~"nD9*Km]-;sףxp ќp=wR⧙)oYoPMFd&bI;T]))ª0B1hsY7JUm4jtD7}g.7\ж~,Ɣ1IK [zx4'JܑL5(ulnsne b'f^ыEf`jچR@xLdZm,iCfx2]Ta۾M ,9pWT}[ص8̘f[DeYF1KרߖQF4ٲ,$Q|!iY\tIy a% NWۆז'G1#g[f#زV!HA@pz;]m >% ažhx GF9;=d@ř9RxL҆ ROaX~AR%KmcWL\*oŵ%~/_/Kx{ڐ+;Ld} G]tEx!},+t їrZ#ZG4V]a c멖@m(2+'+{N:],u#%1=LdEiӕw#Z9OayH7?y'LWF&/5pʈFNQ V#+Ǫ(c5+I_(~.3i }m,S>|Kj}~)OֿQ8H)c E%>"Q 4VI+u9"c)Ay8F5L'# =bQ\2XE+py8H1lթcp2KBLAF4?Bo8+saPU^RhB:&)2d+c$mWf27) _FrS miRvM[6}7b%'n `OTw 2&Y@Vu,>* A?Z{7~tN3M~w<1>{y>< cϵu?UaƆd{ȟ25OC}_PS)Yݛ>;I聒E,+Y߷dU}F> + SŒ̆gZ,*aZuZ0DuTG%7f!/fi"v9}hعո=QO'5h%_M[kp[>sW*`S|yП`NHaߌ=P }oS&S$co屮3H;3`u5Np WM|ܵ g-in&xq=PwOb+x}N L &R~O<?uVg7Rz =h~\#ǚɳHS \+#,Xpz dpm&E]E\BݯirAoz%_5}7ay&_ 151matMb^ _fQ33Ӹiif[:U͏q ;TI憣%oOtjmbEDx~-6W|`3},ۅu#D]Ch{=bC?5hoIxSz\}|0Co5#xJsy/(z/8ݤ _dԎ5.x8}]kYS< ղ],G3wl;o SΜNK ܴ;wmŒA. 7Ejp fϮ?_,{sKmbNo_-;=ackXG15Ɔf~w w=º{ cK|fooZ \0OGP:n=~x7}sxxm~85 nxNq⛮G=rGpËK3rЖ#/:tQYb6S~R~׆wBv?W V(ޓ%qݏp?w w~|ѣ>zcG 1 3j߱97EF'3WW.q_f7o(ץ1ݗ`ݽ0`mOB}(-XY{d#.rBnj¯O*Is' cJW Ó:l_Ҷ{xaL3ְTM3Sکv2J$P~#jz]\#ArnQu1- r`Kle~|mmNc9VôTSe<;aٶeanU2-Ȏ1aخꊥTҍ0C3t 2܆ { UQCu G^CrƁ &d# )Yy1- 4Ifٰf$eZ*  60z@ͪurL٠#Tw@-Æ TU{.x 38bxdۮiQ3nKm{*u nj&լ: ߠ(v 0N.r4n1 P\/q(d>i})8j*푿^YA<Õ/N #9:A/mMy0(`$l>= &ߐ 5Iܵ&M!}Bz@zI/(tҟJ>?JހK/+/5)>`N i?u3RN2L- YxBXTT$|@m @u Be@!G̵X424l2df.0ڢ+ |@K4W5WI%W&$ &S\1֔[3"iM-!P0gCH-(tUK@ 9gvM5&UɈDafQGlR`GӲ &T42Jn';N2v0TvE |iP)e,vs=,0Kۍ8Y$Ti:b*-vzI~? ~?ǂgۥl?ֲ[Sj-OZ`ޡa*YYOT [5!҄&Mf42;3;Qyd0)Āj=j&8˝FLVySDM4`(O>lƀzvgsI)D"wB ʠTe&vm_ϣ-mGUy0U%wa׵N;zyY8%yZHͿ*mkBT0x}+$+nʔiSL")HdJ,DbH$T3;;W֊z]@&-Y>\yنytc u/$р_ ݈vvvͅUJ@4ZaE6HxV:F6Q>KSy.&{<}Ad:KN?2 n37,OMEN#HF`?- j!j {r+%Aqh $S@%%|9`ƅ}6.?jU 7KBC_{-׮8`Se[ lhF-*,?nt WTe\ÚMOsf^|ŝ}Em ;GFn^Kb[dAݜҥy_g:=h5=#*|3z¡F#$̣[^Y EO)ـ~Iȑ8  Ľ&C}24 L >bXXFkhFWI. -h-yU`F m<}hRvTf}|dT@OP\I' 0%U-b2֓yxd^ƣcAēwP)Xͣ KZQX!+}~CX@- >9Fwx+$@>,#Xٵ1vQ5%tᑄJ#5̖3S=R e[OjRgfM߉ZpE9%辴tc⏥R1. p8Ywh;w@^tug.XHT^?2!+tU#_:{*!nygn:@ Zgpwp٧P栢=ԇ|Utl7~䙔@0 +h%\'̊!Lu`tp/߹÷0!:lH- gA ^Z1KO_<*•G}|;n'e}*#(4hB9Th玡NŶ@%fĠpo9,vrdԬ,qcD-7= 7V >v`f1B+?`ؕ?ջ+yKV"o6TpŚUk}"bɍ7!H*3(Tu|jGyŪEe18-BYYdf[L>='4"}\x乢2EOcvxV|MڡBs%ȧԜ?U$g{075պ[=h`Iu7ޡ1t(f\%}R@uPA(@0Mz>n /:{7l6u]~m'3u/OOX-?Jk3pMNVnuS>q$t>NSgِ,yfzkf6{4!ڵ Y̳X?%ţG|j}~H)'FCy6)$.[xgߍJ<MC+QgPX 7~PT֜~5=4WaH]0/qJ!Ѧ?q?+kpB7ޠ">G}W=\&fH0e kƲ]N0Gg45*O xFD ~Pv_u9%|?vǾal*.p,S?5jPt~ۢ4$FMm3\9\fVdٿIuKk+s]h?:iĺ-^pYljkeA ֣;$3~:LH Ip#W,%ebbad{O`eE}9!mB ,ƈyAUkb]Nø ˌD_ˁj5j%u^׸ `O g9cE @=BHMlk@$ ءۖ#iBOOA\zXCR%ˆ6 _loNVL?7\iB#~_l5zq#wRf|{jSKlcԁt*=LfLQJ_Ke[LE(EU0"R4hbR |;i@fT,}X?GBP7A#Hk2dwըU¢ {3eKxŨ!tϼѝ;ZهMK+2S:¾m:ʋT,شt|H>(;:HfT+_oG=3fLál,0K@I rHmD-Kɵ""7@8bRz=Dmc CF_ŀT-DM2_=Wl@F䴦"%b||+h Un+z`Dv~_ClO$>Y Bcyg |rp]o:8khۘM埁/W^ֆE^ls wfY~(cUSM6:-=j0y-AgЀNN2g$>+y| GA]cپ6m n5v{y4y:l<5y7/CBqP!L||R۝I׷Iw|X\Zꑽܳuu}1c%(Hh!!&>{Ny! BC~{ Uz-b i>hTN./hY}_sPp͠ '.D1bԿoK'mCn0H]_ _&kdx3{G!~KdlfPej9dm5Zq[nJ;#:u|CC-y Oo!N獼7;tYW[kcd [@P {q7wΎd'>{*QVؿMAN: Zl]ѓ䯹c[}: pz$1 U(rtH):=)_]2{xlu:0'Y0v~p %Nj #o^'X՜T¯-d'dT{voƧ߇&9ގlOz|lxq!leP>ޓ 4lBޞ}yơ$9Eg/>_Y\j*SCş9Pdo/g_J7wG`fע4>*04yWĉ &oD93mϻL}5Čގv$OEA0h61s_ qhL`Iw^%M2g 0=f_v fM7R;IEJQ04Ys N[4HWR99s_;o@O7 @s21FQyhm`:o_ π7:zAE^,έx!{>!7r#{77;"{&/0WßﳠA[yυmk}ݲC,NZ M9@`CtD"<p& ^K_J}GR}/ +-khO.ЙZ"W 83;&_ EKًH|!GCVyhKj-үP~Z̚lpyN7;aACNh }p*}FZM8oMGeh ŕW&;0ܕ +$Dz sD %0x/{gݷB#cpD˵#e"K/) !Y#̓Dlg4b>EM3T (9&p~-'GɑlY[?E.`ހM Evn4s<{nҟ4z3ƿM(p4x։m |&x%Z@({~N1qy8FPjDo6SXyhr :JgǾfN&b7Ԋ{dK<ڜw#sںN}xU~Mf_ 244yYhtvш̪>Qc8{Y oߛ|u߄6W(-ߺȍ# n֚MPj] Mp# y}XK sSU>q݁(yug5s3q !{;ߓ"4dG _4>7IH4(.#B ؜cz (#}%şnMC- }|[ϸ%6Pe>4RQoZ ]r;^@UofJ_nnaL3RlP?yרfchRr$R΄"rKG,-cJ铞\ੂJq{} y+wܥMYaq$xH{h2؂H!XG-Cz+Ng÷M#Y#dnrjE!ٯ.Th";vv ׏I42'ZJFBѳ$.2n;ӹtw=xt劉f>W:m+zl<Q CsBL@G1RB9zBG/u9߱\!p"Mj} ӆr)nST&t`&YfpKOm5oI~6;6h'!aG^drE% v <R1%/LPskK\wIΌ\ӀxI7Jb(i(H<'ߟ-Ԥ)ycNŚ:V J>̛jATg /d^YOCrG:ic;CʀW4' hJ7_sQL3!Mۯ6Ky{⼲q 7x˼`[(sk349bx7|q T zըH?-m䙄3ΐ{K@lg)ݺ@ RtiMd\zK.(\rZȞqp~M`d6 /wOd`.HyEϼ zd&<ʉdd9}hR^օ=W"3D_=,!l,ŏq?E?BІ^^c] J*סIq+\bjō 0}6?t6Gл̂:?s%V/Df= ~4_ M=? uA? L`R.[ B:RZ^A)D(ϼRSJu!lꟆ&/Λ cM}[cXaDe(_Lz"oHqcTxwt]8a S!BɄL}XJ" Y[8—>;r xDv؅7Q/b .=_U$?&Y ]X>e F€"UE,hi#z@7Hzc/x27m0"f\0Ѓ>#au Mb5s$Tvb18#{c4+Ώѭ _'2Eeoߟe-2$i%  MrNMAN.9$Dayj~\l;]?B~^Ng~5/Bmu%hk^BiJʵ+w @F!M*yg_8,|:ֆmWàc 3FGu~2'uF=!"ct8/ZԸruڐGtXCg5ZbKZbb[^V ٤)E=+!KΔ\C50!xV~&,~"1>ύ^/kdCmBb4 rQ"x D!W'ܻ}QΏy"Bx|31H.Ͷ2!qb̬?M!?q9><-lW]M}m5NgO4Z{m݅o #CÇM] 2h2_AG@nn*I J<&ߟ Jk`:1Ϩ#{D+B2y\i1^_E1lAbBAnE FX0>>H1'H$K[~ l5n}*jV9/@>RL.$?m>EN$D'~.%8yFc`}{C;+@03Ft̋g; $O)O:f |"""yAБlDk#/{φ7$Ő; Žz ,^rp"~}5C|pKAyɼ"7zq%{SJ{.̥܅ؔNICC!nVzСÒ+e1f(G -/3h)I=қUbPxF?M;YͶTj^zWyr>&5zRnqO÷ My}vP/vFZ4Z#GqES:/]`<{f#y3lfT9FG Oy6uB%|@uf~3˙@}XSwx$"Q}S!T AHP!.Eev_\κ7+miy4qv0‰jdž?+o^+-Y>VH?uhR?wX[ЦKZ$'͡WF E c[`P[Џ q\_]R +zZQ>3jQÉ(cF̬BYB-yFvrQYc? PCt8|];_ svXV +P٭o)1[H>fo]HL@c9w ttW#0*-ZDx}n;,^y{Rn] *j^D;b0 7 63&7*}QxoɶR^dte3a(ԍʛ?ߚW♰\#zz>% T,ȦRkYp\V$PUઐuAXcg{ .uU69WDԶ,|=?_xb}N@;|P%})A?zR!@@P?t@Jy1P{mS̔eYZ^w^1*| ֊9L'd !P'hKh70b:lf'bYykxDm1mx*|u'8B@(čbJJc~0y7ŏz #9{khA׿Y&Y7NU6S@cFLRz}n@*&d^O?bF4k@~O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?YMw xUmkBTAx]idW>wWO/=ݳtOgߒL811f1jLbј$7?\Q7DbDACQ"B ߩw}U{{z=>YZZ2fEt,eOrY_gjṭkYG'dlyF$AҴ {Qs=/EH0:|z3,o,ǮD V=PvL1ҽ|}!lC$jޜ0}R!]쯤u\[)hB#<Y^0eg}dJ:.$$fH8J/$OV}ɟvlco"R J:6%} ?xޗ>O HR^uw:?Է-Qy .g;S :Xi ǯs˚l݀6`w.$(=Fs9 X w 1cdo8$OV2/^_Ans$z"Hg_q:=F2{rWWjsAWRv>/i /v^ʥ u y 0`?I%w3gG^{ٶ ʢea4fx7!M`w&8_=,qD1q!48*Nmk53@}0\66m1I0s齟t7z\ ngyve@W~g~_BohWC{6q"9ӝnhߜύ{ixA zzP5π8]uQAq`?yƏ%Wޔ6>nn鯱8:2qv@ۭ H|^w28jq1~*9|Esō6+{*HNPF_'҄ |mbV}={8~8[M $!x*~ Oüo׆r>p Q}/iXc^IA~(+Ҽ-hlmE:_G~$f:CRX|?iHG n8vG$~8Gx3>jx P~x|8y3lvHo{#oHju$ZWkY[t鱅mP>q]&x8۟E[Hk#VPog99B}%_Aד{ȚVp:q_K ͹| _'mA199F\fKڌLˠ`-hl[(Cρ'q5t}4²vY?O@/5>_3%l<9 19KN_/g;NY8!@O5mM<4)x6b7jW?vПН5 [}UK\//% pn?EZu/7Y&<~sͥls5VU6PvNt\9~&l }EC?H`߮|XUCq#T2B?=#ymn!a#\?GslOC9](D\w$eWGW9&ƮꙖ>?OnxluBMS BK%f)ك^fq(_KSC`^L YhBzz) ="@o7<*SGM}h![Sv|ƭU_Q5~9Ҝ}7<1`9 =~@_3/ߩ|`~}@_'IkzTo!Jr{%<<'6 2 zs@1/׋m:iGɣ*/@_VЙ; )s-s}!;)!K!Kט>z+ þc[6uQB| t9ez,]Qҵstwi-v<;/{u/:4'[y9LZ˴b?k5}SИ27NA)6A>exUVZHm4d~< l]6? mVe3YX%^= @=.I^OH7-~V5\aٺ/#Wo34 Fq`čsgZάr؟5{2oA@A1>B:W5Z lGzǺ ŀ47cVX+-?0~FܸkM\ Blq_~r'O`|ry ؚq}qP u]a<=GokxunC^bmi_v -|`^ QS>@sLK@sJ~ *{WF3Yamό9ADŽuIS/]ȧ8x{ܖ^mυnD+>|KڇЃk)i]WF>(^O|ƆOS%_>ި7r_fn}ynclYobۓBw[~c~Ob3mb',⹫W|ʯ[x Tecu21]jSx۽D3:=@;oz-ՠ/h5:ի!gmk4so~E;kZl%_k>h}u_gOH91NJ]=E:SU`y@h 閵W}{̰uHo;&_Ѻ(~7e" ~*.Oq-@gb{M?*M5㍒!+}gKn>%#@wkn>Kĭ=/r~W`@z`F+t# 4GV}=,dbǤ]qqV؎WipaɈo9XJciBh7i{ݱ(= |b?/}VC-hSiR;g*\r15v15/yW:Խuh:שC}sbXLMnoJ:6ԭvg N+l*@`zBsGԗ W\疋l[Խ$o#?hnnԿX;m\O1n)Y4\rsVx6dS ~"n]a}L~eXZ`T~(_s`(n;$cߕrM}xkIk,W?'N#Gp_McȿYGw/~Υc/lɫDwj[XoK[7?}D;&&bY65h~E%ſkkIcc--O9[;vE:>~Q5yH h98hh< mkBTKx]gs|@A$0@̢H)hےT]v]?vc.Uupw;;Ҽy3k^v {ueGn~~2 2gu< ?}sG3zw_"Y:l;O83P],| ='Gݿ,ߊ+s:Fb_?BsO5NGed d::Lt߻=xxyO>{S|R^GDz+/}SmSf2LgǗ]MqyʕlMkʯuXc<7c7oߣ_uW =/gXMe.^4n(^|~DSO) .dX0˾oӈ.3\ʰs6qeq\nıgG˝ql(8mnY\AE/Z-gx΋<E9o14;J+m˃pa$vK~($8aqfD>B,8diAezH_g!vq X봓ـqq5Ö_A:*yZy( 3ҏ5zyƇ>dt6g{Av?vuB\4ij/ew ʼ1 YF?R7./-c;AyX 9My̚|GFYʻkLq u͓׫p [8~]p:Y&LY>_ N-F3?[ ~L?>W\>.`' ,oP>#k{ 3{NQn!f܋k$zׯۀ 6rY b?"m.y_% |RMCl7e{?s)w}>g/U Nd_'m[I ce''fx}3-uyJIŤ;ϕ⏎q/;Γ8Z7-r{gk8X`_-č3 "E9Z96( }N>//%WR8GyR{+G' ya[e[ke2MYXKևy6edx^y^p\^diy0fw c[<Ljg~>T>!b|̱=EvnУahBt?uܘbXn_s.k:akg˔mbZ[Xir~*=l#emmXoԍx*cjGr?>o8N1uqCwȗb^w|k>Ͷ{;˿wz>dԄBS'T#LxӯPF0r6>oZSNy2{ _\f#wM^GrqZ[I]_+/lf@4 ۭy!؃q ~D5 v1yx;͛@0_N;lVȿ8y s>W^2W5tȣ/Bc?|ó ]V_$(]!'b jſ콯eA|"_7 ЧDžن}Jݪ{>5ǯ O)_+VϥZl"5wC?|.ϣ ޑ7͕tW~ׯU~Bnq(>/P'_6bKڡZwP8@ys}3Y/PEn繋k 0G|:>ؤkvȀb5r2A}W@y0CGs9V;rV<ZW7fk&@>s|;sUQ56xBm_hWxkE.3r c su2}r_o?5qOsCr甅QtpS }`fa,oWÅ" V q =x@)庶<ڿj?u31E {;5Q}< 9xb ,Z͙Ck.:_U׈?GJ݆݅}Gl)麗'(7;e=٠t+>q/woXO/l!ۡ|Y{~ҘqcFWhoO&jz-T4puhcwJvo2kwjW׎ޠ{Zw2nޣo셅yS"}v?UI]5Lo@ ;pmPں]OlgSr]ӿTc5]X]Y3x ? 16|vh?C#FAmGӾcj-_7y |tJYY[?=`NDǢkh"t/=ڤ+m}>VZ d\{9i8׼csN.v~gݰnn_sۈlobvrk+Ǣ Յ_ [i *U:΃k G5+{r;Oxo(̽Sk*S¼5t[=SޯR}t1t 61CrRY~5WU?: >o넵gњ -W~?ֳ.w2-m;J^l6G^<½Y}P^E9n {ioϢKɗZw2~sǚ[#][ u5y˕R=cXݼG0- >mڳɊ!ǔ#V :"~,El-;vm yI;}ޒ={S6CWWk:jߝ2 _ |~=djwr{@܍0gVLwHs6s6񿶐g{/ܯm{gh?tٱba {k~ҼIɽl󤵮Q u7u*o3Q- hOX`Y9?T>r$lSKq l!C|Zfщ㺃Uozfā>yWj@j~\?28pjT(8_y,83 -c}ԭ'hwԳ ɿ+I=# ;z!h>OEZrww{~hm9p{=+J"^: R5cB墅 s=?5 5i5> F;thgZqxT*,bsp.Ԏ> F)Wkgw"^q<^cf_2Gԉ=o-A~,Ȼj#6Q=>~88kkr~ 7/}=ڳcgV\X3b8(Nm``?$ O`gd}1;?^q_c/53ڊc[GtD&~+q~1E6+ڊڠdOYי 5[uzF6Y$ܗ~?l7*Xrhwc,cCq(;7zg%Ϩqp6aaA{g$8ocCAb1mkBTx̠x흍) q ĉ8D^>׻gI@XjjgiЃ`0 `0 ?ϟ|:seQ3|ӧO|:2|.};7eGFO6_Qv]T]^ˮg{>pjzkuo{yye?{-x/ D:3D&򈼹e^Hyi#/OGzϪ߯_~ :sMe#M3Y#=2 QЙ[\s=E8}E>GȩT ڲTg-}VfoSVwzV}./>~!?U1<#}=F[ ~QڋBN..+푹^edLo+[\-k dW(}6q$#?z6Bөi?L7!3O_Q}Пuo[=tkȋM!'}/Ƈdr2_Cﲨ: `0 :8o=+8-4}۞cĥXdq{bUq©ήm!ƶg*ΪU\z[GA=^+ru{LV U?)V>ғ)x|Yҁgi\yi^cUo*= !TY?rfgWsʽVn*VX#=Fϫ+[F~yH\L~[O҇h5ݵTow|Sfӟ+);F;:x )/OS yUo2e)Ve3'wgGg=J^`0  ľu kU,Ksؑ5nY,bXw{ w&3QהNQev ]ƷgcH˞i{A3I8hwduwUIWq8I>+@pQşGcZ\ƪUߝ]/:3d;ɫ:gB9R|GW~w2;fzt|+i5nΟgZY|<1NyŬ|E7k?z/k><=Α}N΅>uWydʬdz `0 *\?W8GY:Dgcg< 2+'W6qn؟{ru"wU쏘~c#T?+y{Q,,^qF/Xv8.֩g3}ȸOP ~n%hUG4(_sn|W}Tg&x^c,Fѭ+ <#+}/Uw8BRh_|33!mr\7U9m({ѝpvew[xG]߱?g;,nҽow8]וb?OV=Z_#ve?vN_WrYLo;1g9pV^G~>[_vNOS3 `0Q[ veO\k^8֔v<Zbz\Opbn$~}oz3ј mK vU]^iNWA#x딫jt q :E= z%օq)CcYEqyRG-+u (K\hP'*^ء^q=m=y|Kvūe\rȊ4={W1;=ݷxp;o@>ȘT\Ԏ+C=*ɫ|GJOCW]x1.ﵠ9_Eб Vq)v(ʑ}[GwǺ{-oSdו_˞׃2;iT&w*w:g׭SOsj%Z[~_˯d֮+w]7 `0]kIu+eL]ւoA^;=GR?v쯱;<y o$N1紈=:ߥPVu< <&3KyC/4r)i=*/|Ύ^]QNН1qGw>ù{ ?Kv:A}E:_n+{u=rq͓̳]>>d}+|L01`0 leg:׺񶊝`W,3O?]\9P~[kOWiGc~)-<w.3q}'vuw$Vnv(r52S;Wk_Kϔ8B/hEՠ'9w?K;x:x<|@cϽVyc@ۖSw8Bq]=2lBe6V}eR( VeZT4ade2ޒ+nYBTqSߔ<[&=f[|szP)G}{Zׅ3n7jpWwftEw[ǽ;`l? `0 `0 `{~i`oLy>uoi\qK|}7Svu9G쯿c¾#>,jow{ՆݲL=mW2u_8دjo?kD߱mw>#}E:OۡO;y`$jˎĺ mkBT~$x흍8 FSHI!)$FRHnw HYx3ꇤsaaaaxIǏ'U{o_ھgW9 o'GW {>~Jlo߾)*/N\ϱov[iZ_ձaJΝ/:6O- 92b?Tlk%?_21B sY5>:>c=1Ow y^- ڶ,XzusM#גU]>H_yYv!ۉ_mi Rus]Xm_g)YY)m]y,m z1aaaxEߓGקo/Y\k6xjgH|yu.\aæM&wk#ϐ$?]Mo\Ⱦ,/ڥQ@~6s?)}, l gX #vQg Bٙ^uのuhm?}{].~}v_J;xogJY]޳@.)oqC?}>@Xߘ'-(W? źvƔOʙRv[K?[A}?-wmՑ}g\=c}M ggg DŽ-B^k_g?F? v0||؎=ǧHPgs/hؑI t~{n^}ZyD5XWvO)"c0vY Z|~_%/,p\ɹyΰZ/;/xs_9?Pܯ5ݻ\[y|č8gʱL{? 0 0 _k3>z_\S |<)b|7aaaxn.ta?l^Cvkؽ#~e)3<3^kdlc&jK+o"e<.ʞ`^(3zu l+6v<ï k7]/lc[`On}򚄫 G뎱zt^v2)?;Wmr5ocIz?Ozx{&!ez."ѯ 1Gg{+ҏlw<=}GݽFƨ^)zIpG K֜{{e G12ۭqiumf>.}~a? 0 0 [u+7Svq֭y΅ ?ނ}XwŶv?ߩDZۓ-q/?߳=<~#>Fk"qzrQo 9r,nY[;o:)@-`ק-7({߯S@µK9֠ɸ>:n3 _[_*mtcmC>qSL=<6;ǫsaaa{xˌ\ފpx?0׋#5zяc]x^l򼠕(f:~٣^lin59W~\;?vn6erUbS~v^U O7O(|;+SG4|?f*?rW~2oNٟS9~daևmH6mX[J~s.ym4ٶO|Bd/b5ɿyU? 0 0 0 0 0 0 0.P~*1@G\⟿KrKXs2(ߥ纎J8'>X@▼QQbqwx b)_K|v 1M6kee-2Ǜ59?K^E~9ϱQﱮYF8N?~;:=J<-tĒyNAgC \NXKs)'^Kg\~2}6}Գ)n]Or^j~"{p29w6/.z-v:+M{WJYZ굢`% Ҥl9ힶկ#OUz+U?;sd~vND7*.Y+v:ye;8}~|+ÑޅN9}{Bƞ#txխsXɿkSV/uJ=o G<ջL'L:D]6jfgLz/+ؽ[{rCMYq~[{yy czA;w9zszWHVax3 ݛmfmkBT~0xڍm0aaAXAtNuө~"B~v(I$Ic i#Gl6p8޾s[ouv?Ru߯+fԍ^|}m43ϭu!Z9RUY׽B,z"|~>/|RתY̞EGߔ뙷L?:fV\꺯Pv#R>cNb=^Fz=yNI}.3?3̥*Ǫ7٧ڞƵ2~zWİg#g&2yK;wʞ2vm"Ggʼd~g<[şXlk=^k͞Gy\ׇ3M^&}V3=3ڣ<_(녾v9> G@Sǿ99Gy*"QYu*lz;{-/9v=Q_s>c),k:gQ%ԝ,SFwA2vWcWqlׯ[},g7F}.2˘ڳ@+}eY?d^ϓL&f  ªʶTe{=eY^ iw:X7yrLʞ%P('ˢ)[P3=$ s}a K$pp&3HdYhzvf}BQUbzLq]x o޻?sPٻv۶aN˲ƚfBH###d2$IǧhǑ%aR٧VdY!ӈqTU'uo- t 8-*qwX󩧞kۉ%$|A,,G}_ۖ,HH(”<B@ټ! 8KtB TYL2uplg6{xx8Yq*_;uMLLk׮1@#o.)۲NuL&C>P'J(ʲ>cZ&vY1$V~,h$ $I¶m,B$$IBUUTU%WE( <b_}8M.$Iz&u]Y۶g{lжm\.f`T:l͎fm2=WXXLjḎpVށ*FEQ}EQb3k1B\!,B*b?|2?zmYLc T*Uu,CC +j(X,#az(ʸ26m۸(qN/QfC2p;+T*xt:CCCRzܮ3٧Sj3[Q$L&ГhxX,&aSyiza+#:|8rF *;m5Msimx\.G__$U vW0(@?nZrid2KKKXM_>рq@:裏bo;`MJrD4)2::3[׫+Uy*{5t:$I"ҰrwUU)JmH${/||/t~a`m9TF\H$6lȭ_>BՎf^psT@Y7UN{{%QTH;:aI&gu-g#ejib@ˀ뺌pȑIz7n #4.R)߲L, q˲l ۶ql[ގ纸!ޙ:t:OUyضieYؖ>NӤR)YXX LJ1YlfnnyLE}NCբn{31T+p: FhVy 3u@#<˲i۸K.[.7 :H177G,۶44-+;``X$ITUŶm2jBpw A8l՛^!d6 8z4M[\v]__XJpxSδ@QY}u׵$BH$"Ʈh055i4K'͢뺘ѣ pprN#QVdyz^E1 C,oeYߋ"~U(6366a4 .{g}-L~Dhf,--/n4M,"JPG~z/o6E\\\,St=Zra2 6m^E#Lٶ,JB!iL&4RD\fna0,>l/}Kwed(WYf" !G/&4n1M###NXhDfײ, 0`;~)X,2==M_>O>_]+9{]ZXdr6mˣ+E$I+0US׋Fc$IHLOO 6l, ŇU~V| 5 y }_V0RD S/-<44/A$Yp؀gϞW;*IBe #p%Mux rDz,fff)Jju\chh(:xnu1!t:re1Fftt[FТqpIF}a~wO*a-Xs3vè-ጋb(B]FoutTUL`ulذT2I&!!0(9s?(BfDyr9E<"SSS2jqΝ;Hx˲Ow/GdU}wH >aD")CD,$I4MŢx_UV.ݻj8tm۶p'"jv댍9qzYq0t TUq˫FZ%Nq2Ȳ,^B.[ƈZiY$ YӴ( K ^mtC%/{z iRnxx뺑u=p2sr˶I&T5كiY>" `ݡ\.!I0-% Uոkjt 3 N8pfI:Adr!8???ӷE"\-KI!"ŇG{C x̑$F`$ Y/1`Jlv݅0;ǶI&%EqBD14B/ݻw6<<|SxCeY&Gk$It:E;Buʕ ضE"Fuٰar "344mȲyC 2BycSLNNr%i)NNmON#K26D8BR Ք+OuMHR\{DL81=՗$ ^]~ g?g-i$rBVX\Ducll?NRX,bXdppn•W\A6ajjfIՎFOFH$9|Abt1@h &A`58$ICqΓ4ZH$:j`*Y<wF0D!&(6X)شi"t2DQlN" s5PViaR7o +2&'~4 /h),&IcV˲[H$ufyマҵboN{I4zqXz}kVҙ F"iiFv;bt]C®ݻXatp]{9nF Iݵ!uhZ,6rJ8!I\!f8+ 8=kgwH lLO+ѣUQTPx`/ytT*(8Djw&}^yzIrA#Gf2r91{=Jfq8z(7rO _fEѠlFkoVj_ƲLN"daaw07?ǣ=κu=vC'HdKv@X,t:Z-;F2$I}vLӤV8vdzcN,XVdYZo~"K IN*CPFnYp@pϞ=G> _WAэ*.$IY$%`pb,g\رXn4Z&z=WR$IڲpuR@&=>xd2cchSO=E,1a,#K2##ì[|`)&ijO>peO)JXM<'Nd"'2FW_}l d2y~$J4hY뮻W U B#~M$IzΙX((XUK`6E I¨D2t:lڴ I"|L6@+`hhW_}˲ܰaOpiؾ9E$JdfD߿^|+2ebT~G{u uPGYd+%Iz?C-d+ !V͆@P 3<ϋ)LSPhZF@n:I^C4v΍7@affFi+P{C r <#Jct <#Hf#3cvpGLZ.{~oш$aF#0A#'R (q`Lq6 +?3Z-1$)* ׷IV$i![jr^)0_\R*u͛7efJ?~fn|:udE\\!fH$B%I< 0006Rvu$.Kp]/W}}}xA7l 80tgSߊ l\>t3|"FM vq=3eXLt2Mq4 _%IBDRF?Zhضm^ۻBXG2!2tfп'O7ShFzb)k%O6%-”$AX8bl$jpQ[xl~ئxz.(JTr4dSlg)mtzҴBq$a^aD1sYl.Ա)Xncm-9CCLn܈Tk5:VBt\.U 0?7{Rd9Bt.JhafffY;a|n1|W?\8QE7]w1e'6@E] =H RNri;&ԀtIΡx4 aX'8uM$e5rH_zƳ4Ѯҫ :"fk鴫,-NahbVD,.-a&L˲XXX@F4Yĉ06ɒJtd2 q]Ԁc||v?qOC؎C2$O0}b.KШ|K_t:R\릉1T+kuEINΜDUU6JLNN"vd2:8HH P(16>ϳo~֯[ѣGy[1MriOV]lYI q-DτV9'I).a XdEJ4i7kLlniVh0l;(i(2rYh*xT2$y)SUJZeAp&`qi_|}GST⊝|$q^~eyYy{yO^ BQ*uNj/7-j:}\.G,'+D @(Z8byt\"6 #cҊRKUc.G&plh`5l9{2(*h,~Qc("bqqx<,;h49~8dqD6:r9Hv:W]u"OבeQt r#G‹/mV$'Oji[2 C?Q(nc }Q:Ei$I -u*b$#Qr?б/La` YV$QTUTNBfxx=4 :aǏVLgxxd2 0DDu<g͑WJkkJE†8A)R@㘦I2c,Mgxx]vqAYnK,8A>яrO J/hYI 3;;ۛ%*`UL“-+Gw}tpdz"GhX<φQqh2M8kQe-1[‡hj :tfQuXNC^D%^X8hDXG q>{9r+$U`fUZP<}zv\~ēy,)i@P a/C4U1D只ihZ U]N@ FoVp Doxѩcc/ |駟f͌O𶷽~ٻo/TKvx@ N yfZ\h0Kn03mV P_jѯPOhTtp$Q%Eq$u:J%Mr\.dT*{#!?eִbQdI"CaYFjo6\_z 0X,|:Vs[Vmgq_K~%\vjϽVvo#ڛދȡ NE*r+$1jtt&e JC.pE@4qwz\~ԪU.w0<2(,]iu/pmW/[*+iBmʽޠ|  )G @#/O1;uNU5TUSqjQ2 "E&Lrgߢ**CCCd2n,,377GB+c1,d?aaat&ͯگ100wX,Q+7jP<~93%Q!!n.a$jVZG{gjd/O0y4Te"P45U|t땙~h4dnvB޲rtfҋX x\`JRd2~w>N: ym۶2>>~QF 0??%"gY%X>O G~3Sc/gHi4-tV) SJxվsq{<ïʯiZumqi̜aQNZbiP֨7]n_p] xMSdY$YBVdz+pM޻w/?ضu+7pCTWը+4 FDo.E J}|AvPbY7\=?sڵG⊝|7Dzial6eY7q` ]kuDJXOZDڷ|w޼O'.%ȓL+h`-ZzYp׸$I8qw۶Y\\RD1 UQeK)O"/9f'juRV,S,yH& Wׯ_'YA n@XO#r% d1\w);];(i{x%HHI&bvjGϲl\)6l-܂i,,`bb 60>>`Љ+C*6bxx׳iF֍NmE8<͉'ػw/pa VVt:{9myÂ8bIbOz O?FuQJ&&KbIdpX4:.YKgX\䦛nVQ*VkK.'I|{tSɧX -(,,--qx~6o[/e/{>]P`/!ra@(gnӛWVsxrvW@,&V Dwp30ڷriFOT"\{RIȲ@?cc GIg+ˢH&jtt*СC)b1 4^L+-4|;A`@ 8bp ?7,`O{& ?G|r27D*G"Q$zJط_BIz.uѥXE26z\'E4\HGR(P> >I.{axXpǏgttu;_F ̄f]r%$O#@*g@;V]NzSȡ/ b3Qb~EB-nϟ7$YBw?\ KM˜E3?{jGm[c$y,œ$R+ e8Qu/(RD\&HDɣt&JF"6죦i bY,ep'lٲZF.[[Mzq@ sDcw~E;gc7O!ſU=ٞ;*ɔ'^fbr,"cKKK$ISk۶``/(һ1S;O`$diY<>[lau[>ϭw&2RLy }#%>p ױHs$S&51]GbAg7u[Z%I4 eY*СCk+% _| _EM5UYQu&9䴌xXx. TUXXX fwL&f'g"e2bH&"7;(brP,KRinf>Y׾VR8t`бĤVa&N6D_a`~Y@B?)HTlO bڪɣFL&+@ɠYJ"{XP"]/"vRBK/6HlmSSO/~_/uٵk=A\;Xz}GPgOF"\jE?HF_ },Hp ZM;}O^h6ضlC 8Aʕ ߾;|ⓟ_Osȑ5.0(,..{n~I@u]oBYoܷ/lnVQ03\:sss ,..FYj^ۋeYl)?u)qoYXWx1sC:VSU `Q^}U|A8qA$|^woyG馛?c~+iY/=k94؞ Gٝ7=j1ٷUUiZAT+ey:I0 ٨|xx'$fҨѣS }a#7,d*E<?_&1ضu+dT*֭[y;+)< sWcGe$w311표J`hhq!APD?_?FmA4Sv+[\{<:$ 81308(eQ*#ԿP,J&ٲeEЁ1CCCjЭ<@d^ۻ/|>Ω.#Ln䚫fvn98O0>>cxעx^,Cuz`P}Orw{>$IN8RD8>2AaTF4i ؁@ \BZ/ndFB_>Tb)diBQMM&FQU%x}y>L:bG8Gvk{k$)M$p@@uhhZ-qQN΄U[dZ(_G.\hIE9ds) Bj|K@͓e9*#T,+8gϞW_EenJ2"mfffr ~!bt]мMBuwqՕW_gaa!0;sݵq]]wkqѼRQgdd$T*Lw}{キgr`G!O= ra`RdNysssԪUo#?0ᶭaTвTbJ8 ڵ EUN%p]3r4^z 1Mclt_]rNZu#Yɤ<^sՕWN|.祗^ꫯ&ӱlB>^iwOA`R9H֢lÇ< 0B4jfL6lڬ*ss,--6%l9b nZ؈tgJdY&0NOOl}hI㎠ƖhlB@<݄ңͅ-Ϲ6x'w_#wn:uh 6}@STC@?zraV@ pY-d/ nK)Jk<ynVI &&&Fl|>f c8ѕrgyG;F1T E1MFEE;;)ڇ8 +s Rz;>ӲH4M >333C>cppёr41EHLLL-XX,--q}`=<,-.cn6o8e쳑nRh%}Hs-{8>f uFXT - D*BUU9[z2ݻ[z6NaZR_@r|#z.>qw{nnp5n&eLwZJR5$Iy øpdΟ?{mt;fӒ$4T =lt.dp+ؾm\ 22埪G@)Prް^ann.ʱ4mY|ҽQBnT*7cߛٸlnG+_*iy(Z'+J/ޣ^EPTXXX4 蚦i~{Gn-/q#,4688uop%H q]%o3ЗsDU5 x#*=Rvwͮ!̝N%JJ˲B)˵^z?]B7)4ߔЋ,\ZZ:"pseM =mv&ɰn:䨍. gjq ioۇ}y]zy^眗v1hѹapL@,$&]F}x{+L70)nۣt4),,,Dͮ(T*_z>|Ayn]CXVpgkI<) Ѡh&|/zȲeX~+ʙ-60h[.YؕHt:,,,DMDUU߲VX<S_׎]B{pV b)w|0ue,@ A t]kwF f]1I PxOcʓIA\FRȑ#ThEMF~f|ɓ?gj  C6]*$koE[xnݾ[V*:4r#Pz(eQ,#snFXKKK_|q//L\[tq*jmބX@(+q]f ӛ.rzW,ZZ0vmWӭkbG.EdBȢAQ8[7_7wŢeTEþvj8kԫ xCf/Yz-n(M7ҫtl,_Svb]eo|/ܹ[LtIDAT^Wl;=ϧlFf%:Aii=^/(*C}}zUӨNbkx^P-*R! ],YГ_|q^UU^˙Lwx@Z {~v]ZDM#"z=bdE9ieYtK&cAT =@'I&kQ.N_tM}t]foE kK. [fsZf{ݿjKKK+i8,?|{(D2[ysfxd:K2!ʢ*4j|bAwG#m6O+\L Xa<+Pt:xG<bСC{wnxt2,,c >*u=N29R ~lgb&4o~/^s5?_.;333O<ı|+S ^.ߢd|\E4%30LLHg3}$9ɩX&v3__du.tB凊]~dMe'[E!x_-m{;gcÛw\k7bH$SRY>R>R< 3(c{xBoeP]q!s_t*D40;צ(^%RA] ntQ8(8)+fC&*HiG~{qn B0^${ιۅ*鶟5=_P? GOktmيYY\^@EbDc aΓz щwepVۻwUi QeUK7p& |_ZĬ.aU T H\͋4R/ CWǨk+[RH_Jh(GPebq)a%bz-[~m;sUQ{D @ͪL0]p]~p9>_rv۬zP/Yʔ(EG|Nj`CCq,ʧLO>Ų0OfƇ^Rߖ&N<]MlG aP$[RsEO-@ϧݑ}~oJki djxO0pM :(@+<Ɓ~Z _`őѩ̇}^w/JnpzW~l/=mMZSi\{}8.?צږփ3mZ1t{mYm m 6px6]:nc'v5{l6;mn v-쳃Ν!+mVgcml#]G86fo]lm覣]^Gc.-]sI5+w9|oxб&?]ǻCYlFUuS[7C-[6Qh{'ܶag2U}@@rC2Ӵl 1ƓL : GPS̵7A;>s|6*kѹ LlRb!0(Lr`Ȕin$6e@' 9R0<LbgkVXw$wwztytc:'[ W !f&XAfElh?T>pqZDDofy^e|@#d$8|{ Th@IJ!c1eK*@odqyW9؝(FB%b:d?C @>ˁl3c*$ F#Ax]GT]wǵÛ=۞xѲ^dN%"Sĵl3$jf.ZeT T@0= m24A3QeB`2b!ESQ%vBŊ ,,h 4Rd26XJZ<ɈӦ%?E*R$ lnL䄔(*cgT2$w6-bGHJr|qPKbb-#%"`r{QEҵߠtإ1¹ͥYIzjWRZCQPm8z = p:־Yrx%zFwu TEF7JNXGb1oOl͆pG/XݮB r1QìF1%kXeY! I>h d5g5R+t |E%s_eq*XeB[(,*fY!pF>#ŋ")k%jYVe a_.tM5d+O7CSrו̜mu軞%33Oh2g1r&P^0\f슨MtQ78p wL*o U=p}$HrZ%B~[d58~I)7aL, F\6~ ckl攨-+Q'%&J^.9c-UɩA{OAf)YK{Zʕ8 @g=cG i< ` hJX!cr\1)VД8;Gpx[r⇱%6YguKJ׶Zte2?Ԗ`alrmה'АrE $/* H5'IVqLQV7݊"ШV'!1,kg]<AeZ߹@PW*f/Uɺުw% J nqlqe\1\F ?J5Y=ѭnྦྷ|/t_U|#Xr(!M y9 mmW Etd4JJ#*Ckg] Kk[_氳&bL{1M}Eo,s^3yvEkg[m s0yWj5w@EIplWsYKC8=vmjvB'X~ڿk%q=:Z|׆8iΤZ55{Z_Omը)iO)0jPW3k[j1,?#Ef̗ǥv[:al@/55"] wg=6=WB!E?.+ʡ+˲.@Ηk_&$ +*R75~Hq>IG:ܻJbOPSDُO{SLh/EIqWHBZHd~h=rFd?%nu=T\#%5msE(GE39ҞgEܝM ܌<&<`PCQ:3bO zde !kB ̋wV6*lHF2WCMI&EH(Ԑb(ԥQ(gDoIzs'vQ>Ј7P0AF"[% j<[/:[d 6'۽p;Sg0ZvOb?fT*({b~&7z]֥Z II7Qzȟ,-O=7np٧6Yd'xS:wyp\cp=,\g^hԹFVUEe~-X_|e%*EVJY"+qw?񉴙?ѽx:mnN0"vNoG>FOYO'5i%_+m϶K̨T6 3ʃ*XU_]w>ZQ"8GDZ?CysZgu=>I˵네W0?VFHmͶFA.| Dr뵈 M3ZJIdV\ ~=ɷ4e4FM2i=oH~3/*3|kbv>ӡck;WI-41uLOWiUhm^ ;Y9\q2Zje2cO&bb EDxr+V-+X~̜G6`;{D_ZJKHr@kҞNV*a,WfVf$:?sItEsI8 JųI"_<>T]  <,`ႅo+ 30=maw=Z4wz4mo*~c %+|3dlgIpp-!狷Y6紱6[{6}h lmڻtݦ2Kf6_fg`M߭!nEA{0_4&mVIݏmp!OנJsZ yR:'pxq8;fYsXߨmEX+vkT)^NmVS>;GW|awA`?nHE~\,{eGOE~E3&-Y>\yنytc u/$р_ ݈vvvͅUJ@4ZaE6HxV:F6Q>KSy.&{<}Ad:KN?2 n37,OMEN#HF`?- j!j {r+%Aqh $S@%%|9`ƅ}6.?jU 7KBC_{-׮8`Se[ lhF-*,?nt WTe\ÚMOsf^|ŝ}Em ;GFn^Kb[dAݜҥy_g:=h5=#*|3z¡F#$̣[^Y EO)ـ~Iȑ8  Ľ&C}24 L >bXXFkhFWI. -h-yU`F m<}hRvTf}|dT@OP\I' 0%U-b2֓yxd^ƣcAēwP)Xͣ KZQX!+}~CX@- >9Fwx+$@>,#Xٵ1vQ5%tᑄJ#5̖3S=R e[OjRgfM߉ZpE9%辴tc⏥R1. p8Ywh;w@^tug.XHT^?2!+tU#_:{*!nygn:@ Zgpwp٧P栢=ԇ|Utl7~䙔@0 +h%\'̊!Lu`tp/߹÷0!:lH- gA ^Z1KO_<*•G}|;n'e}*#(4hB9Th玡NŶ@%fĠpo9,vrdԬ,qcD-7= 7V >v`f1B+?`ؕ?ջ+yKV"o6TpŚUk}"bɍ7!H*3(Tu|jGyŪEe18-BYYdf[L>='4"}\x乢2EOcvxV|MڡBs%ȧԜ?U$g{075պ[=h`Iu7ޡ1t(f\%}R@uPA(@0Mz>n /:{7l6u]~m'3u/OOX-?Jk3pMNVnuS>q$t>NSgِ,yfzkf6{4!ڵ Y̳X?%ţG|j}~H)'FCy6)$.[xgߍJ<MC+QgPX 7~PT֜~5=4WaH]0/qJ!Ѧ?q?+kpB7ޠ">G}W=\&fH0e kƲ]N0Gg45*O xFD ~Pv_u9%|?vǾal*.p,S?5jPt~ۢ4$FMm3\9\fVdٿIuKk+s]h?:iĺ-^pYljkeA ֣;$3~:LH Ip#W,%ebbad{O`eE}9!mB ,ƈyAUkb]Nø ˌD_ˁj5j%u^׸ `O g9cE @=BHMlk@$ ءۖ#iBOOA\zXCR%ˆ6 _loNVL?7\iB#~_l5zq#wRf|{jSKlcԁt*=LfLQJ_Ke[LE(EU0"R4hbR |;i@fT,}X?GBP7A#Hk2dwըU¢ {3eKxŨ!tϼѝ;ZهMK+2S:¾m:ʋT,شt|H>(;:HfT+_oG=3fLál,0K@I rHmD-Kɵ""7@8bRz=Dmc CF_ŀT-DM2_=Wl@F䴦"%b||+h Un+z`Dv~_ClO$>Y Bcyg |rp]o:8khۘM埁/W^ֆE^ls wfY~(cUSM6:-=j0y-AgЀNN2g$>+y| GA]cپ6m n5v{y4y:l<5y7/CBqP!L||R۝I׷Iw|X\Zꑽܳuu}1c%(Hh!!&>{Ny! BC~{ Uz-b i>hTN./hY}_sPp͠ '.D1bԿoK'mCn0H]_ _&kdx3{G!~KdlfPej9dm5Zq[nJ;#:u|CC-y Oo!N獼7;tYW[kcd [@P {q7wΎd'>{*QVؿMAN: Zl]ѓ䯹c[}: pz$1 U(rtH):=)_]2{xlu:0'Y0v~p %Nj #o^'X՜T¯-d'dT{voƧ߇&9ގlOz|lxq!leP>ޓ 4lBޞ}yơ$9Eg/>_Y\j*SCş9Pdo/g_J7wG`fע4>*04yWĉ &oD93mϻL}5Čގv$OEA0h61s_ qhL`Iw^%M2g 0=f_v fM7R;IEJQ04Ys N[4HWR99s_;o@O7 @s21FQyhm`:o_ π7:zAE^,έx!{>!7r#{77;"{&/0WßﳠA[yυmk}ݲC,NZ M9@`CtD"<p& ^K_J}GR}/ +-khO.ЙZ"W 83;&_ EKًH|!GCVyhKj-үP~Z̚lpyN7;aACNh }p*}FZM8oMGeh ŕW&;0ܕ +$Dz sD %0x/{gݷB#cpD˵#e"K/) !Y#̓Dlg4b>EM3T (9&p~-'GɑlY[?E.`ހM Evn4s<{nҟ4z3ƿM(p4x։m |&x%Z@({~N1qy8FPjDo6SXyhr :JgǾfN&b7Ԋ{dK<ڜw#sںN}xU~Mf_ 244yYhtvш̪>Qc8{Y oߛ|u߄6W(-ߺȍ# n֚MPj] Mp# y}XK sSU>q݁(yug5s3q !{;ߓ"4dG _4>7IH4(.#B ؜cz (#}%şnMC- }|[ϸ%6Pe>4RQoZ ]r;^@UofJ_nnaL3RlP?yרfchRr$R΄"rKG,-cJ铞\ੂJq{} y+wܥMYaq$xH{h2؂H!XG-Cz+Ng÷M#Y#dnrjE!ٯ.Th";vv ׏I42'ZJFBѳ$.2n;ӹtw=xt劉f>W:m+zl<Q CsBL@G1RB9zBG/u9߱\!p"Mj} ӆr)nST&t`&YfpKOm5oI~6;6h'!aG^drE% v <R1%/LPskK\wIΌ\ӀxI7Jb(i(H<'ߟ-Ԥ)ycNŚ:V J>̛jATg /d^YOCrG:ic;CʀW4' hJ7_sQL3!Mۯ6Ky{⼲q 7x˼`[(sk349bx7|q T zըH?-m䙄3ΐ{K@lg)ݺ@ RtiMd\zK.(\rZȞqp~M`d6 /wOd`.HyEϼ zd&<ʉdd9}hR^օ=W"3D_=,!l,ŏq?E?BІ^^c] J*סIq+\bjō 0}6?t6Gл̂:?s%V/Df= ~4_ M=? uA? L`R.[ B:RZ^A)D(ϼRSJu!lꟆ&/Λ cM}[cXaDe(_Lz"oHqcTxwt]8a S!BɄL}XJ" Y[8—>;r xDv؅7Q/b .=_U$?&Y ]X>e F€"UE,hi#z@7Hzc/x27m0"f\0Ѓ>#au Mb5s$Tvb18#{c4+Ώѭ _'2Eeoߟe-2$i%  MrNMAN.9$Dayj~\l;]?B~^Ng~5/Bmu%hk^BiJʵ+w @F!M*yg_8,|:ֆmWàc 3FGu~2'uF=!"ct8/ZԸruڐGtXCg5ZbKZbb[^V ٤)E=+!KΔ\C50!xV~&,~"1>ύ^/kdCmBb4 rQ"x D!W'ܻ}QΏy"Bx|31H.Ͷ2!qb̬?M!?q9><-lW]M}m5NgO4Z{m݅o #CÇM] 2h2_AG@nn*I J<&ߟ Jk`:1Ϩ#{D+B2y\i1^_E1lAbBAnE FX0>>H1'H$K[~ l5n}*jV9/@>RL.$?m>EN$D'~.%8yFc`}{C;+@03Ft̋g; $O)O:f |"""yAБlDk#/{φ7$Ő; Žz ,^rp"~}5C|pKAyɼ"7zq%{SJ{.̥܅ؔNICC!nVzСÒ+e1f(G -/3h)I=қUbPxF?M;YͶTj^zWyr>&5zRnqO÷ My}vP/vFZ4Z#GqES:/]`<{f#y3lfT9FG Oy6uB%|@uf~3˙@}XSwx$"Q}S!T AHP!.Eev_\κ7+miy4qv0‰jdž?+o^+-Y>VH?uhR?wX[ЦKZ$'͡WF E c[`P[Џ q\_]R +zZQ>3jQÉ(cF̬BYB-yFvrQYc? PCt8|];_ svXV +P٭o)1[H>fo]HL@c9w ttW#0*-ZDx}n;,^y{Rn] *j^D;b0 7 63&7*}QxoɶR^dte3a(ԍʛ?ߚW♰\#zz>% T,ȦRkYp\V$PUઐuAXcg{ .uU69WDԶ,|=?_xb}N@;|P%})A?zR!@@P?t@Jy1P{mS̔eYZ^w^1*| ֊9L'd !P'hKh70b:lf'bYykxDm1mx*|u'8B@(čbJJc~0y7ŏz #9{khA׿Y&Y7NU6S@cFLRz}n@*&d^O?bF4k@~O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?O~'?YMwmkBT,x9KW駰IjRB&I'YQ[S .X(۸9_1a E<ü sq*ZJ899X '  Շ455V?Ŭaii)dajj*/?Z[[k?_꾶VWW0==>紁 ϟl677mτtoonnFr(ooo,]omm=,,,?_Ewaoo/-,//^0_/I8==ͷ(=-3Bgˡ~~...y>;;Y077?#9///|3!/x]rxz___,]7BA</|{{pwwoK8rz:iK_ݟǬb/_=_jcgCV9v_Sџ~TXmkBT}xJAKq#E#7P<X-% 2/𑁙zl40쇳pNy8 PY 걙90 9lO<8κ`ٷ|Z%;r AfYr?ʿ eνU~N: ̾Mޓzr9kHewE7u83mx&P<({ 0ޠmkBTypx흍) q ĉ8D^>׻gI@XjjgiЃ`0 `0 ?ϟ|:seQ3|ӧO|:2|.};7eGFO6_Qv]T]^ˮg{>pjzkuo{yye?{-x/ D:3D&򈼹e^Hyi#/OGzϪ߯_~ :sMe#M3Y#=2 QЙ[\s=E8}E>GȩT ڲTg-}VfoSVwzV}./>~!?U1<#}=F[ ~QڋBN..+푹^edLo+[\-k dW(}6q$#?z6Bөi?L7!3O_Q}Пuo[=tkȋM!'}/Ƈdr2_Cﲨ: `0 :8o=+8-4}۞cĥXdq{bUq©ήm!ƶg*ΪU\z[GA=^+ru{LV U?)V>ғ)x|Yҁgi\yi^cUo*= !TY?rfgWsʽVn*VX#=Fϫ+[F~yH\L~[O҇h5ݵTow|Sfӟ+);F;:x )/OS yUo2e)Ve3'wgGg=J^`0  ľu kU,Ksؑ5nY,bXw{ w&3QהNQev ]ƷgcH˞i{A3I8hwduwUIWq8I>+@pQşGcZ\ƪUߝ]/:3d;ɫ:gB9R|GW~w2;fzt|+i5nΟgZY|<1NyŬ|E7k?z/k><=Α}N΅>uWydʬdz `0 *\?W8GY:Dgcg< 2+'W6qn؟{ru"wU쏘~c#T?+y{Q,,^qF/Xv8.֩g3}ȸOP ~n%hUG4(_sn|W}Tg&x^c,Fѭ+ <#+}/Uw8BRh_|33!mr\7U9m({ѝpvew[xG]߱?g;,nҽow8]וb?OV=Z_#ve?vN_WrYLo;1g9pV^G~>[_vNOS3 `0Q[ veO\k^8֔v<Zbz\Opbn$~}oz3ј mK vU]^iNWA#x딫jt q :E= z%օq)CcYEqyRG-+u (K\hP'*^ء^q=m=y|Kvūe\rȊ4={W1;=ݷxp;o@>ȘT\Ԏ+C=*ɫ|GJOCW]x1.ﵠ9_Eб Vq)v(ʑ}[GwǺ{-oSdו_˞׃2;iT&w*w:g׭SOsj%Z[~_˯d֮+w]7 `0]kIu+eL]ւoA^;=GR?v쯱;<y o$N1紈=:ߥPVu< <&3KyC/4r)i=*/|Ύ^]QNН1qGw>ù{ ?Kv:A}E:_n+{u=rq͓̳]>>d}+|L01`0 leg:׺񶊝`W,3O?]\9P~[kOWiGc~)-<w.3q}'vuw$Vnv(r52S;Wk_Kϔ8B/hEՠ'9w?K;x:x<|@cϽVyc@ۖSw8Bq]=2lBe6V}eR( VeZT4ade2ޒ+nYBTqSߔ<[&=f[|szP)G}{Zׅ3n7jpWwftEw[ǽ;`l? `0 `0 `{~i`oLy>uoi\qK|}7Svu9G쯿c¾#>,jow{ՆݲL=mW2u_8دjo?kD߱mw>#}E:OۡO;y`$jg mkBT} x흍8 FSHI!)$FRHnw HYx3ꇤsaaaaxIǏ'U{o_ھgW9 o'GW {>~Jlo߾)*/N\ϱov[iZ_ձaJΝ/:6O- 92b?Tlk%?_21B sY5>:>c=1Ow y^- ڶ,XzusM#גU]>H_yYv!ۉ_mi Rus]Xm_g)YY)m]y,m z1aaaxEߓGקo/Y\k6xjgH|yu.\aæM&wk#ϐ$?]Mo\Ⱦ,/ڥQ@~6s?)}, l gX #vQg Bٙ^uのuhm?}{].~}v_J;xogJY]޳@.)oqC?}>@Xߘ'-(W? źvƔOʙRv[K?[A}?-wmՑ}g\=c}M ggg DŽ-B^k_g?F? v0||؎=ǧHPgs/hؑI t~{n^}ZyD5XWvO)"c0vY Z|~_%/,p\ɹyΰZ/;/xs_9?Pܯ5ݻ\[y|č8gʱL{? 0 0 _k3>z_\S |<)b|7aaaxn.ta?l^Cvkؽ#~e)3<3^kdlc&jK+o"e<.ʞ`^(3zu l+6v<ï k7]/lc[`On}򚄫 G뎱zt^v2)?;Wmr5ocIz?Ozx{&!ez."ѯ 1Gg{+ҏlw<=}GݽFƨ^)zIpG K֜{{e G12ۭqiumf>.}~a? 0 0 [u+7Svq֭y΅ ?ނ}XwŶv?ߩDZۓ-q/?߳=<~#>Fk"qzrQo 9r,nY[;o:)@-`ק-7({߯S@µK9֠ɸ>:n3 _[_*mtcmC>qSL=<6;ǫsaaa{xˌ\ފpx?0׋#5zяc]x^l򼠕(f:~٣^lin59W~\;?vn6erUbS~v^U O7O(|;+SG4|?f*?rW~2oNٟS9~daևmH6mX[J~s.ym4ٶO|Bd/b5ɿyU? 0 0 0 0 0 0 0.P~*1@G\⟿KrKXs2(ߥ纎J8'>X@▼QQbqwx b)_K|v 1M6kee-2Ǜ59?K^E~9ϱQﱮYF8N?~;:=J<-tĒyNAgC \NXKs)'^Kg\~2}6}Գ)n]Or^j~"{p29w6/.z-v:+M{WJYZ굢`% Ҥl9ힶկ#OUz+U?;sd~vND7*.Y+v:ye;8}~|+ÑޅN9}{Bƞ#txխsXɿkSV/uJ=o G<ջL'L:D]6jfgLz/+ؽ[{rCMYq~[{yy czA;w9zszWHVax3 Q!/fmkBT} xڍm0aaAXAtNuө~"B~v(I$Ic i#Gl6p8޾s[ouv?Ru߯+fԍ^|}m43ϭu!Z9RUY׽B,z"|~>/|RתY̞EGߔ뙷L?:fV\꺯Pv#R>cNb=^Fz=yNI}.3?3̥*Ǫ7٧ڞƵ2~zWİg#g&2yK;wʞ2vm"Ggʼd~g<[şXlk=^k͞Gy\ׇ3M^&}V3=3ڣ<_(녾v9> G@Sǿ99Gy*"QYu*lz;{-/9v=Q_s>c),k:gQ%ԝ,SFwA2vWcWqlׯ[},g7F}.2˘ڳsvvt888 IX__x =pzzt!INNNPJq||LV(p۶Y[[{neY4 (b,//swwQ<O\.|>eYA9,--!0 S00(x?٦jXYY,J)h5 0T*]{LOO377;;;4;5I LLL022aeYz= @)EXdttTgJ)B0 0p,WJ1<a\=^¹ײiu7=Ƽƻxa-PMͿ"6̿w߽GQrTzi躚Ķ}nlsdϊ]ޛ̼~ê#)º͜qҺξєͨΚɴʇbȷiѻxtܚj ì}鿄ij;iݗǿ ^ͳ!ˇʹԟE伜 ֽ"ų÷ 8ƪ ܣ² ȶʲ=ږ Ѵy ɩ ϳ*Cٿ ݥ ҿ﷝ȨРŻ ظ06г 帥ɿҹıϽ Ҧ Դڕ۫ǥ Ĩߐ ɫWdʣ $Yİ๧ݑϵ^$#ǯⳬޒ ݽi@dy}2ֻ Я6ձ|ļ~аi,L M{=.¼ٽڂڵH E#ĮյˮSxןLdٷѠȱϵ!˱l素"ayբٰx8)߄׿% |DZҿ޾ NցP ~ʣǾ KګޖٿP%/]⽡k߀㭭ƫŘ:nLj[\!,Ӻ̮Ő\QSu Ͽ¹֝CPҿ ߕ77DIkx뷡!H{MwX!ǖt="hú ٸl.Yu`۽   ]  '0nrDiɿ#ൠŷ#ޙ:3·jEDνrk`ƻAsr$ʽ[ù@ʽlĹ9пcȼLøQ ̽HB:!ƻqX\TII(]RX^baSQ4'2ɽvJMRW]cjn^WO $¸hJLNRV\clszr`e-˽HJLNQTX]dku}sqX!øoNMMPRUX[`elu{xͿ=K`^\ZZ\`eiovC2] OgqpnlotzvTfƯuĦQ uױ ŭ ճk澯^ · ¸ ¸¸µɾ$µ\ſſͿſ뺾$ſŻ #»ٽ»» ۀޒʿڐ ⽧ ʹ罫ێpȶὖڃ ʹؼ ,̸ֺ˴ջ؅#俫Զˬа҂ҸˁȾ*϶¹DZޮİȱÀ ޽s)ưԨǻϬǰހۺ\'޼ΰƭ݀ ݴ)ʺȒاyŽھ⵴̿'ǫϪ}³ʸ伫Ėɛ溦&ڣãשҷ̨oΩs$˹Ȯҿ°ɜزº6Ŷٱșmܳϥzͣ8ǽШ޺}}֧ϩnū7ǮĀɳΌтqڣ5̭ȉΆhٝǿ5Ƶ˙}оsW⸛⼦4vyd˼ՏW3ĺc̞^]۩'ƽѸņmtͿ2ͼļŗ|j?a軎nm‰@y¹šwy覆ĺBۿÿƿwlj_ܑx۽CçɢĽ¸½{v^J^em赉ɾ]Ͷ¯)ĻvʰsFhmOڅjɻ$ξç΀}۳gb~谁̻ɿGȾxŶŵy^gɉq׵|λ㺗F¹oѼ̦|pkբQRмEǺtȿ»åo`}㪿CȹxѲɾåy[gXYA|ҿȢľűa2m㹓︘ȺкùʻζlTXq¶o!ŵƲ2!Ǿ˻s ¾Ŵvqཙ=÷wýΏ>`\X̽|ہ)ֱiu7=ŷŻw`-OLͿ"3Ͼl޼GQqSyh躚ǵrnkscΊ]ݛѾw~©#)ºdz{̜qѺͽГ̧͚ҼɇaǶiƭntۚj ѷr较IJ;iܗǿ Yçw!ʇɸӞD伜 α|"IJ¶ 3ؼ ۢ ǵɲ=ٖ ɩn ȩҿ β)Cӵu ܤ Ѿ﷝}ϟŻ ׷06ʪ ䷤Ⱦѹı~ȶ ѥ ӳٕ۫y èސ ȪVdɣ $Uÿ߸ܑδ^$#ǮᲬݒ ܼi@cy}-պߕ ϯ6հ|û}ϰi,L L{=,ؼقٴG D#z~íԴʭRw֞Kd}ضПDZδ!ʰl素"]nԡذw8)ބ־% sƱҾݽ NՁP }ɢǾ Ez٪ݖؾP%/\⽡dހ⭬Ūŗ:mƈ[\!)ҹ˭Ő\PSt ξ՜B~Pҿ Ŀؿޕ67DHjw뷡!HzLvX!ƕt="hú ٷl.Xu_۽   ]  '0n߼rChɿ#ߴŷ#ݙ:3·jECνrk`ƻAsr$ʽ[ù@ʽlĹ9пcȼLøO ̽C;6!ƻnUYPBC(XNT[_]MJ1'2ɽrDGLRY_fkXNI $¸cCEGKPV^gowmV]+˽BCEGIMQU]eoxifR!ølIGFIKNPSW]emyonͿ9E][WSRTX\`fmxzA2] HcnkgdejpxnN^}}kκL nÿϢ ڹvˤdްY· ¸ ¸¸µɾ$µ\ſſͿſ뺾$ſŻ #»ٽ»» ڀݒʿِ ⽧ ̳漪ڎpǵ༖ك ɸ׻ ,˷չʳѿԺׅ#㾪ӶʫϯтѷʁȾ*εưݭïDZ€ ޽s)ƯӨƻϫƯ݀ڹ\'ݻͯŭ܀ ܳ)ɹǒקyĽٽᴳ̿'ƫΪ}ʷ㼫Öț溦&٢¢֨Ѷ˧oΨs$ʸǭѿ࿤ț~ױº6Ķٰǘl۲Τy̢8ǼЧݹ}}զϨnĪ7ֿƭȲ͌Ёp٣5ˬLjͅh؝ǿ5Ŵʘ|нsWᷚ⼦4̿uxcʼԏW3ùc˞]]ڨ'żиŅlsͿ2̻üė{j?M纎ml@khTpwy祅ĺBc}zھ¾žvli_ېx۽Cmmȡüzu]J^dl紉Ƚ]s~y_)ûvɯsFhmOلiȻ$xxø~jW¦̀|ڲfa}篁˺ɿG|lȾqdVWĵŴy]gȈpִ|ͺ㺗Fpп|tmdXJл˥㿐{oߣjԡQQϼEmͷyurme[Mǿ¤n`|⩾C{ɺxtsog]PбȽǿ¤y[gXYArĪ}vtoi`RѾǢýİa2m⹒︘{uùxtpjaUhϹ¸ɺ͵lSXqyǮvqlcXJ!ŴŲ2!ǾimƽzsmeZL߀ ijupཙ=}ȱuog\O¼͏=`\Ghzpi_Rπ)հht7={ɴsjaUeĺw`,OLͿ")m¨ymcWHݻFPqSyh躚|{ɷpeZKmkrb͉\ܛqūwi\O}׿#)ºvpϺl_Q˛pй̼ϒ˧̚yǭtbUvȆaƵhghƽ~hXIsϿڙi {ʮp[L罂ò;hۗǿ Gk{aO!ɆȷɿҝD伜 |ʭjS"IJҿ +nvY ڡ ƴȱ=ٖ {zɪcK ǨѾ Ͳ)BqnR ۣȿ н﷝vo}[ϟĺ ֶ05uf 㷤ǽиıfmt Х Ҳؕ۫u] §ݐ ǩVcɣ $Cej¾޸ۑͳ]$#vvyƮᱫܒ ۼi@cx}&aԹޕ Ϯ6԰|odº}ϯi,L L{=#`~׼؂ٳG D#`[¬ӳɬRw՞Kd"\h׵Ϟưγ ɰk素"JNӠׯw8)݄ս% TŰѾܼ~ NԁP |ȡǾ 9bتܖ׽O%.\⽡L݀ᬬĩĖ9mŇ[\!!Ѹʬď[PRt ͽԛB~Pҿ þ׿ݕ67ſDHjw뷡!HyLvX!ŕs="gú ضk-Xt_۽   ]  ߠ&0n޼qChɿ#޳ŷ#ܘ:3·jDCνrk_ƻAsr$ʽ[ù@ʽlĹ9пcȼLøI ̽3()*ƻeKPB.1(wH=FNUP95''2ɽd.28?HQ[`D59 $¸R-.04:BLWakZ:D#˽t,-./137=FP\itnMGA!øa61/02358;AJUcp~eLUͿ+5SMD<87:=AGO[iy}T^42] 2UaXMFDGMUape^W V[wlj i½“lv_eϫwuPyņolGhgx{ut8mk@>>>> > X X X#XE q q"q'qu !q!q$!q*!r   & ^   )k" /I) 2Ou  2O /K%*EE&?^  ":Y! 5S' 0L^ ' +G  &A`# $)";Y)   6)5S  72  1M  81 +G' <='A`F  :A #<[  GE 6U#   S8 1N(  /S -v  L=L  6W $  &V0 D "'YV  !+EFq! 'P~=' :o+^ C8 "  ;K # CtB).{L!   2{J# 86i<&4%uA) +EE 5Q;+!8y Ne6+ *C"HF6(5c'*54' (@u  tj;6$2L RO/76 &=$ y*=3 /I*%-+-:B.$; Wp)B@$  -G  8mH7I9"8z& %@B) +D^ ~7G66d m0&0E?$  (A"8)GM22L)Qg:O7=K= &=v/:M>  0IcDJ4:JF*$;AXO0 -H3AUV>"8}@RcV9  +F\aZ>  8kwW4  *H@9m**K$ dD 5W -M!'Di'"<`q+ 6Vɚ}eH.  0Oڶt_F, +Hɪ~teS=' 'Aa~xsmf\O@/";[ֺ|vqjd]VOG?5+ 6SԮytnhaZSLE?82,&   1Nл~wrke^WPIB<60*%  ,H}vpib\UNG?93-(# 'BaƾzphaYRKD=71+&! #<[ĻwmbYPIA;4/)$ 6Uxj^SIA92,'"  1NŽ{l^PE;2+%   -HrbSE9/&  (Ct¼{kZK<0% $=\ýveTE6)  8V罸saP@1$  2Pp_N=/"  -J̯q`N=.! )Ct߿૦rbQ?0#$0# /=GLLG@;88?L^򭟛sdSC4'  '.1/+&!&3FʠwiYI:+   /Hᡞ|n^N?0#  "8z𦝛sdTD5'  +DӈxiZJ:,  5Nfx{o`P@1$  '=SdlkcUE6( ->LSPH;- *486/$   " contextfree-3.0.5+dfsg1.orig/src-osx/GrammarTextView.mm0000644000175000017500000000214412076364074021461 0ustar brambram// GrammarTextView.mm // this file is part of Context Free // --------------------- // Copyright (C) 2005 Mark Lentczner - markl@glyphic.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // Mark Lentczner can be contacted at markl@glyphic.com or at // Mark Lentczner, 1209 Villa St., Mountain View, CA 94041-1123, USA // // #import "GrammarTextView.h" @implementation GrammarTextView - (void)changeColor:(id)sender { // do nothing! } @end contextfree-3.0.5+dfsg1.orig/ContextFreeCLIVS11.vcproj0000644000175000017500000002761112076364074021066 0ustar brambram